0002 Zu Consume Netsuite API Oauth2.0

Download as txt, pdf, or txt
Download as txt, pdf, or txt
You are on page 1of 7

*&---------------------------------------------------------------------*

*& Report ZU_CONSUME_NETSUITE_API_OAUTH2.0


*&---------------------------------------------------------------------*
*& Created By: SAPYard
*& Date : Feb 2021
*& Desc : Consume NetSuite API using Code & Access Token (3 Steps)
*&---------------------------------------------------------------------*
REPORT ZU_CONSUME_NETSUITE_API_OAUTH2.0.

*---------------------------------------------------------------------*
* Global DATA Declaration *
*---------------------------------------------------------------------*
DATA:
o_http_client TYPE REF TO if_http_client,
gv_access_token TYPE string,
gv_http_status_code TYPE i,
gv_http_status_text TYPE string,
gs_response TYPE string,
gs_raw_response TYPE string,
gv_header_attribute_name TYPE string,
gv_header_attribute_value TYPE string.

CONSTANTS:
gc_cookie TYPE string VALUE 'Cookie',
gc_cookie_value TYPE string VALUE 'NS_ROUTING_VERSION=LEADING',
gc_content_type TYPE string VALUE 'Content-Type',
gc_authorization TYPE string VALUE 'Authorization',
gc_app_form TYPE string VALUE 'application/x-www-form-urlencoded',
gc_app_json TYPE string VALUE 'application/json',
gc_post TYPE string VALUE 'POST'.

*---------------------------------------------------------------------*
* SELECTION SCREEN *
*---------------------------------------------------------------------*
PARAMETERS: p_code TYPE string LOWER CASE.

WRITE:/ 'Step 1: Generated Code from Authentication URL: ', p_code.


*--------------------------------------------------------------------*
*--------------------------------------------------------------------*
*--------------------------------------------------------------------*
*--Logic to get the Access Token
*--Create HTTP Client by Calling Rest API to Send SMS
PERFORM call_auth_token_url.

*--Post Method
PERFORM set_post_method.

*--Authenticate
PERFORM authenticate_netsuite.

*--Set Header data


* Set Cookie as 'NS_ROUTING_VERSION=LEADING'
PERFORM set_header_field USING gc_cookie
gc_cookie_value.

* Set Content Type as 'application/x-www-form-urlencoded'


PERFORM set_header_field USING gc_content_type gc_app_form.
*--Set BODY to get the Access Token
PERFORM set_body_with_code USING p_code.

* Set SEND method to the HTTP Client


PERFORM set_send_method.

* Call RECEIVE method


PERFORM call_receive_method.

* Get Status
PERFORM get_response_status.

**************
SKIP 1.
WRITE:/ 'Step 2: Netsuit Token Return Code/Text : ', gv_http_status_code, '/',
gv_http_status_text.
SKIP 1.

* Get API Token from the response


PERFORM read_api_token_key.
*--------------------------------------------------------------------*
*--------------------------------------------------------------------*
*--------------------------------------------------------------------*
*---STEP 3 --Post the JSON data to NetSuite
PERFORM call_rest_api_send_url.

*--Set Header
* Set Content Type app/json
PERFORM set_header_field USING gc_content_type
gc_app_json.

* Set Authorization and Token


CONCATENATE 'Bearer' gv_access_token INTO gv_access_token SEPARATED BY space.

PERFORM set_header_field USING gc_authorization


gv_access_token.

*--Prepare Body
PERFORM prepare_api_body.

* Set SEND method to the HTTP Client


PERFORM set_send_method.

* Call RECEIVE method


PERFORM call_receive_method.

* Get Response
PERFORM get_response_status.

*--Write the Response


WRITE:/ 'Step 3: Netsuite Return Code/Text : ', gv_http_status_code, '/',
gv_http_status_text.
*SKIP 1.
*WRITE:/ 'Netsuite Reesponse : ', gs_response .

*&---------------------------------------------------------------------*
*& Form call_auth_token_url
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
FORM call_auth_token_url .

DATA: lv_send_url TYPE string.

* URL to get Access Token


* 'https://SAPYard.suitetalk.api.netsuite.com/services/rest/auth/oauth2/v1/token'
SELECT SINGLE low FROM tvarvc INTO lv_send_url
WHERE name = 'NETSUITE_GET_ACCESS_TOKEN_URL'
AND type = 'P'.

CALL METHOD cl_http_client=>create_by_url


EXPORTING
url = lv_send_url
IMPORTING
client = o_http_client
EXCEPTIONS
argument_not_found = 1
plugin_not_active = 2
internal_error = 3
OTHERS = 4.
ENDFORM.

*&---------------------------------------------------------------------*
*& Form set_body_with_code
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
FORM set_body_with_code USING p_code.

DATA:
lv_cdata TYPE string,
lv_content_length_value TYPE i,
lv_client_id TYPE tvarv_val,
lv_client_secret TYPE tvarv_val.

CONCATENATE 'code=' p_code '&'


'redirect_uri=https://www.pulsesecure.net/callback' '&'
'grant_type=authorization_code'
INTO lv_cdata.

* Get data length


lv_content_length_value = strlen( lv_cdata ).

* Set Data
CALL METHOD o_http_client->request->if_http_entity~set_cdata
EXPORTING
data = lv_cdata
length = lv_content_length_value
offset = 0.

ENDFORM.

*&---------------------------------------------------------------------*
*& Form SET_SEND_METHOD
*&---------------------------------------------------------------------*
* SEND Method
*----------------------------------------------------------------------*
FORM set_send_method .

CALL METHOD o_http_client->send


EXCEPTIONS
http_communication_failure = 1
http_invalid_state = 2
http_processing_failed = 3
http_invalid_timeout = 4
OTHERS = 5.

ENDFORM. " SET_SEND_METHOD


*&---------------------------------------------------------------------*
*& Form CALL_RECEIVE_METHOD
*&---------------------------------------------------------------------*
* Receive Method
*----------------------------------------------------------------------*
FORM call_receive_method .

CALL METHOD o_http_client->receive


EXCEPTIONS
http_communication_failure = 1
http_invalid_state = 2
http_processing_failed = 3
OTHERS = 5.

ENDFORM. " CALL_RECEIVE_METHOD


*&---------------------------------------------------------------------*
*& Form GET_RESPONSE_STATUS
*&---------------------------------------------------------------------*
* Get Response Status
*----------------------------------------------------------------------*
FORM get_response_status .

* Get Status
CLEAR: gv_http_status_code,
gv_http_status_text,
gs_response.

CALL METHOD o_http_client->response->get_status


IMPORTING
code = gv_http_status_code " HTTP status code
reason = gv_http_status_text. " HTTP status description

gs_response = o_http_client->response->get_cdata( ).
gs_raw_response = o_http_client->response->get_raw_message( ).

ENDFORM. " GET_RESPONSE_STATUS

*&---------------------------------------------------------------------*
*& Form READ_API_TOKEN_KEY
*&---------------------------------------------------------------------*
* Read the Token from the Response
*----------------------------------------------------------------------*
FORM read_api_token_key .

DATA:
lv_xml_result_str TYPE string,
lv_xml_result_xstr TYPE xstring.

* Write the data received back from the POST to the screen:
CLEAR lv_xml_result_str.
lv_xml_result_str = o_http_client->response->get_cdata( ).

sy-tmaxl = strlen( lv_xml_result_str ).

FIELD-SYMBOLS: <fs>.

ASSIGN lv_xml_result_str TO <fs>.

TYPES: BEGIN OF t_result,


str(9999),
END OF t_result.

DATA: itab_result TYPE TABLE OF t_result WITH HEADER LINE.


DATA: lgv_access_token_str_found TYPE boole_d,
lv_expire_str_found TYPE boole_d,
w_strlen TYPE i,
token_expire_seconds TYPE char10.

SPLIT lv_xml_result_str AT '"' INTO TABLE itab_result.


CLEAR: lgv_access_token_str_found,
lv_expire_str_found.

LOOP AT itab_result.
CASE itab_result-str.
WHEN 'access_token'.
lgv_access_token_str_found = abap_true.
WHEN 'expires_in'.
lv_expire_str_found = abap_true.
WHEN OTHERS.
IF lgv_access_token_str_found EQ abap_true AND gv_access_token IS INITIAL.
w_strlen = strlen( itab_result-str ).
IF w_strlen > 30.
gv_access_token = itab_result-str.
ENDIF.
ENDIF.

IF lv_expire_str_found EQ abap_true AND token_expire_seconds IS INITIAL AND


itab_result-str CS '0'.
REPLACE ':' WITH space INTO itab_result-str.
REPLACE '#' WITH space INTO itab_result-str.
REPLACE '}' WITH space INTO itab_result-str.
SHIFT itab_result-str BY 1 PLACES RIGHT CIRCULAR.
WHILE itab_result-str(1) EQ space.
SHIFT itab_result-str BY 1 PLACES RIGHT CIRCULAR.
ENDWHILE.
itab_result-str(1) = ' '.
SHIFT itab_result-str LEFT DELETING LEADING space.
token_expire_seconds = itab_result-str.
ENDIF.
ENDCASE.
ENDLOOP.
*******
WRITE:/ 'Access Token : ', gv_access_token.
SKIP 1.

ENDFORM. " READ_API_TOKEN_KEY

*&---------------------------------------------------------------------*
*& Form SET_HEADER_FIELD
*&---------------------------------------------------------------------*
* Set Header Field
*----------------------------------------------------------------------*
FORM set_header_field CHANGING p_name
p_value.

o_http_client->request->set_header_field(
name = p_name
value = p_value
).

ENDFORM. " SET_HEADER_FIELD


*&---------------------------------------------------------------------*
*& Form SET_POST_METHOD
*&---------------------------------------------------------------------*
* Set POST Method
*----------------------------------------------------------------------*
FORM set_post_method .
* Set up the HTTP Post to Salesforc's AUTH API URL
CALL METHOD o_http_client->request->set_method
EXPORTING
method = gc_post. " 'POST'.
ENDFORM. " SET_POST_METHOD
*&---------------------------------------------------------------------*
*& Form call_rest_api_send_url
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
FORM call_rest_api_send_url .

DATA: lv_send_url TYPE string.

* URL to get Access Token


* 'https://SAPYard.suitetalk.api.netsuite.com/services/rest/record/v1/
customrecord_paer_inter_branch'
SELECT SINGLE low FROM tvarvc INTO lv_send_url
WHERE name = 'NETSUITE_POST_API_URL'
AND type = 'P'.

CALL METHOD cl_http_client=>create_by_url


EXPORTING
url = lv_send_url
IMPORTING
client = o_http_client
EXCEPTIONS
argument_not_found = 1
plugin_not_active = 2
internal_error = 3
OTHERS = 4.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form authenticate_netsuite
*&---------------------------------------------------------------------*
*& Put Client Id & Secret
*&---------------------------------------------------------------------*
FORM authenticate_netsuite .

DATA: lv_client_id TYPE string,


lv_client_secret TYPE string.
* Get Client Id
SELECT SINGLE low FROM tvarvc INTO lv_client_id
WHERE name = 'NETSUITE_CLIENT_ID'
AND type = 'P'.

* Get Client Id
SELECT SINGLE low FROM tvarvc INTO lv_client_secret
WHERE name = 'NETSUITE_CLIENT_SECRET'
AND type = 'P'.

CALL METHOD o_http_client->authenticate


EXPORTING
username = lv_client_id "'daca9d57035718f99aa7316453'
password = lv_client_secret. " 'ceb6db752ab933833cf9e'.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form prepare_api_body
*&---------------------------------------------------------------------*
*& Prepare JSON Body
*&---------------------------------------------------------------------*
FORM prepare_api_body .

data: lv_json_c TYPE string.

* You will have to put your logic to get the data from SAP Tables and Serialize
ABAP Data to JSON.
* You may also need to remove and add some characters as per NetSuite Requirement.
* For Demo Purpose, we have hardcoded the JSON data.
lv_json_c = '{ "custrecord_paer_edi_type": "8500", "custrecord_paer_req_type":
"Sales Order Import", "custrecord_paer_rowstate": { "id":
"6" },"custrecord_paer_object":"{ \"name\": \"JS\", \"age\": 32, \"city\": \"New
York\" }" }'.

CALL METHOD o_http_client->request->set_cdata


EXPORTING
data = lv_json_c.
ENDFORM.

You might also like