Calling an external RESTful service from ABAP – HTTP Method GET
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)
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 ).
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
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?
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.
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.
thanks
Thanks, Amaresh, really useful!
Is there any way to trace the outgoing generated HTTP request and watch its content?
Hi Agu - You need trace them at ICM level.
Amaresh Pani
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.
Hi,
I need to send three form-data parameters (username-password-email) to the web service. How can I send these parameters? I have to use get method like in this solution.
Kind regards,
Hi all,
I bumped into a situation where with a GET method my client app receives chunked data ending in a form :
Hi Amaresh,
I'm getting status code - 404 on receive method
The code is implemented but found it returns only 1 entity. 🙁
Confused what is wrong, I took to SMICM log too. I took the URL to Postman but found 5 records for $top=5 keyword but ABAP returns only 1.