SAP调用外部API
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(EXPORTINGURL = LV_URLIMPORTINGCLIENT = LO_HTTP_CLIENTEXCEPTIONSARGUMENT_NOT_FOUND = 1PLUGIN_NOT_ACTIVE = 2INTERNAL_ERROR = 3OTHERS = 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_TEXTINTO LV_REQUEST." 设置请求体 LO_HTTP_CLIENT->REQUEST->SET_CDATA( LV_REQUEST )." 发送请求 LO_HTTP_CLIENT->SEND(EXCEPTIONSHTTP_COMMUNICATION_FAILURE = 1HTTP_INVALID_STATE = 2HTTP_PROCESSING_FAILED = 3HTTP_INVALID_TIMEOUT = 4OTHERS = 5 ).IF SY-SUBRC <> 0.EV_STATUS_CODE = 500.EV_RESPONSE = '请求发送失败'.RETURN. ENDIF." 接收响应 LO_HTTP_CLIENT->RECEIVE(EXCEPTIONSHTTP_COMMUNICATION_FAILURE = 1HTTP_INVALID_STATE = 2HTTP_PROCESSING_FAILED = 3OTHERS = 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(EXPORTINGJSON = LV_JSONCHANGINGDATA = 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(EXPORTINGURL = LV_URLIMPORTINGCLIENT = LO_HTTP_CLIENTEXCEPTIONSARGUMENT_NOT_FOUND = 1PLUGIN_NOT_ACTIVE = 2INTERNAL_ERROR = 3OTHERS = 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_requestcompress = 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(EXCEPTIONSHTTP_COMMUNICATION_FAILURE = 1HTTP_INVALID_STATE = 2HTTP_PROCESSING_FAILED = 3HTTP_INVALID_TIMEOUT = 4OTHERS = 5 ).IF SY-SUBRC <> 0.EV_STATUS_CODE = 500.EV_RESPONSE = '请求发送失败'.RETURN. ENDIF." 接收响应 LO_HTTP_CLIENT->RECEIVE(EXCEPTIONSHTTP_COMMUNICATION_FAILURE = 1HTTP_INVALID_STATE = 2HTTP_PROCESSING_FAILED = 3OTHERS = 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.