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.