【发布时间】:2021-01-29 16:22:43
【问题描述】:
我想问一下如何更改 POST 请求的 URL 编码(从 ISO-8859-1 到 UTF-8)。
现在我的代码如下:
cl_http_client=>create_by_url(
EXPORTING
url = lc_url
IMPORTING
client = lr_client
EXCEPTIONS
argument_not_found = 1
plugin_not_active = 2
internal_error = 3
OTHERS = 4 ).
IF sy-subrc <> 0.
MESSAGE e020(rest_core_texts).
EXIT.
ENDIF.
lr_client->request->set_method( method = if_http_entity=>co_request_method_post ).
lr_client->request->set_content_type( content_type = 'text/plain; charset=utf-8' ).
lr_client->request->set_form_field( name = 'sUsername' value = lc_uname ).
Etc..
CALL METHOD lr_client->send
EXCEPTIONS
http_communication_failure = 1
http_invalid_state = 2
http_invalid_timeout = 3
http_processing_failed = 4
OTHERS = 5.
IF sy-subrc NE 0.
MESSAGE i400(sclnt_http).
EXIT.
ENDIF.
POST 请求中的一个表单字段包含人名,这些人名可能包含德语变音符号 (ä,ö,ü)。然后使用 ISO 代码页而不是 UTF 对生成的 URL 进行编码,并且外部系统希望它以 UTF 编码。
结果是外部系统以错误的方式存储名称(例如 Gr%e4%df),因为 URL 是使用 ISO-8859-1 而不是 UTF-8 编码的。 p>
这很可能是由于系统默认使用 ISO-8859-1 造成的(表:TCP0C)。
现在,我尝试使用类 CL_ABAP_CODEPAGE 将保存名称的变量从字符串转换为 xstring,反之亦然,因为没有方法可以直接将字符串变量转换为不同的代码页。
很遗憾,这并没有取得任何成功。
我的第二个猜测是尝试将 http 请求正文转换为 UTF,但我没有找到任何合适的方法或可以使用的功能模块。
任何建议将不胜感激!
编辑:
- 该系统是非 Unicode 系统。
- 系统代码页为 ISO-8859-1。
【问题讨论】:
-
全部按照percent-encoding保存好。对方需要以正确的方式解码这个post请求。停止尝试您正在尝试的东西,需要正确解码此 POST-Request 的是绳索的另一端。
-
您需要检查 URL 标准并要求您的合作伙伴系统正确处理请求(使用一些 URLdecode 函数,而不是“按原样”)。以下是来自RFC3986, Section 2.1 的引用:当八位组的对应字符超出允许范围时,使用百分比编码机制来表示组件中的数据八位组。 2.2 和 2.3 节描述了保留和非保留字符(它们总共是允许的字符)。因此,如果没有百分比编码,就无法在 URL 中传递 unicode 代码点。
-
@SandraRossi "UTF-8 对应于 U+00E4 即 %E4" 我不认为这种说法是正确的。 UTF-8 ä 转换为百分比编码对应于 %C3%A4,其中 ISO-8859-1 中的百分比编码对应于 %E4。我已经通过这个在线编码工具dencode.com/en/string/url-encoding 进行了检查
-
@Jagger 感谢您的支持。百分比编码很好,但是,目前是变音符号,即 ä 被编码为 %E4,即 ISO-8859-1 百分比编码,而目标系统期望它是 %C3%A4,这将对应于 UTF-8 百分比编码。
-
不知道行不行,可以试试
lr_client->request->set_formfield_encoding( formfield_encoding = lr_client->request->CO_ENCODING_URL ).吗?