# SAP On-premise

### Generate PDF from HTML

{% tabs %}
{% tab title="HTML to PDF" %}

```java
FUNCTION zgenerate_pdf.
*"----------------------------------------------------------------------
*"*"Local Interface:
*"  IMPORTING
*"     VALUE(IM_RFCDEST) TYPE  RFCDEST
*"     VALUE(IM_API_KEY) TYPE  STRING
*"     VALUE(IM_HTML) TYPE  STRING
*"     VALUE(IM_ENCRYPTION_KEY) TYPE  STRING OPTIONAL
*"     VALUE(IM_LANDSCAPE) TYPE  STRING OPTIONAL
*"     VALUE(IM_FORMAT) TYPE  STRING OPTIONAL
*"     VALUE(IM_MARGIN_TOP) TYPE  STRING OPTIONAL
*"     VALUE(IM_MARGIN_RIGHT) TYPE  STRING OPTIONAL
*"     VALUE(IM_MARGIN_BOTTOM) TYPE  STRING OPTIONAL
*"     VALUE(IM_MARGIN_LEFT) TYPE  STRING OPTIONAL
*"  EXPORTING
*"     VALUE(EX_SUBRC) TYPE  SYSUBRC
*"     VALUE(EX_MESS) TYPE  STRING
*"     VALUE(EX_PDF) TYPE  XSTRING
*"----------------------------------------------------------------------
*
  DATA: lo_http_client TYPE REF TO if_http_client,
        lv_http_rc     TYPE i,
        lv_response    TYPE string,
        lv_json        TYPE /ui2/cl_json=>json,
        lr_data        TYPE REF TO data.
*
  FIELD-SYMBOLS: <data>  TYPE data,
                 <field> TYPE any.
*
* Setup IF_HTTP_Client object
*
  CALL METHOD cl_http_client=>create_by_destination
    EXPORTING
      destination        = im_rfcdest
    IMPORTING
      client             = lo_http_client
    EXCEPTIONS
      argument_not_found = 1
      plugin_not_active  = 2
      internal_error     = 3
      OTHERS             = 4.
*
  IF sy-subrc IS NOT INITIAL.
    ex_mess = 'Error creating new IF_HTTP_Client object. Process aborted.'.
    ex_subrc = 4.
    RETURN.
  ENDIF.
*
* Set protocol version
*
  lo_http_client->request->set_version( if_http_request=>co_protocol_version_1_1 ).
*
* Set request header fields
*
  lo_http_client->request->set_header_field(
      name  = 'Accept'
      value = 'application/pdf' ).
*
  lo_http_client->request->set_header_field(
      name  = 'Content-Type'
      value = 'application/x-www-form-urlencoded' ).
*
  lo_http_client->request->set_header_field(
      name  = 'x-api-key'
      value = im_api_key ).
*
* Set form fields/attributes
*
  lo_http_client->request->if_http_entity~set_form_field(
    name   = 'inputPayload'
    value  = im_html ).
*
  IF im_encryption_key IS NOT INITIAL.
*
    lo_http_client->request->if_http_entity~set_form_field(
      name   = 'encryptionKey'
      value  = im_encryption_key ).
*
  ENDIF.
*
  IF im_landscape IS NOT INITIAL.
*
    lo_http_client->request->if_http_entity~set_form_field(
      name   = 'landscape'
      value  = im_landscape ).
*
  ENDIF.
*
  IF im_format IS NOT INITIAL.
*
    lo_http_client->request->if_http_entity~set_form_field(
      name   = 'format'
      value  = im_format ).
*
  ENDIF.
*
  IF im_margin_top IS NOT INITIAL.
*
    lo_http_client->request->if_http_entity~set_form_field(
      name   = 'marginTop'
      value  = im_margin_top ).
*
  ENDIF.
*
  IF im_margin_right IS NOT INITIAL.
*
    lo_http_client->request->if_http_entity~set_form_field(
      name   = 'marginRight'
      value  = im_margin_right ).
*
  ENDIF.
*
  IF im_margin_bottom IS NOT INITIAL.
*
    lo_http_client->request->if_http_entity~set_form_field(
      name   = 'marginBottom'
      value  = im_margin_bottom ).
*
  ENDIF.
*
  IF im_margin_left IS NOT INITIAL.
*
    lo_http_client->request->if_http_entity~set_form_field(
      name   = 'marginLeft'
      value  = im_margin_left ).
*
  ENDIF.
*
  lo_http_client->request->set_method( 'POST' ).
*
  lo_http_client->propertytype_logon_popup = lo_http_client->co_disabled.
*
* Send request
*
  CALL METHOD lo_http_client->send
    EXPORTING
      timeout                    = 60   " 15 Seconds
    EXCEPTIONS
      http_communication_failure = 1
      http_invalid_state         = 2.
*
  IF sy-subrc IS NOT INITIAL.
*
    ex_mess = 'HTTP Post error. Process aborted'.
    ex_subrc = 4.
*
    CALL METHOD lo_http_client->close
      EXCEPTIONS
        http_invalid_state = 1
        OTHERS             = 2.
*
    FREE lo_http_client.
    RETURN.
*
  ENDIF.
*
* Read the Response
*
  CALL METHOD lo_http_client->receive
    EXCEPTIONS
      http_communication_failure = 1
      http_invalid_state         = 2
      http_processing_failed     = 3.
*
  lo_http_client->response->get_status( IMPORTING code   = lv_http_rc ).
  lo_http_client->response->get_status( IMPORTING reason = ex_mess ).
  lv_response = lo_http_client->response->get_cdata( ).
*
  IF lv_http_rc NE '200'.
*
* Get error message back from Renda
*
    ex_subrc = 4.
    lv_json = lv_response.
    lr_data = /ui2/cl_json=>generate( json = lv_json ).
*
    IF lr_data IS BOUND.
      ASSIGN lr_data->* TO <data>.
      ASSIGN COMPONENT 'MESSAGE' OF STRUCTURE <data> TO <field>.
      IF <field> IS ASSIGNED.
        lr_data = <field>.
        ASSIGN lr_data->* TO <data>.
        ex_mess = <data>.
      ENDIF.
    ENDIF.
*
  ELSE.
*
    ex_pdf = lo_http_client->response->get_data( ).
*
  ENDIF.
*
  CALL METHOD lo_http_client->close
    EXCEPTIONS
      http_invalid_state = 1
      OTHERS             = 2.
*
  FREE lo_http_client.
*
ENDFUNCTION.
```

{% endtab %}
{% endtabs %}

### Generate QR Code&#x20;

{% tabs %}
{% tab title="ABAP" %}

```java
FUNCTION zgenerate_qr_code.
*"----------------------------------------------------------------------
*"*"Local Interface:
*"  IMPORTING
*"     VALUE(IM_RFCDEST) TYPE  RFCDEST
*"     VALUE(IM_API_KEY) TYPE  STRING
*"     VALUE(IM_DATA) TYPE  STRING
*"  EXPORTING
*"     VALUE(EX_SUBRC) TYPE  SYSUBRC
*"     VALUE(EX_MESS) TYPE  STRING
*"     VALUE(EX_QR_CODE) TYPE  XSTRING
*"----------------------------------------------------------------------
*
  DATA: lo_http_client TYPE REF TO if_http_client,
        lv_http_rc     TYPE i,
        lv_response    TYPE string,
        lv_json        TYPE /ui2/cl_json=>json,
        lr_data        TYPE REF TO data.
*
  FIELD-SYMBOLS: <data>  TYPE data,
                 <field> TYPE any.
*
* Setup IF_HTTP_Client object
*
  CALL METHOD cl_http_client=>create_by_destination
    EXPORTING
      destination        = im_rfcdest
    IMPORTING
      client             = lo_http_client
    EXCEPTIONS
      argument_not_found = 1
      plugin_not_active  = 2
      internal_error     = 3
      OTHERS             = 4.
*
  IF sy-subrc IS NOT INITIAL.
    ex_mess = 'Error creating new IF_HTTP_Client object. Process aborted.'.
    ex_subrc = 4.
    RETURN.
  ENDIF.
*
* Set protocol version
*
  lo_http_client->request->set_version( if_http_request=>co_protocol_version_1_1 ).
*
* Set request header fields
*
  lo_http_client->request->set_header_field(
      name  = 'Accept'
      value = '*/*' ).
*
  lo_http_client->request->set_header_field(
      name  = 'Content-Type'
      value = 'application/x-www-form-urlencoded' ).
*
  lo_http_client->request->set_header_field(
      name  = 'x-api-key'
      value = im_api_key ).
*
* Set form fields/attributes
*
  lo_http_client->request->if_http_entity~set_form_field(
    name   = 'data'
    value  = im_data ).
*
  lo_http_client->request->set_method( 'POST' ).
*
  lo_http_client->propertytype_logon_popup = lo_http_client->co_disabled.
*
* Send request
*
  CALL METHOD lo_http_client->send
    EXPORTING
      timeout                    = 60   " 15 Seconds
    EXCEPTIONS
      http_communication_failure = 1
      http_invalid_state         = 2.
*
  IF sy-subrc IS NOT INITIAL.
*
    ex_mess = 'HTTP Post error. Process aborted'.
    ex_subrc = 4.
*
    CALL METHOD lo_http_client->close
      EXCEPTIONS
        http_invalid_state = 1
        OTHERS             = 2.
*
    FREE lo_http_client.
    RETURN.
*
  ENDIF.
*
* Read the Response
*
  CALL METHOD lo_http_client->receive
    EXCEPTIONS
      http_communication_failure = 1
      http_invalid_state         = 2
      http_processing_failed     = 3.
*
  lo_http_client->response->get_status( IMPORTING code   = lv_http_rc ).
  lo_http_client->response->get_status( IMPORTING reason = ex_mess ).
  lv_response = lo_http_client->response->get_cdata( ).
*
  IF lv_http_rc NE '200'.
*
* Get error message back from Renda
*
    ex_subrc = 4.
    lv_json = lv_response.
    lr_data = /ui2/cl_json=>generate( json = lv_json ).
*
    IF lr_data IS BOUND.
      ASSIGN lr_data->* TO <data>.
      ASSIGN COMPONENT 'MESSAGE' OF STRUCTURE <data> TO <field>.
      IF <field> IS ASSIGNED.
        lr_data = <field>.
        ASSIGN lr_data->* TO <data>.
        ex_mess = <data>.
      ENDIF.
    ENDIF.
*
  ELSE.
*
    ex_qr_code = lo_http_client->response->get_data( ).
*
  ENDIF.
*
  CALL METHOD lo_http_client->close
    EXCEPTIONS
      http_invalid_state = 1
      OTHERS             = 2.
*
  FREE lo_http_client.
*
ENDFUNCTION.
```

{% endtab %}
{% endtabs %}

### Onboard user for TOTP

{% tabs %}
{% tab title="ABAP" %}

```java
FUNCTION zonboard_user.
*"----------------------------------------------------------------------
*"*"Local Interface:
*"  IMPORTING
*"     VALUE(IM_RFCDEST) TYPE  RFCDEST
*"     VALUE(IM_API_KEY) TYPE  STRING
*"     VALUE(IM_USER_ID) TYPE  STRING
*"     VALUE(IM_APPLICATION_ID) TYPE  STRING
*"     VALUE(IM_TOKEN_VALIDITY) TYPE  STRING OPTIONAL
*"     VALUE(IM_TOKEN_LENGTH) TYPE  STRING OPTIONAL
*"  EXPORTING
*"     VALUE(EX_SECRET_KEY) TYPE  STRING
*"     VALUE(EX_OTP_URL) TYPE  STRING
*"     VALUE(EX_QR_CODE) TYPE  STRING
*"     VALUE(EX_TOKEN) TYPE  STRING
*"     VALUE(EX_MESS) TYPE  STRING
*"     VALUE(EX_SUBRC) TYPE  SYSUBRC
*"----------------------------------------------------------------------
  TYPES: BEGIN OF ltyp_response,
           secretkey TYPE string,
           otpurl    TYPE string,
           qrcode    TYPE string,
           token     TYPE string,
         END OF ltyp_response.

  DATA: lo_http_client TYPE REF TO if_http_client,
        lv_http_rc     TYPE i,
        lv_response    TYPE string,
        lv_json        TYPE /ui2/cl_json=>json,
        lr_data        TYPE REF TO data,
        ls_response    TYPE ltyp_response.
*
  FIELD-SYMBOLS: <data>  TYPE data,
                 <field> TYPE any.
*
* Setup IF_HTTP_Client object
*
  CALL METHOD cl_http_client=>create_by_destination
    EXPORTING
      destination        = im_rfcdest
    IMPORTING
      client             = lo_http_client
    EXCEPTIONS
      argument_not_found = 1
      plugin_not_active  = 2
      internal_error     = 3
      OTHERS             = 4.
*
  IF sy-subrc IS NOT INITIAL.
    ex_mess = 'Error creating new IF_HTTP_Client object. Process aborted.'.
    ex_subrc = 4.
    RETURN.
  ENDIF.
*
* Set protocol version
*
  lo_http_client->request->set_version( if_http_request=>co_protocol_version_1_1 ).
*
* Set request header fields
*
  lo_http_client->request->set_header_field(
      name  = 'Content-Type'
      value = 'application/x-www-form-urlencoded' ).
*
  lo_http_client->request->set_header_field(
      name  = 'x-api-key'
      value = im_api_key ).
*
* Set form fields/attributes
*
  lo_http_client->request->if_http_entity~set_form_field(
    name   = 'userID'
    value  = im_user_id ).
*
  lo_http_client->request->if_http_entity~set_form_field(
    name   = 'applicationID'
    value  = im_application_id ).
*
  IF im_token_validity IS NOT INITIAL.
*
    lo_http_client->request->if_http_entity~set_form_field(
      name   = 'tokenValidity'
      value  = im_token_validity ).
*
  ENDIF.
*
  IF im_token_length IS NOT INITIAL.
*
    lo_http_client->request->if_http_entity~set_form_field(
      name   = 'tokenLength'
      value  = im_token_length ).
*
  ENDIF.
*
  lo_http_client->request->set_method( 'POST' ).
*
  lo_http_client->propertytype_logon_popup = lo_http_client->co_disabled.
*
* Send request
*
  CALL METHOD lo_http_client->send
    EXPORTING
      timeout                    = 60   " 15 Seconds
    EXCEPTIONS
      http_communication_failure = 1
      http_invalid_state         = 2.
*
  IF sy-subrc IS NOT INITIAL.
*
    ex_mess = 'HTTP Post error. Process aborted'.
    ex_subrc = 4.
*
    CALL METHOD lo_http_client->close
      EXCEPTIONS
        http_invalid_state = 1
        OTHERS             = 2.
*
    FREE lo_http_client.
    RETURN.
*
  ENDIF.
*
* Read the Response
*
  CALL METHOD lo_http_client->receive
    EXCEPTIONS
      http_communication_failure = 1
      http_invalid_state         = 2
      http_processing_failed     = 3.
*
  lo_http_client->response->get_status( IMPORTING code   = lv_http_rc ).
  lo_http_client->response->get_status( IMPORTING reason = ex_mess ).
  lv_response = lo_http_client->response->get_cdata( ).
*
  IF lv_http_rc NE '200'.
*
* Get error message back from Renda
*
    ex_subrc = 4.
    lv_json = lv_response.
    lr_data = /ui2/cl_json=>generate( json = lv_json ).
*
    IF lr_data IS BOUND.
      ASSIGN lr_data->* TO <data>.
      ASSIGN COMPONENT 'MESSAGE' OF STRUCTURE <data> TO <field>.
      IF <field> IS ASSIGNED.
        lr_data = <field>.
        ASSIGN lr_data->* TO <data>.
        ex_mess = <data>.
      ENDIF.
    ENDIF.
*
  ELSE.
*
    /ui2/cl_json=>deserialize( EXPORTING json = lv_response pretty_name = /ui2/cl_json=>pretty_mode-camel_case CHANGING data = ls_response ).
    ex_secret_key = ls_response-secretkey.
    ex_otp_url = ls_response-otpurl.
    ex_qr_code = ls_response-qrcode.
    ex_token = ls_response-token.
*
  ENDIF.
*
  CALL METHOD lo_http_client->close
    EXCEPTIONS
      http_invalid_state = 1
      OTHERS             = 2.
*
  FREE lo_http_client.
*
ENDFUNCTION.
```

{% endtab %}
{% endtabs %}

### Validate OTP using secret key

{% tabs %}
{% tab title="ABAP" %}

```java
FUNCTION zverify_otp.
*"----------------------------------------------------------------------
*"*"Local Interface:
*"  IMPORTING
*"     VALUE(IM_RFCDEST) TYPE  RFCDEST
*"     VALUE(IM_API_KEY) TYPE  STRING
*"     VALUE(IM_SECRET) TYPE  STRING
*"     VALUE(IM_TOKEN) TYPE  STRING
*"     VALUE(IM_TOKEN_VALIDITY) TYPE  STRING OPTIONAL
*"  EXPORTING
*"     VALUE(EX_IS_VALID) TYPE  FLAG
*"     VALUE(EX_TOKEN) TYPE  STRING
*"     VALUE(EX_TIME_USED) TYPE  STRING
*"     VALUE(EX_TIME_REMAINING) TYPE  STRING
*"     VALUE(EX_MESS) TYPE  STRING
*"     VALUE(EX_SUBRC) TYPE  SYSUBRC
*"----------------------------------------------------------------------
  TYPES: BEGIN OF ltyp_response,
           isvalid       TYPE flag,
           token         TYPE string,
           timeused      TYPE string,
           timeremaining TYPE string,
         END OF ltyp_response.

  DATA: lo_http_client TYPE REF TO if_http_client,
        lv_http_rc     TYPE i,
        lv_response    TYPE string,
        lv_json        TYPE /ui2/cl_json=>json,
        lr_data        TYPE REF TO data,
        ls_response    TYPE ltyp_response.
*
  FIELD-SYMBOLS: <data>  TYPE data,
                 <field> TYPE any.
*
* Setup IF_HTTP_Client object
*
  CALL METHOD cl_http_client=>create_by_destination
    EXPORTING
      destination        = im_rfcdest
    IMPORTING
      client             = lo_http_client
    EXCEPTIONS
      argument_not_found = 1
      plugin_not_active  = 2
      internal_error     = 3
      OTHERS             = 4.
*
  IF sy-subrc IS NOT INITIAL.
    ex_mess = 'Error creating new IF_HTTP_Client object. Process aborted.'.
    ex_subrc = 4.
    RETURN.
  ENDIF.
*
* Set protocol version
*
  lo_http_client->request->set_version( if_http_request=>co_protocol_version_1_1 ).
*
* Set request header fields
*
  lo_http_client->request->set_header_field(
      name  = 'Content-Type'
      value = 'application/x-www-form-urlencoded' ).
*
  lo_http_client->request->set_header_field(
      name  = 'x-api-key'
      value = im_api_key ).
*
* Set form fields/attributes
*
  lo_http_client->request->if_http_entity~set_form_field(
    name   = 'secret'
    value  = im_secret ).
*
  lo_http_client->request->if_http_entity~set_form_field(
    name   = 'token'
    value  = im_token ).
*
  IF im_token_validity IS NOT INITIAL.
*
    lo_http_client->request->if_http_entity~set_form_field(
      name   = 'tokenValidity'
      value  = im_token_validity ).
*
  ENDIF.
*
  lo_http_client->request->set_method( 'POST' ).
*
  lo_http_client->propertytype_logon_popup = lo_http_client->co_disabled.
*
* Send request
*
  CALL METHOD lo_http_client->send
    EXPORTING
      timeout                    = 60   " 15 Seconds
    EXCEPTIONS
      http_communication_failure = 1
      http_invalid_state         = 2.
*
  IF sy-subrc IS NOT INITIAL.
*
    ex_mess = 'HTTP Post error. Process aborted'.
    ex_subrc = 4.
*
    CALL METHOD lo_http_client->close
      EXCEPTIONS
        http_invalid_state = 1
        OTHERS             = 2.
*
    FREE lo_http_client.
    RETURN.
*
  ENDIF.
*
* Read the Response
*
  CALL METHOD lo_http_client->receive
    EXCEPTIONS
      http_communication_failure = 1
      http_invalid_state         = 2
      http_processing_failed     = 3.
*
  lo_http_client->response->get_status( IMPORTING code   = lv_http_rc ).
  lo_http_client->response->get_status( IMPORTING reason = ex_mess ).
  lv_response = lo_http_client->response->get_cdata( ).
*
  IF lv_http_rc NE '200'.
*
* Get error message back from Renda
*
    ex_subrc = 4.
    lv_json = lv_response.
    lr_data = /ui2/cl_json=>generate( json = lv_json ).
*
    IF lr_data IS BOUND.
      ASSIGN lr_data->* TO <data>.
      ASSIGN COMPONENT 'MESSAGE' OF STRUCTURE <data> TO <field>.
      IF <field> IS ASSIGNED.
        lr_data = <field>.
        ASSIGN lr_data->* TO <data>.
        ex_mess = <data>.
      ENDIF.
    ENDIF.
*
  ELSE.
*
    /ui2/cl_json=>deserialize( EXPORTING json = lv_response pretty_name = /ui2/cl_json=>pretty_mode-camel_case CHANGING data = ls_response ).
    ex_is_valid = ls_response-isvalid.
    ex_token = ls_response-token.
    ex_time_used = ls_response-timeused.
    ex_time_remaining = ls_response-timeremaining.
*
  ENDIF.
*
  CALL METHOD lo_http_client->close
    EXCEPTIONS
      http_invalid_state = 1
      OTHERS             = 2.
*
  FREE lo_http_client.
*
ENDFUNCTION.
```

{% endtab %}
{% endtabs %}

### Retrieve OTP for a secret key

{% tabs %}
{% tab title="ABAP" %}
{% code title="zget\_otp" %}

```java
FUNCTION zget_otp.
*"----------------------------------------------------------------------
*"*"Local Interface:
*"  IMPORTING
*"     VALUE(IM_RFCDEST) TYPE  RFCDEST
*"     VALUE(IM_API_KEY) TYPE  STRING
*"     VALUE(IM_SECRET) TYPE  STRING
*"     VALUE(IM_TOKEN_VALIDITY) TYPE  STRING OPTIONAL
*"     VALUE(IM_TOKEN_LENGTH) TYPE  STRING OPTIONAL
*"  EXPORTING
*"     VALUE(EX_CURRENT_TOKEN) TYPE  STRING
*"     VALUE(EX_TIME_USED) TYPE  STRING
*"     VALUE(EX_TIME_REMAINING) TYPE  STRING
*"     VALUE(EX_PREVIOUS_TOKEN) TYPE  STRING
*"     VALUE(EX_NEXT_TOKEN) TYPE  STRING
*"     VALUE(EX_MESS) TYPE  STRING
*"     VALUE(EX_SUBRC) TYPE  SYSUBRC
*"----------------------------------------------------------------------
  TYPES: BEGIN OF ltyp_response,
           currenttoken  TYPE string,
           timeused      TYPE string,
           timeremaining TYPE string,
           previoustoken TYPE string,
           nexttoken     TYPE string,
         END OF ltyp_response.

  DATA: lo_http_client TYPE REF TO if_http_client,
        lv_http_rc     TYPE i,
        lv_response    TYPE string,
        lv_json        TYPE /ui2/cl_json=>json,
        lr_data        TYPE REF TO data,
        ls_response    TYPE ltyp_response.
*
  FIELD-SYMBOLS: <data>  TYPE data,
                 <field> TYPE any.
*
* Setup IF_HTTP_Client object
*
  CALL METHOD cl_http_client=>create_by_destination
    EXPORTING
      destination        = im_rfcdest
    IMPORTING
      client             = lo_http_client
    EXCEPTIONS
      argument_not_found = 1
      plugin_not_active  = 2
      internal_error     = 3
      OTHERS             = 4.
*
  IF sy-subrc IS NOT INITIAL.
    ex_mess = 'Error creating new IF_HTTP_Client object. Process aborted.'.
    ex_subrc = 4.
    RETURN.
  ENDIF.
*
* Set protocol version
*
  lo_http_client->request->set_version( if_http_request=>co_protocol_version_1_1 ).
*
* Set request header fields
*
  lo_http_client->request->set_header_field(
      name  = 'Content-Type'
      value = 'application/x-www-form-urlencoded' ).
*
  lo_http_client->request->set_header_field(
      name  = 'x-api-key'
      value = im_api_key ).
*
* Set form fields/attributes
*
  lo_http_client->request->if_http_entity~set_form_field(
    name   = 'secret'
    value  = im_secret ).
*
  IF im_token_validity IS NOT INITIAL.
*
    lo_http_client->request->if_http_entity~set_form_field(
      name   = 'tokenValidity'
      value  = im_token_validity ).
*
  ENDIF.
*
  IF im_token_length IS NOT INITIAL.
*
    lo_http_client->request->if_http_entity~set_form_field(
      name   = 'tokenLength'
      value  = im_token_length ).
*
  ENDIF.
*
  lo_http_client->request->set_method( 'POST' ).
*
  lo_http_client->propertytype_logon_popup = lo_http_client->co_disabled.
*
* Send request
*
  CALL METHOD lo_http_client->send
    EXPORTING
      timeout                    = 60   " 15 Seconds
    EXCEPTIONS
      http_communication_failure = 1
      http_invalid_state         = 2.
*
  IF sy-subrc IS NOT INITIAL.
*
    ex_mess = 'HTTP Post error. Process aborted'.
    ex_subrc = 4.
*
    CALL METHOD lo_http_client->close
      EXCEPTIONS
        http_invalid_state = 1
        OTHERS             = 2.
*
    FREE lo_http_client.
    RETURN.
*
  ENDIF.
*
* Read the Response
*
  CALL METHOD lo_http_client->receive
    EXCEPTIONS
      http_communication_failure = 1
      http_invalid_state         = 2
      http_processing_failed     = 3.
*
  lo_http_client->response->get_status( IMPORTING code   = lv_http_rc ).
  lo_http_client->response->get_status( IMPORTING reason = ex_mess ).
  lv_response = lo_http_client->response->get_cdata( ).
*
  IF lv_http_rc NE '200'.
*
* Get error message back from Renda
*
    ex_subrc = 4.
    lv_json = lv_response.
    lr_data = /ui2/cl_json=>generate( json = lv_json ).
*
    IF lr_data IS BOUND.
      ASSIGN lr_data->* TO <data>.
      ASSIGN COMPONENT 'MESSAGE' OF STRUCTURE <data> TO <field>.
      IF <field> IS ASSIGNED.
        lr_data = <field>.
        ASSIGN lr_data->* TO <data>.
        ex_mess = <data>.
      ENDIF.
    ENDIF.
*
  ELSE.
*
    /ui2/cl_json=>deserialize( EXPORTING json = lv_response pretty_name = /ui2/cl_json=>pretty_mode-camel_case CHANGING data = ls_response ).
    ex_current_token = ls_response-currenttoken.
    ex_time_used = ls_response-timeused.
    ex_time_remaining = ls_response-timeremaining.
    ex_previous_token = ls_response-previoustoken.
    ex_next_token = ls_response-nexttoken.
*
  ENDIF.
*
  CALL METHOD lo_http_client->close
    EXCEPTIONS
      http_invalid_state = 1
      OTHERS             = 2.
*
  FREE lo_http_client.
*
ENDFUNCTION.
```

{% endcode %}
{% endtab %}
{% endtabs %}

### Send SMS&#x20;

{% tabs %}
{% tab title="ABAP" %}

```java
FUNCTION zsend_sms.
*"----------------------------------------------------------------------
*"*"Local Interface:
*"  IMPORTING
*"     VALUE(IM_RFCDEST) TYPE  RFCDEST
*"     VALUE(IM_API_KEY) TYPE  STRING
*"     VALUE(IM_NUMBER) TYPE  STRING
*"     VALUE(IM_MESSAGE) TYPE  STRING
*"     VALUE(IM_SENDER_NAME) TYPE  STRING OPTIONAL
*"  EXPORTING
*"     VALUE(EX_SUBRC) TYPE  SYSUBRC
*"     VALUE(EX_MESS) TYPE  STRING
*"----------------------------------------------------------------------
*
  DATA: lo_http_client TYPE REF TO if_http_client,
        lv_http_rc     TYPE i,
        lv_response    TYPE string,
        lv_json        TYPE /ui2/cl_json=>json,
        lr_data        TYPE REF TO data.
*
  FIELD-SYMBOLS: <data>  TYPE data,
                 <field> TYPE any.
*
* Setup IF_HTTP_Client object
*
  CALL METHOD cl_http_client=>create_by_destination
    EXPORTING
      destination        = im_rfcdest
    IMPORTING
      client             = lo_http_client
    EXCEPTIONS
      argument_not_found = 1
      plugin_not_active  = 2
      internal_error     = 3
      OTHERS             = 4.
*
  IF sy-subrc IS NOT INITIAL.
    ex_mess = 'Error creating new IF_HTTP_Client object. Process aborted.'.
    ex_subrc = 4.
    RETURN.
  ENDIF.
*
* Set protocol version
*
  lo_http_client->request->set_version( if_http_request=>co_protocol_version_1_1 ).
*
* Set request header fields
*
  lo_http_client->request->set_header_field(
      name  = 'x-api-key'
      value = im_api_key ).
*
* Set form fields/attributes
*
  lo_http_client->request->if_http_entity~set_form_field(
    name   = 'number'
    value  = im_number ).
*
  lo_http_client->request->if_http_entity~set_form_field(
    name   = 'message'
    value  = im_message ).
*
  IF im_sender_name IS NOT INITIAL.
*
    lo_http_client->request->if_http_entity~set_form_field(
      name   = 'senderName'
      value  = im_sender_name ).
*
  ENDIF.
*
  lo_http_client->request->set_method( 'POST' ).
*
  lo_http_client->propertytype_logon_popup = lo_http_client->co_disabled.
*
* Send request
*
  CALL METHOD lo_http_client->send
    EXPORTING
      timeout                    = 60   " 15 Seconds
    EXCEPTIONS
      http_communication_failure = 1
      http_invalid_state         = 2.
*
  IF sy-subrc IS NOT INITIAL.
*
    ex_mess = 'HTTP Post error. Process aborted'.
    ex_subrc = 4.
*
    CALL METHOD lo_http_client->close
      EXCEPTIONS
        http_invalid_state = 1
        OTHERS             = 2.
*
    FREE lo_http_client.
    RETURN.
*
  ENDIF.
*
* Read the Response
*
  CALL METHOD lo_http_client->receive
    EXCEPTIONS
      http_communication_failure = 1
      http_invalid_state         = 2
      http_processing_failed     = 3.
*
  lo_http_client->response->get_status( IMPORTING code   = lv_http_rc ).
  lo_http_client->response->get_status( IMPORTING reason = ex_mess ).
  lv_response = lo_http_client->response->get_cdata( ).
*
  IF lv_http_rc NE '200'.
*
* Get error message back from Renda
*
    ex_subrc = 4.
    lv_json = lv_response.
    lr_data = /ui2/cl_json=>generate( json = lv_json ).
*
    IF lr_data IS BOUND.
      ASSIGN lr_data->* TO <data>.
      ASSIGN COMPONENT 'MESSAGE' OF STRUCTURE <data> TO <field>.
      IF <field> IS ASSIGNED.
        lr_data = <field>.
        ASSIGN lr_data->* TO <data>.
        ex_mess = <data>.
      ENDIF.
    ENDIF.
*
  ENDIF.
*
  CALL METHOD lo_http_client->close
    EXCEPTIONS
      http_invalid_state = 1
      OTHERS             = 2.
*
  FREE lo_http_client.
*
ENDFUNCTION.
```

{% endtab %}
{% endtabs %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://documentation.renda.io/code-samples/abap-code-samples-on-premise.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
