【问题标题】:How To Change Encoding From ISO-8859-1 To UTF-8 for POST Request如何将 POST 请求的编码从 ISO-8859-1 更改为 UTF-8
【发布时间】: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-&gt;request-&gt;set_formfield_encoding( formfield_encoding = lr_client-&gt;request-&gt;CO_ENCODING_URL ).吗?

标签: http-post abap


【解决方案1】:

即使系统默认代码页不是 unicode,我也有关于如何正确转义 UTF-8 中的 URL 以用于发布请求的解决方案。

使用以下方法转义名称和地址,或其他可能包含非 ASCII 字符的变量。

  CALL METHOD cl_http_utility=>escape_url
    EXPORTING
      unescaped = lv_pname
      options   = 1
    receiving
      escaped   = lv_pname.

不要忘记传递选项参数,否则默认系统代码页用于转义字符串变量。

您随后可以像往常一样通过 set_form_field() 传递转义变量。

【讨论】:

    【解决方案2】:

    我无法在 Unicode ABAP 7.52 系统中重现您的问题。使用您的代码 + lc_url = 'http://dummy/dummy'.lc_uname = 'ändern'.,ICF 跟踪给出:

    POST /dummy?sUsername=%c3%a4ndern HTTP/1.0
    Content-Type: text/plain; charset=utf-8
    Content-Length: 0
    user-agent: SAP NetWeaver Application Server (1.0;752)
    host: dummy
    accept-encoding: gzip
    

    关于查询字符串,根据note 1228903 - CL_HTTP_CLIENT: Escaping of special characters in URL

    错误源代码示例:CL_HTTP_UTILITY=&gt;SET_REQUEST_URI( '/test?name=M%FCller' )
    ...
    在 Unicode 系统中,使用 UTF-8 作为字符集;在非 Unicode 系统中,使用会话的字符集。
    ...
    转义时,Unicode 系统使用 UTF8 作为代码页,非 Unicode 系统使用系统代码页。
    ...
    解决方法:可以使用REQUEST对象的SET_HEADER_FIELD方法通过伪头域“~request_uri”设置URL。

    在你的情况下,这将对应于lr_client-&gt;request-&gt;SET_HEADER_FIELD( name = '~request_uri' value = '/dummy?sUsername=%c3%a4ndern'

    【讨论】:

    • 我遇到此问题的系统是非 unicode 系统。系统默认代码页为 ISO-8859-1。关于解决方法,您仍然需要使用转义函数才能在标头字段 (~request_uri) 中设置正确的值。
    • 是的,两个答案完美互补。
    猜你喜欢
    • 2010-12-08
    • 2011-09-23
    • 2011-01-08
    • 2010-12-27
    • 1970-01-01
    • 1970-01-01
    • 2011-07-26
    • 2016-10-04
    • 2010-12-19
    相关资源
    最近更新 更多