Technology Blogs by SAP
Learn how to extend and personalize SAP applications. Follow the SAP technology blog for insights into SAP BTP, ABAP, SAP Analytics Cloud, SAP HANA, and more.
Showing results for 
Search instead for 
Did you mean: 

ICF - Internet Communication Framwork

Internet Communication Framework (ICF) is a programming interface (API), based on interfaces and classes, used by ABAP programs to communicate with the Internet. ICF supports the Internet protocols HTTP, HTTPS, and SMTP. All communication between ABAP and the Internet based on these protocols takes place using ICF. ICF is a simplified technical foundation that can be used by more advanced programming interfaces. This means that ABAP programs do not usually access ICF directly and wrappers are used instead, such as Business Server Pages, Web Dynpro ABAP, Web Services ABAP, or OData-based services. Wrappers like these ensure that the conventions required for external communication are met, such as the model view controller approach (MVC) in Web Dynpro or Simple Object Access Protocol (SOAP) in Web services.

For more detail infomation, please scan .


Use ICF to Build Restful Service

Build ICF service

  1. User Tcode: sicf to define services.

You can choose one node to create your service, like zsean_srv. Then in the detail page, you            should input a description and click the Logon Data tab.

In the picture, there are some choices for Procedure: Standard means that you will use the                 standard Logon way to logon your service; Alternative Logon Procedure means that you can               choose one or more procedures for you service like below:                                                                    the third one means that you                need to assign the logon data the your service; and the last one means that you can use SSL            to your service.

If you don't use SSL, please choose Standard in Security Requirement.

Choose the right user for Authentication, if your user can't logon SAP backend, please choose            Internet User.(if not, logon error will always occurred when you access your service)

Fill your handler Class in Handler like below:                                                                                          

2. Implement handler class

You need to create a handler class extend interface:IF_HTTP_EXTENSION. In your class,                 please redifine the <IF_HTTP_EXTENSION>~HANDLE_REQUEST method. In this                             method, parameter server is runtime instance and you can get the request from                                   server->request and send the response with   server->response.

Define your handler class to handle restful request

Because ABAP doesn't have JSON, so we need to serializes the json string from request to Internal Table. Tow class will help you to do it: a.  cl_trex_json_deserializer & cl_trex_json_serializer b. /UI2/CL_JSON; a have many limitation, such as an internal table:

user_name li si
user_id 1001

if you use the a to serialize to JSON, you will get "{user_name:"li si", user_id:"1001"}" which can't be json parse to json in JS. But you will get "{"userName":"li si", "userId":"1001"}" which we best want with b.
 types: BEGIN OF ts,
user_id TYPE string,
user_name TYPE string,
user_address TYPE string,
END OF ts.

DATA ls_user TYPE ts.

DATA lv_json TYPE string.
DATA lv_json1 TYPE string.

ls_user-user_id = '012145'.
ls_user-user_name = 'li si'.
ls_user-user_address = 'sicuan'.
append ls_user to lt_user.

ls_user-user_id = '0121456'.
ls_user-user_name = 'li wu'.
ls_user-user_address = 'sicuant'.
append ls_user to lt_user.

data = ls_user
* compress =
* name =
pretty_name = /ui2/cl_json=>pretty_mode-camel_case
* type_descr =
* assoc_arrays =
* ts_as_iso8601 =
* expand_includes =
* assoc_arrays_opt =
* numc_as_string =
r_json = lv_json

data = ls_user
* compress =
* name =
pretty_name = /ui2/cl_json=>pretty_mode-camel_case
* type_descr =
* assoc_arrays =
* ts_as_iso8601 =
* expand_includes =
* assoc_arrays_opt =
* numc_as_string =
r_json = lv_json1

write: lv_json ,lv_json1.

the result of sample codes is:


And for GET query parameters you can use CL_HTTP_UTILITY to format. For example, an url like .../srv?langu=en&p1=2, you can get parameters via:


the lv_calue should be "langu=en&p1=2";

data(lt_query_fieldscl_http_utility=>string_to_fieldsstring lv_value ).

after formatted, the lt_query_fields should be

langu en
p1 2


How to handle File upload

we always use form to upload files, so how to handle?

If you upload files via form, in icf, you can get the file info form  "multiparts".

sample codes:
  data: ls_file  type if_ap_ui_file_upload_handler=>ty_file,
lt_file type if_ap_ui_file_upload_handler=>tt_file,
lv_text type string,
lv_id type string.

* get header fields
data(lv_value) = server->request->get_header_field( if_http_header_fields_sap=>query_string ).
data(lt_query_fields) = cl_http_utility=>string_to_fields( string = lv_value ).

* Number of multipart request
data(lv_num) = server->request->num_multiparts( ).

* get the file from the request
data(lv_i) = 1.
while lv_i <= lv_num.
"get the file's request
data(lo_request) = server->request->get_multipart( lv_i ).
"get file's name
data(lv_filename) = lo_request->get_header_field( if_http_header_fields_sap=>content_filename ).
if lv_filename is not initial.
ls_file-file_name = lv_filename.
"get file's mime type
ls_file-content_type = lo_request->get_header_field( 'Content-Type' ). "#EC NOTEXT
"get file's binary string
ls_file-content = lo_request->get_data( ).
append ls_file to lt_file.
lv_i = lv_i + 1.

"get other form fields without file
* formfield_encoding = 0 " CO_FORMFIELD_ENCODING_RAW / _ENCODED
source = 2
fields = lt_form " Form fields

from the sample codes, youc can get the file detail info and to do what you need to .