Skip to Content

HTTP POST  method: http://scn.sap.com/community/abap/connectivity/blog/2014/11/09/calling-an-external-restful-service-from-abap–http-method-post


I have made inline code explanation. Please go through step by step description.


Scenario: GET operation to access: http://hostname.com:55400/vendavo/rest/agreements/XYZ


1) Create a RFC destination of type (HTTP Connections to External Server)


RFCDEST.JPG

content-type: application/json


DATA: lo_http_client     TYPE REF TO if_http_client,
         lo_rest_client     TYPE REF TO cl_rest_http_client,
         lv_url             TYPE        string,
         lv_body            TYPE        string,
         token              TYPE        string,
         agreements         TYPE        string,
         "Create a structure(or deep) that exactly matches your JSON response
         abap_response      TYPE        zca_serno_ln,
         lo_response    TYPE REF TO     if_rest_entity.
* Create HTTP intance using RFC restination created
* You can directly use the REST service URL as well
   cl_http_client=>create_by_destination(
    EXPORTING
      destination              = 'VENDAVO'    " Logical destination (specified in function call)
    IMPORTING
      client                   = lo_http_client    " HTTP Client Abstraction
    EXCEPTIONS
      argument_not_found       = 1
      destination_not_found    = 2
      destination_no_authority = 3
      plugin_not_active        = 4
      internal_error           = 5
      OTHERS                   = 6
  ).
* If you are using cl_http_client=>create_by_url use this code to supress and pass your
 * HTTP basic authenication 
 *  lo_http_client->propertytype_logon_popup = lo_http_client->co_disabled.
 *  DATA l_username TYPE string.
 *  DATA l_password TYPE string.
 *  l_username = 'user'.
 *  l_password = 'password'.
 *  CALL METHOD lo_http_client->authenticate
 *    EXPORTING
 *      username = l_username
 *      password = l_password.
* Create REST client instance
   CREATE OBJECT lo_rest_client
     EXPORTING
       io_http_client = lo_http_client.
* Set HTTP version
   lo_http_client->request->set_version( if_http_request=>co_protocol_version_1_0 ).
   IF lo_http_client IS BOUND AND lo_rest_client IS BOUND.
     DATA(id) = 'XYZ'.
     CONCATENATE 'agreements/' id INTO lv_url.
* Set the URI if any
     cl_http_utility=>set_request_uri(
       EXPORTING
         request = lo_http_client->request    " HTTP Framework (iHTTP) HTTP Request
         uri     = lv_url                     " URI String (in the Form of /path?query-string)
     ).
* Set request header if any
     CALL METHOD lo_rest_client->if_rest_client~set_request_header
       EXPORTING
         iv_name  = 'auth-token'
         iv_value = token.
* HTTP GET
     lo_rest_client->if_rest_client~get( ).
  
* HTTP response   
     lo_response = lo_rest_client->if_rest_client~get_response_entity( ).
  
* HTTP return status   
     DATA(http_status)   = lo_response->get_header_field( '~status_code' ).
  
* HTTP JSON return string   
     DATA(json_response) = lo_response->get_string_data( ).
* Class to convert the JSON to an ABAP sttructure
    DATA lr_json_deserializer TYPE REF TO cl_trex_json_deserializer.
    CREATE OBJECT lr_json_deserializer.
    lr_json_deserializer->deserialize( EXPORTING json = json_response IMPORTING abap = abap_response ).

To report this post you need to login first.

7 Comments

You must be Logged on to comment or reply to a post.

  1. Sunil Khemchand

    Hi Amaresh,

    I have similar requirement, ie., calling an external restful service running on an external amazon instance, and I am trying to following the steps you have described above. But, I am having an issue with RFC destination. No matter what target host I provide, either valid or invalid, the “Connection Test” always returns success( http status 200 OK), but the method GET always returns an error.

    Have you encountered this before? Is there any other way to test if the RFC destination i have defined in SM59 is the correct one?

    Appreciate your earliest reply.

    Thanks

    Sunil

    (0) 
    1. Amaresh Pani Post author

      Hi Sunil – Are you able access the service from your browser? Also

      Have you tried the other option by providing the REST URL directly as I have explained above (as below) instead of going SM59 route?

      1. * If you are using cl_http_client=>create_by_url use this code to supress and pass your  
      2. * HTTP basic authenication   
      3. *  lo_http_client->propertytype_logon_popup = lo_http_client->co_disabled. 
      4. *  DATA l_username TYPE string. 
      5. *  DATA l_password TYPE string. 
      6. *  l_username = ‘user’. 
      7. *  l_password = ‘password’. 
      8. *  CALL METHOD lo_http_client->authenticate 
      9. *    EXPORTING 
      10. *      username = l_username 
      11. *      password = l_password. 
      (0) 
  2. Ghulam Naimuddin Khan

    Hi Amaresh,

    I am using Solman system where the class ( cl_rest_http_client ) mentioned in your post does not exist in my system probably due to lower level patch.

    My requirement is similar to this post, is there any other alternative class or others ways available to achieve this.

    (0) 
  3. Juan Lee

    Hi.

    I have ws that return 2 sets of data: a simple result string and tables of entries as shown here.

    is there a way to retrive the data based on the JSON string ‘RESULT’ or ‘OUTTAB’?

    I would to just capture RESULT to check message is sucessful -> import table into lr_json_deserializer.

    thanksCapture.PNG

    (0) 
  4. SAP Seeker

    Nice blog Amaresh.

    I tried to implement something similar but unable to get data. Also, without passing the password, is there any option to authenticate ? In your blog, can you explain where did you get the token from ?

    Thanks.

    (0) 

Leave a Reply