SAP调用外部API

发布于:2025-07-24 ⋅ 阅读:(17) ⋅ 点赞:(0)

SAP需求将中文字符转化为对应的拼音

具体思路,由于sap中没有将中文字符转化为拼音的函数或方法类,则以http请求访问外部服务器发布的API服务,然后获取其返回值即可

1.调用外部网站上提供的api

缺点:免费次数有限,后需要充值

这里是用www格式的json报文

*&---------------------------------------------------------------------*
*& Report ZABAP081
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZABAP081.
DATA: LO_HTTP_CLIENT TYPE REF TO IF_HTTP_CLIENT,
      LV_URL         TYPE STRING VALUE 'https://eolink.o.apispace.com/zh-han2py/api/v1/forward/pinyin',
      LV_REQUEST     TYPE STRING,
      LV_HETERONYM   TYPE STRING.
DATA: IV_STYLE        TYPE C VALUE 5,
      IV_CHINESE_TEXT TYPE STRING VALUE '中文',
      IV_HETERONYM    TYPE STRING VALUE  'False',
      EV_PINYIN       TYPE STRING,
      EV_STATUS_CODE  TYPE INT2,
      EV_RESPONSE     TYPE STRING,
      MV_API_TOKEN    TYPE STRING VALUE 'dtaao2z0ve7nwr1myq8b4piq8bf91q51',
       lv_encoded TYPE string.

" 设置多音字参数
LV_HETERONYM = COND #( WHEN IV_HETERONYM = ABAP_TRUE THEN 'True' ELSE 'False' ).

*lv_encoded = cl_http_utility=>escape_url( IV_CHINESE_TEXT ).


" 创建HTTP客户端
CL_HTTP_CLIENT=>CREATE_BY_URL(
  EXPORTING
    URL                = LV_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_STATUS_CODE = 500.
  EV_RESPONSE = 'HTTP客户端创建失败'.
  RETURN.
ENDIF.

" 设置请求头
LO_HTTP_CLIENT->REQUEST->SET_METHOD( 'POST' ).
LO_HTTP_CLIENT->REQUEST->SET_HEADER_FIELD(
  NAME  = 'X-APISpace-Token'
  VALUE = MV_API_TOKEN ).
LO_HTTP_CLIENT->REQUEST->SET_HEADER_FIELD(
  NAME  = 'Content-Type'
  VALUE = 'application/x-www-form-urlencoded' ).

" 构建请求体
CONCATENATE 'text=' IV_CHINESE_TEXT
       INTO LV_REQUEST.

" 设置请求体
LO_HTTP_CLIENT->REQUEST->SET_CDATA( LV_REQUEST ).

" 发送请求
LO_HTTP_CLIENT->SEND(
  EXCEPTIONS
    HTTP_COMMUNICATION_FAILURE = 1
    HTTP_INVALID_STATE         = 2
    HTTP_PROCESSING_FAILED     = 3
    HTTP_INVALID_TIMEOUT       = 4
    OTHERS                     = 5 ).

IF SY-SUBRC <> 0.
  EV_STATUS_CODE = 500.
  EV_RESPONSE = '请求发送失败'.
  RETURN.
ENDIF.

" 接收响应
LO_HTTP_CLIENT->RECEIVE(
  EXCEPTIONS
    HTTP_COMMUNICATION_FAILURE = 1
    HTTP_INVALID_STATE         = 2
    HTTP_PROCESSING_FAILED     = 3
    OTHERS                     = 4 ).

IF SY-SUBRC <> 0.
  EV_STATUS_CODE = 500.
  EV_RESPONSE = '响应接收失败'.
  RETURN.
ENDIF.

" 获取响应状态和内容
*EV_STATUS_CODE = LO_HTTP_CLIENT->RESPONSE->GET_CONTENT_TYPE( ).
EV_RESPONSE = LO_HTTP_CLIENT->RESPONSE->GET_CDATA( ).

" 关闭连接
LO_HTTP_CLIENT->CLOSE( ).

" 解析响应
*IF EV_STATUS_CODE = 200.
  " 假设API返回JSON格式: {"code":0,"data":{"pinyin":"..."}}
  IF EV_RESPONSE IS NOT INITIAL.
  DATA: LV_JSON TYPE STRING,
        LS_DATA TYPE /UI2/CL_JSON=>JSON.

  LV_JSON = EV_RESPONSE.
  /UI2/CL_JSON=>DESERIALIZE(
    EXPORTING
      JSON = LV_JSON
    CHANGING
      DATA = LS_DATA ).
ENDIF.
*  IF LS_DATA-DATA IS NOT INITIAL.
*    EV_PINYIN = LS_DATA-DATA-PINYIN.
*  ELSE.
*    EV_PINYIN = ''.
*  ENDIF.
*ENDIF.

2.使用java或python内部自开发相应的逻辑,然后生成api,放到对应的内部服务器上

要求需要自行写相关逻辑,并需要部署到内部服务器上,但是可定制性大大增加

这里相关服务不方便展示

代码如下

*&---------------------------------------------------------------------*
*& Report ZABAP082
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZABAP082.

DATA: LO_HTTP_CLIENT TYPE REF TO IF_HTTP_CLIENT,
      LV_URL         TYPE STRING VALUE 'http://xxxxxxxxxxxxxxxxx/convert',
      LV_REQUEST     TYPE STRING,
      LV_REQUEST1     TYPE STRING,
      LV_HETERONYM   TYPE STRING VALUE 'false'.
DATA: IV_STYLE        TYPE STRING VALUE 'normal',
      IV_CHINESE_TEXT TYPE STRING VALUE '搜索',
      IV_HETERONYM    TYPE ABAP_BOOL VALUE  abap_false,
      EV_PINYIN       TYPE STRING,
      EV_STATUS_CODE  TYPE INT2,
      EV_RESPONSE     TYPE STRING.


TYPES: BEGIN OF ty_pinyin_request,
         text      TYPE string,
*         style     TYPE string,
*         heteronym TYPE abap_bool,
*         heteronym TYPE STRING,
       END OF ty_pinyin_request.

   DATA:       lv_encoded TYPE string,
    ls_request TYPE ty_pinyin_request,
*    ls_request TYPE string,
        lv_json    TYPE string.

" 创建HTTP客户端
CL_HTTP_CLIENT=>CREATE_BY_URL(
  EXPORTING
    URL                = LV_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_STATUS_CODE = 500.
  EV_RESPONSE = 'HTTP客户端创建失败'.
  RETURN.
ENDIF.

" 设置请求头

LO_HTTP_CLIENT->REQUEST->SET_METHOD( 'POST' ).

*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' ).

ls_request-text = IV_CHINESE_TEXT.

lv_json = /ui2/cl_json=>serialize(
    data             = ls_request
    compress         = abap_false  " 不压缩输出
    pretty_name      = /ui2/cl_json=>pretty_mode-low_case  " 保持字段名小写
).


  IF sy-subrc = 0.
 LV_REQUEST = lv_json.
  ENDIF.


" 设置请求体
LO_HTTP_CLIENT->REQUEST->SET_CDATA( LV_REQUEST ).

" 发送请求
LO_HTTP_CLIENT->SEND(
  EXCEPTIONS
    HTTP_COMMUNICATION_FAILURE = 1
    HTTP_INVALID_STATE         = 2
    HTTP_PROCESSING_FAILED     = 3
    HTTP_INVALID_TIMEOUT       = 4
    OTHERS                     = 5 ).

IF SY-SUBRC <> 0.
  EV_STATUS_CODE = 500.
  EV_RESPONSE = '请求发送失败'.
  RETURN.
ENDIF.

" 接收响应
LO_HTTP_CLIENT->RECEIVE(
  EXCEPTIONS
    HTTP_COMMUNICATION_FAILURE = 1
    HTTP_INVALID_STATE         = 2
    HTTP_PROCESSING_FAILED     = 3
    OTHERS                     = 4 ).

IF SY-SUBRC <> 0.
  EV_STATUS_CODE = 500.
  EV_RESPONSE = '响应接收失败'.
  RETURN.
ENDIF.

" 获取响应状态和内容
*EV_STATUS_CODE = LO_HTTP_CLIENT->RESPONSE->GET_CONTENT_TYPE( ).
EV_RESPONSE = LO_HTTP_CLIENT->RESPONSE->GET_CDATA( ).
write EV_RESPONSE.


网站公告

今日签到

点亮在社区的每一天
去签到