HTTP GET Method: Calling an external RESTful service from ABAP - HTTP Method GET
POST operation is almost equal to GET operation as my previous blog. Please refer my previous blog for more inline code description.
In POST operation we need to set a payload (JSON or XML) during the operation.
Create a RFC destination of type (HTTP Connections to External Server)
Scenario
HTTP POST URL: http://hostname.com:55400/vendavo/rest/salesorder with Header Authentication token
Request JSON: '{ "salesorder":"25252525", "type":"Direct"}'
Expected Response JSON: '{ "token":"CONFIRM7391797"}'
Code:
DATA: lo_http_client TYPE REF TO if_http_client,
lo_rest_client TYPE REF TO cl_rest_http_client,
lv_url TYPE string,
http_status TYPE string,
lv_body TYPE string.
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 OBJECT lo_rest_client
EXPORTING
io_http_client = lo_http_client.
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.
lv_url = 'salesorder'.
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)
).
* ABAP to JSON
TYPES: BEGIN OF ty_json_req,
salesorder TYPE string,
type TYPE string,
END OF ty_json_req.
DATA: json_req TYPE ty_json_req.
json_req-salesorder = '25252525'.
json_req-type = 'Direct'.
DATA lr_json_serializer TYPE REF TO cl_trex_json_serializer.
CREATE OBJECT lr_json_serializer EXPORTING data = json_req.
lr_json_serializer->serialize( ).
lv_body = lr_json_serializer->get_data( ).
* Or you can use this class as well
* lv_body = /ui2/cl_json=>serialize( data = json_req ).
* Converted JSON should look like this
* lv_body = '{ "salesorder":"25252525", "type":"Direct"}'.
DATA: lo_json TYPE REF TO cl_clb_parse_json,
lo_response TYPE REF TO if_rest_entity,
lo_request TYPE REF TO if_rest_entity,
lo_sql TYPE REF TO cx_sy_open_sql_db,
status TYPE string,
reason TYPE string,
response TYPE string,
content_length TYPE string,
location TYPE string,
content_type TYPE string,
lv_status TYPE i.
* Set Payload or body ( JSON or XML)
lo_request = lo_rest_client->if_rest_client~create_request_entity( ).
lo_request->set_content_type( iv_media_type = if_rest_media_type=>gc_appl_json ).
lo_request->set_string_data( lv_body ).
CALL METHOD lo_rest_client->if_rest_client~set_request_header
EXPORTING
iv_name = 'auth-token'
iv_value = token number. "Set your header .
* POST
lo_rest_client->if_rest_resource~post( lo_request ).
* Collect response
lo_response = lo_rest_client->if_rest_client~get_response_entity( ).
http_status = lv_status = lo_response->get_header_field( '~status_code' ).
reason = lo_response->get_header_field( '~status_reason' ).
content_length = lo_response->get_header_field( 'content-length' ).
location = lo_response->get_header_field( 'location' ).
content_type = lo_response->get_header_field( 'content-type' ).
response = lo_response->get_string_data( ).
* JSON to ABAP
DATA lr_json_deserializer TYPE REF TO cl_trex_json_deserializer.
TYPES: BEGIN OF ty_json_res,
token TYPE string,
END OF ty_json_res.
DATA: json_res TYPE ty_json_res.
CREATE OBJECT lr_json_deserializer.
lr_json_deserializer->deserialize( EXPORTING json = response IMPORTING abap = json_res ).