HTTP和HTTPS接口的区别在于,HTTPS 的外部接口调用需要先用STRUST去打一下对方的证书
以下是HTTP接口的示例
TYPES: BEGIN OF TY_TOKEN,
USERNAME TYPE STRING,
PASSWORD TYPE STRING,
END OF TY_TOKEN.
TYPES: BEGIN OF TY_TOKEN_RES,
REQUESTID TYPE STRING,
MESSAGE TYPE STRING,
BODY TYPE STRING,
CODE TYPE STRING,
END OF TY_TOKEN_RES.
DATA: LS_TOKEN_RES TYPE TY_TOKEN_RES.
DATA: LS_TOKEN TYPE TY_TOKEN.
DATA: LV_RES_JSON TYPE STRING.
DATA: LV_TOKEN_JSON TYPE STRING.
DATA: LV_TOKEN_URL TYPE STRING.
DATA: LV_REQ_URL TYPE STRING.
DATA: LS_ZCA_URL TYPE ZCA_URL.
DATA: LT_ZCA_URL TYPE STANDARD TABLE OF ZCA_URL.
DATA: LO_HTTP_CLIENT TYPE REF TO IF_HTTP_CLIENT .
DATA: LV_LEN TYPE I.
DATA: LV_MESSAGE TYPE STRING.
DATA: LV_TOKEN TYPE STRING.
DATA: LV_REQ_JSON TYPE STRING
DATA: EV_MESSAGE TYPE STRING
DATA: EV_RES_JSON TYPE STRING.
SELECT *
FROM ZCA_URL
INTO TABLE LT_ZCA_URL
WHERE ZSYSTEM = '2'
AND SYSTEM_SAP = SY-MANDT.
IF SY-SUBRC NE 0.
EV_MESSAGE = 'Please maintain the url first!'.
RETURN.
ENDIF.
READ TABLE LT_ZCA_URL INTO LS_ZCA_URL
WITH KEY INTERFACEID = 'I01'.
IF SY-SUBRC NE 0.
EV_MESSAGE = 'Please maintain the token url first!' .
RETURN.
ENDIF.
"这里是获取toekn
LV_TOKEN_URL = LS_ZCA_URL-URL.
LS_TOKEN-USERNAME = LS_ZCA_URL-ACCOUNT.
LS_TOKEN-PASSWORD = LS_ZCA_URL-PASSWORD.
LV_TOKEN_JSON = /UI2/CL_JSON=>SERIALIZE( DATA = LS_TOKEN PRETTY_NAME = /UI2/CL_JSON=>PRETTY_MODE-CAMEL_CASE ). "设置小写
"创建客户端请求
CALL METHOD CL_HTTP_CLIENT=>CREATE_BY_URL
EXPORTING
URL = LV_TOKEN_URL
IMPORTING
CLIENT = LO_HTTP_CLIENT
EXCEPTIONS
ARGUMENT_NOT_FOUND = 1
PLUGIN_NOT_ACTIVE = 2
INTERNAL_ERROR = 3
OTHERS = 4.
IF SY-SUBRC <> 0.
EV_MESSAGE = 'Get token error!' .
RETURN.
ENDIF.
"设定传输请求内容格式以及编码格式
LO_HTTP_CLIENT->REQUEST->SET_CONTENT_TYPE( CONTENT_TYPE = 'application/json; charset=utf-8' ).
"设定调用服务
LO_HTTP_CLIENT->REQUEST->SET_METHOD( 'POST' ).
"设置待传输内容
LV_LEN = STRLEN( LV_TOKEN_JSON ).
CALL METHOD LO_HTTP_CLIENT->REQUEST->SET_CDATA
EXPORTING
DATA = LV_TOKEN_JSON
OFFSET = 0
LENGTH = LV_LEN.
"发送请求
LO_HTTP_CLIENT->SEND( EXCEPTIONS HTTP_COMMUNICATION_FAILURE = 1
HTTP_INVALID_STATE = 2 ).
IF SY-SUBRC <> 0.
"操作失败,获取失败原因
LO_HTTP_CLIENT->GET_LAST_ERROR( IMPORTING MESSAGE = LV_MESSAGE ).
EV_MESSAGE = LV_MESSAGE .
RETURN.
ENDIF.
"读取远程服务返回的处理过结果。
LO_HTTP_CLIENT->RECEIVE( EXCEPTIONS HTTP_COMMUNICATION_FAILURE = 1
HTTP_INVALID_STATE = 2
HTTP_PROCESSING_FAILED = 3 ).
IF SY-SUBRC <> 0 .
LO_HTTP_CLIENT->GET_LAST_ERROR( IMPORTING MESSAGE = LV_MESSAGE ).
EV_MESSAGE = LV_MESSAGE .
RETURN.
ELSE.
"读取返回返回内容
CLEAR LV_RES_JSON.
LV_RES_JSON = LO_HTTP_CLIENT->RESPONSE->GET_CDATA( ).
** deserialize JSON string json into internal table lt_flight doing camelCase to ABAP like field name mapping
/UI2/CL_JSON=>DESERIALIZE( EXPORTING JSON = LV_RES_JSON
PRETTY_NAME = /UI2/CL_JSON=>PRETTY_MODE-CAMEL_CASE
CHANGING DATA = LS_TOKEN_RES ).
LV_TOKEN = LS_TOKEN_RES-BODY.
IF LV_TOKEN IS INITIAL .
EV_MESSAGE = 'Get token error!' .
RETURN.
ENDIF.
ENDIF.
CLEAR:LS_ZCA_URL.
READ TABLE LT_ZCA_URL INTO LS_ZCA_URL
WITH KEY INTERFACEID = 'I02'.
IF SY-SUBRC NE 0.
EV_MESSAGE = 'Please maintain the invoice url first!' .
RETURN.
ENDIF.
LV_REQ_URL = LS_ZCA_URL-URL.
"开始传输数据
"创建客户端请求
CALL METHOD CL_HTTP_CLIENT=>CREATE_BY_URL
EXPORTING
URL = LV_REQ_URL
IMPORTING
CLIENT = LO_HTTP_CLIENT
EXCEPTIONS
ARGUMENT_NOT_FOUND = 1
PLUGIN_NOT_ACTIVE = 2
INTERNAL_ERROR = 3
OTHERS = 4.
IF SY-SUBRC <> 0.
IF LO_HTTP_CLIENT IS NOT INITIAL .
CALL METHOD LO_HTTP_CLIENT->GET_LAST_ERROR
IMPORTING
MESSAGE = LV_MESSAGE.
EV_MESSAGE = LV_MESSAGE .
RETURN.
ENDIF .
RETURN.
ENDIF.
CALL METHOD LO_HTTP_CLIENT->REQUEST->SET_HEADER_FIELD
EXPORTING
NAME = 'Authorization'
VALUE = LV_TOKEN.
"设定传输请求内容格式以及编码格式
LO_HTTP_CLIENT->REQUEST->SET_CONTENT_TYPE( CONTENT_TYPE = 'application/json; charset=utf-8' ).
"设定调用服务
LO_HTTP_CLIENT->REQUEST->SET_METHOD( 'POST' ).
"设置待传输内容
LV_LEN = STRLEN( LV_REQ_JSON ).
CALL METHOD LO_HTTP_CLIENT->REQUEST->SET_CDATA
EXPORTING
DATA = LV_REQ_JSON
OFFSET = 0
LENGTH = LV_LEN.
"发送请求
LO_HTTP_CLIENT->SEND( EXCEPTIONS HTTP_COMMUNICATION_FAILURE = 1
HTTP_INVALID_STATE = 2 ).
IF SY-SUBRC <> 0.
"操作失败,获取失败原因
LO_HTTP_CLIENT->GET_LAST_ERROR( IMPORTING MESSAGE = LV_MESSAGE ).
EV_MESSAGE = LV_MESSAGE .
RETURN.
ENDIF.
"读取远程服务返回的处理过结果。
LO_HTTP_CLIENT->RECEIVE( EXCEPTIONS HTTP_COMMUNICATION_FAILURE = 1
HTTP_INVALID_STATE = 2
HTTP_PROCESSING_FAILED = 3 ).
IF SY-SUBRC <> 0 .
LO_HTTP_CLIENT->GET_LAST_ERROR( IMPORTING MESSAGE = LV_MESSAGE ).
EV_MESSAGE = LV_MESSAGE .
RETURN.
ELSE.
"读取返回返回内容
CLEAR LV_RES_JSON.
LV_RES_JSON = LO_HTTP_CLIENT->RESPONSE->GET_CDATA( ).
SEARCH LV_RES_JSON FOR 'success'.
IF SY-SUBRC = 0.
EV_RES_JSON = LV_RES_JSON.
ELSE.
EV_MESSAGE = 'Send data failed'.
ENDIF.
ENDIF.
1.如何设置请求字段NAME的大小写,或者驼峰命名法
TYPES: BEGIN OF TY_TOKEN,
USERNAME TYPE STRING,
PASSWORD TYPE STRING,
END OF TY_TOKEN.
DATA: LS_TOKEN TYPE TY_TOKEN.
TYPES: BEGIN OF TY_TOKEN_CAMEL,
USER_NAME TYPE STRING,
PASS_WORD TYPE STRING,
END OF TY_TOKEN_CAMEL.
DATA: LS_TOKEN_CAMEL TYPE TY_TOKEN.
DATA: LV_UP_JSON TYPE STRING.
"name 大写
LV_UP_JSON = /UI2/CL_JSON=>SERIALIZE( DATA = LS_TOKEN ASSOC_ARRAYS = ABAP_TRUE ).
"name 小写
LV_TOKEN_JSON = /UI2/CL_JSON=>SERIALIZE( DATA = LS_TOKEN
PRETTY_NAME = /UI2/CL_JSON=>PRETTY_MODE-CAMEL_CASE ). "设置小写
"name CAMEL
LV_TOKEN_JSON = /UI2/CL_JSON=>SERIALIZE( DATA = LS_TOKEN_CAMEL
PRETTY_NAME = /UI2/CL_JSON=>PRETTY_MODE-CAMEL_CASE ). "设置驼峰
"userName passWord