Home > Products > SophiaFramework UNIVERSE > Tutorial > Amazon E-Commerce > - 6 / 9 -

Processing REST and SOAP Request

Processing REST Request

The REST request processing has 3 steps:

1. Passing parameter keys and values in a URL

2. Making a call to ECS

3. Obtaining the response in XML format

SFXHTTPConnection class is used for REST connection. In the source code below, _http is an instance of SFXHTTPConnection class.

SFCError SGRNetworkDialogSet::Connect(Void)
{
 SFCError error;

 // access by REST
 if ((error = _http.Open()) == SFERR_NO_ERROR) 
 {
  if ((error = _http.SetMethod("GET")) == SFERR_NO_ERROR) 
  // Make a call to ECS and get the response by callback function
  error = _http.Connect(_url, CALLBACK_FUNCTION(ConnectCallback));
 }
	
 //notify if error occured
 if (error != SFERR_NO_ERROR) 
 {
  _spp(NOTIFY_CONNECT_START, error, _reference);
  SGRSoftkeyToolbox::CloseStandardDialog(_dialog);
  _errorDialog.Open(HTTP_ERROR_TITLE, 
                    HTTP_ERROR_CODE1, 
                    DIALOG_OK, 
                    this);
 }
 return error;
}

Below is the implementation of the ConnectCallback function.

CALLBACK_IMPLEMENT_SFXHTTPCONNECTION(SGRNetworkDialogSet, ConnectCallback, error)
{

 TRACE("CALLBACK_IMPLEMENT_SFXHTTPCONNECTION");
 if (error == SFERR_NO_ERROR) {
  // Get the stream reader
  error = _http.GetStreamReader(1024, &_reader);
  if (error == SFERR_NO_ERROR)
  // then get data using callback function
   error = _reader.Fetch(CALLBACK_FUNCTION(FetchCallback));
 }
 
 // notify if error occurred
 if (error != SFERR_NO_ERROR) {
  _spp(NOTIFY_ERROR, error, _reference);
  SGRSoftkeyToolbox::CloseStandardDialog(_dialog);
  _errorDialog.Open(HTTP_ERROR_TITLE, 
                    HTTP_ERROR_CODE2, 
                    DIALOG_OK, 
                    this);
 }
 
 return;
}

Below is the implementation of the FetchCallback function.

CALLBACK_IMPLEMENT_SFXBINARYSTREAMREADER(SGRNetworkDialogSet, FetchCallback, error)
{

 TRACE("CALLBACK_IMPLEMENT_SFXBINARYSTREAMREADER");

 SFXBuffer _tempBuffer;  

 if (error == SFERR_NO_ERROR) {
  // get a chunk of data
  _tempBuffer.SetSize(_reader.GetReadableSize());
  _reader.Read(&_tempBuffer);

  // _string holds the returned text in XML format
  error = _receivedBuffer.Add(_tempBuffer);
		
  if (_reader.Ends() && _reader.GetReadableSize() == 0) { 
   // if no data remains
   
   // close the connection
   _http.Close(); 

   // close the dialog
   SGRSoftkeyToolbox::CloseStandardDialog(_dialog);

   // notify the application
   _connecting = false;
   
   //DBGPRINTF("Network connect end...");
   _spp(NOTIFY_CONNECT_END, error, _reference);					
  }
  else { // if there is remaining data, fetch again
            _reader.Fetch(CALLBACK_FUNCTION(FetchCallback));
  }
 }
 else {
  _http.Close();
  SGRSoftkeyToolbox::CloseStandardDialog(_dialog);
  _spp(NOTIFY_ERROR, error, _reference);
  _errorDialog.Open(HTTP_ERROR_TITLE, 
                    HTTP_ERROR_CODE3, 
                    DIALOG_OK, 
                    this);
 }
 return;
}

Processing SOAP Request

The SFXSOAPRPC class is used for SOAP request. This class accesses to the ECS by making a remote procedure call.

The return data in XML format is then parsed by the SFXSOAPParser class.

Developers can access to the elements such as the header, the body, the fault of the parsed XML document tree through the instance of the SFXSOAPParser class.

The source code below shows how to use SFXSOAPRPC class to set parameters and get the body element of the XML document.

SFCError SGRSOAPDialogSet::SOAPConnect(Void)
{
 SFCError error (SFERR_NO_ERROR);

 // set method name
 _rpc.SetMethodName(_params->operation);

 // set SOAP EncodingStyle	
 _rpc.SetEncodingStyle("http://schemas.xmlsoap.org/soap/encoding/");

 // set target object URI
 _rpc.SetTargetObjectURI(TARGET_URI);

 // set AWSAccessKeyId
 error = _rpc.AddParameter("AWSAccessKeyId", 
                           SFXBuffer(SFXAnsiString(AMAZON_ID)));
 if (error != SFERR_NO_ERROR) return error;

 //
 // set method parameters
 //

 // set request parameter
 error = _rpc.AddParameter("Request", 
                           SFXBuffer::EmptyInstance(), 
                           SFXSOAPRPC::PARAMETER::UNKNOWN);
 if (error != SFERR_NO_ERROR) return error;

 // set SearchIndex parameter
 if (_params->_set_search_index)
 {
  error = _rpc.AddParameter("SearchIndex", 
                            SFXBuffer(_params->search_index));
  if (error != SFERR_NO_ERROR) return error;
 }
	
 // set BrowseNode parameter
 if (_params->_set_browse_node)
 {
  error = _rpc.AddParameter("BrowseNode", 
                            SFXBuffer(_params->browse_node));
  if (error != SFERR_NO_ERROR) return error;
  }

 // set ResponseGroup parameter
 error = _rpc.AddParameter("ResponseGroup", 
                           SFXBuffer(_params->response_group));
 if (error != SFERR_NO_ERROR) return error;

 // set Keywords parameter
 if(_params->_set_keyword){	
  error = _rpc.AddParameter("Keywords", 
                            SFXBuffer(_params->keyword));
  if (error != SFERR_NO_ERROR) return error;
 }
	
 // set ItemId parameter
 if(_params->_set_asin)
 {
  error = _rpc.AddParameter("ItemId", 
                            SFXBuffer( _params->asin));
  if (error != SFERR_NO_ERROR) return error;
 }
 
 // make a remote procedure call 
 // and get the body elemnet by SOAP_Notify function
 error = _rpc.Invoke(END_POINT_URL, 
                     SOAP_ACTION_URI, 
                     SOAP_Notify, this);
 return error;
}

Below is the implementation of the SOAP_Notify function.

Void SGRSOAPDialogSet::SOAP_Notify(SFCError error, 
                                   const SFXSOAPRPC::Params& result, 
                                   const SFXSOAPRPC::FAULT& fault, 
                                   SFXSOAPParserConstRef soap, 
                                   VoidPtr reference)
{
 static_cast<SGRSOAPDialogSetPtr>(reference)->On_SOAP_Notify(error, result, fault, soap);
}

Void SGRSOAPDialogSet::On_SOAP_Notify(SFCError error, 
                               const SFXSOAPRPC::Params& result, 
                               const SFXSOAPRPC::FAULT& fault, 
                               SFXSOAPParserConstRef soap )
{
 // if error occured
 if (error != SFERR_NO_ERROR) 
 {
  _spp(NOTIFY_CONNECT_START, error, _reference);
  SGRSoftkeyToolbox::CloseStandardDialog(_dialog);
  _errorDialog.Open(SOAP_ERROR_TITLE, SOAP_ERROR_CODE, DIALOG_OK, this);
 }
 else// if success
 {
  _body = soap.GetBody();

  // close dialog
  SGRSoftkeyToolbox::CloseStandardDialog(_dialog);	

  // redrawing
  SFRApplication::GetInstance()->Invoke(
                                      SFXEvent(SREVT_RESPONDER_RENDER, 
                                      SRP16_RENDER_INVOKE, 
                                      false)); 
                                     
  // notify the application when connection end
  _spp(NOTIFY_CONNECT_END, error, _reference);
 }
 return;
}

Go back  1   2   3   4   5   6   7   8   9  Next page