CRM and CX Blogs by SAP
Stay up-to-date on the latest developments and product news about intelligent customer experience and CRM technologies through blog posts from SAP experts.
cancel
Showing results for 
Search instead for 
Did you mean: 
JerryWang
Advisor
Advisor
In this blog, I will demonstrate how to create a new Opportunity by consuming C4C standard OData service via ABAP code.

The related OData service for Opportunity with detailed explanation on its entity types could be found from SAP help:




I will use a HTTP POST request to finish the creation. A example about how to organize post body could be found from C4C OData development guidelinewhere ServiceRequest is used for demonstration. I just make minor changes to make it also works on Opportunity.
First I test it in postman to ensure the successful creation:



I paste my http request body text here for your reference:


--batch_1
Content-Type: multipart/mixed; boundary=changeset_1

--changeset_1
Content-Type: application/http
Content-Transfer-Encoding: binary

POST OpportunityCollection HTTP/1.1
Content-Length: 5000
Accept: application/json
Content-Type: application/json

{
"AccountID": "8000018122",
"OwnerID": "8000018122",
"Name": {"content": "Testing ticket creation via OData Jerry1"}
}
--changeset_1--

--batch_1--

And a new opportunity could successfully be created in postman:



Now all I need to do is just to translate the activities I have done in postman into ABAP code.

I wrote an ABAP report to create Opportunity by consuming OData service:


zcl_odata_tool=>get_csrf_token_and_cookie( IMPORTING et_cookies = DATA(lt_cookie)
ev_token = DATA(lv_token) ).

zcl_odata_tool=>create_opp( iv_token = lv_token it_cookies = lt_cookie ).

Execute the report, new opportunity could be created and found in system:



Source code for ZCL_ODATA_TOOL:


CLASS zcl_odata_tool DEFINITION
PUBLIC
FINAL
CREATE PUBLIC .
PUBLIC SECTION.
CLASS-METHODS get_csrf_token_and_cookie
EXPORTING
!et_cookies TYPE tihttpcki
!ev_token TYPE string .
CLASS-METHODS create_opp
IMPORTING
!iv_token TYPE string
!it_cookies TYPE tihttpcki .
PROTECTED SECTION.
PRIVATE SECTION.
ENDCLASS.
CLASS ZCL_ODATA_TOOL IMPLEMENTATION.
METHOD create_opp.
DEFINE insert_line.
lv_body = lv_body && &1.
lv_body = lv_body && cl_abap_char_utilities=>newline.
END-OF-DEFINITION.

DATA:lo_http_client TYPE REF TO if_http_client,
lv_status TYPE i,
lt_fields TYPE tihttpnvp,
lv_sysubrc TYPE sysubrc.

CALL METHOD cl_http_client=>create_by_url
EXPORTING
url = 'https://<your C4C host>/sap/c4c/odata/v1/c4codata/$batch'
IMPORTING
client = lo_http_client
EXCEPTIONS
argument_not_found = 1
plugin_not_active = 2
internal_error = 3
OTHERS = 4.

ASSERT sy-subrc = 0.
lo_http_client->propertytype_accept_cookie = if_http_client=>co_enabled.

CALL METHOD lo_http_client->request->set_method( if_http_request=>co_request_method_post ).

lo_http_client->request->set_header_field( name = 'Content-Type' value = 'multipart/mixed; boundary=batch_1' ).
lo_http_client->request->set_header_field( name = 'x-csrf-token' value = iv_token ).
lo_http_client->request->set_header_field( name = 'Authorization' value = 'your basic authentication code' ).
LOOP AT it_cookies ASSIGNING FIELD-SYMBOL(<cookie>).
lo_http_client->request->set_cookie( name = <cookie>-name
value = <cookie>-value ).
ENDLOOP.
DATA: lv_body TYPE string.

insert_line '--batch_1'.
insert_line 'Content-Type: multipart/mixed; boundary=changeset_1'.
lv_body = lv_body && cl_abap_char_utilities=>cr_lf.
*
insert_line '--changeset_1'.
insert_line 'Content-Type: application/http'.
insert_line 'Content-Transfer-Encoding: binary'.
lv_body = lv_body && cl_abap_char_utilities=>cr_lf.

insert_line 'POST OpportunityCollection HTTP/1.1'.
insert_line 'Content-Length: 5000'.
insert_line 'Accept: application/json'.
insert_line 'Content-Type: application/json'.

lv_body = lv_body && cl_abap_char_utilities=>cr_lf.
insert_line '{'.
insert_line '"AccountID": "8000018122",'.
insert_line '"OwnerID": "8000018122",'.
insert_line `"Name": {"content": "Testing ticket creation via OData Jerry1"}`.
insert_line '}'.
insert_line '--changeset_1--'.
lv_body = lv_body && cl_abap_char_utilities=>cr_lf.
insert_line '--batch_1--'.

lo_http_client->request->set_cdata( data = lv_body ).
CALL METHOD lo_http_client->send
EXCEPTIONS
http_communication_failure = 1
http_invalid_state = 2
http_processing_failed = 3.

ASSERT sy-subrc = 0.

CALL METHOD lo_http_client->receive
EXCEPTIONS
http_communication_failure = 1
http_invalid_state = 2
http_processing_failed = 3.

IF sy-subrc <> 0.
CALL METHOD lo_http_client->get_last_error
IMPORTING
code = lv_sysubrc
message = DATA(ev_message).
WRITE: / 'error occurred during receive data' COLOR COL_NEGATIVE.
RETURN.
ENDIF.
DATA(lv_json) = lo_http_client->response->get_cdata( ).
WRITE:/ lv_json.
ENDMETHOD.

METHOD get_csrf_token_and_cookie.
DATA: lo_http_client TYPE REF TO if_http_client,
lv_status TYPE i,
lt_fields TYPE tihttpnvp,
lv_sysubrc TYPE sysubrc.

CALL METHOD cl_http_client=>create_by_url
EXPORTING
url = 'https://<your C4C host>/sap/c4c/odata/v1/c4codata/'
IMPORTING
client = lo_http_client
EXCEPTIONS
argument_not_found = 1
plugin_not_active = 2
internal_error = 3
OTHERS = 4.

ASSERT sy-subrc = 0.
lo_http_client->propertytype_accept_cookie = if_http_client=>co_enabled.

CALL METHOD lo_http_client->request->set_method( if_http_request=>co_request_method_get ).
lo_http_client->request->set_header_field( name = 'x-csrf-token' value = 'Fetch' ).
lo_http_client->request->set_header_field( name = 'Accept' value = 'application/json' ).
lo_http_client->request->set_header_field( name = 'Content-Type' value = 'application/json' ).
lo_http_client->request->set_header_field( name = 'Authorization' value = 'Your basic authentication' ).

CALL METHOD lo_http_client->send
EXCEPTIONS
http_communication_failure = 1
http_invalid_state = 2
http_processing_failed = 3.

ASSERT sy-subrc = 0.

CALL METHOD lo_http_client->receive
EXCEPTIONS
http_communication_failure = 1
http_invalid_state = 2
http_processing_failed = 3.

IF sy-subrc <> 0.
CALL METHOD lo_http_client->get_last_error
IMPORTING
code = lv_sysubrc
message = DATA(ev_message).
WRITE: / 'Error when getting token:', ev_message.
RETURN.
ENDIF.

lo_http_client->response->get_header_fields( CHANGING fields = lt_fields ).

READ TABLE lt_fields ASSIGNING FIELD-SYMBOL(<field>) WITH KEY name = 'x-csrf-token'.
ev_token = <field>-value.

lo_http_client->response->get_cookies( CHANGING cookies = et_cookies ).
lo_http_client->close( ).

ENDMETHOD.
ENDCLASS.

Further reading


You can find a list of all other blogs related to OData written by Jerry.







9 Comments