Oracle PL/SQL HTTP 请求响应编码问题

时间:2021-07-01 14:17:25

标签: oracle plsql encoding oracle-apex utl-http

my previous question 之后,我似乎无法将 HTTP 响应从 Hello 19,0476190476191 World 转换为 ISO-8859-1

我正在使用 UTF-8 包来满足我的请求。 (我知道这个包使用了 APEX_WEB_SERVICE 本身,所以它的用法应该是相似的)

我做什么:

UTL_HTTP

apex_web_service.g_request_headers(1).name := 'Content-Type'; apex_web_service.g_request_headers(1).value := 'text/csv'; l_response := apex_web_service.make_rest_request( p_url => MY_URL || '/download_csv', p_http_method => 'GET' ); 包含 csv 数据,但所有 l_response'é' 都被 'è' 替换:

'¿'

如果我直接访问链接,我的浏览器会以正确的编码下载它:

Type;Groupe Acc¿Code;EOTP autoris¿Familles EOTP autoris¿;Nom;Pr¿m;Adresse

我尝试将响应转换为:

Type;Groupe Accès;Code;EOTP autorisés;Familles EOTP autorisées;Nom;Prénom;Adresse

但是完全没有效果。

该网站位于 https://www.stocknet.fr/,位于 l_response := convert(l_response, 'AL16UTF16', 'WE8ISO8859P1');

我的 Oracle NLS 参数(我显然无法修改):

ISO-8859-1

此时不知道有没有办法从plsql处理这个网站的数据。任何帮助、提示或建议将不胜感激。

1 个答案:

答案 0 :(得分:0)

原来我必须使用 UTL_HTTPDBMS_LOB 才能让 Oracle 正确解析字符。

这解决了我的问题:

DECLARE
    l_clob            CLOB;
    l_http_request    utl_http.req;
    l_http_response   utl_http.resp;
    l_text            VARCHAR2(32767);
BEGIN
    dbms_lob.createtemporary(l_clob, false);
    l_http_request := utl_http.begin_request(my_url || '/download_csv');
    l_http_response := utl_http.get_response(l_http_request);
    BEGIN
        LOOP
            utl_http.read_text(l_http_response, l_text, 32766);
            dbms_lob.writeappend(l_clob, length(l_text), l_text);
        END LOOP;
    EXCEPTION
        WHEN utl_http.end_of_body THEN
            utl_http.end_response(l_http_response);
    END;

    dbms_output.put_line(l_clob); /* => ENCODING IS FINALLY GOOD ! */
    dbms_lob.freetemporary(l_blob);
EXCEPTION
    WHEN OTHERS THEN
        utl_http.end_response(l_http_response);
        dbms_lob.freetemporary(l_blob);
        RAISE;
END;
/

我希望这可以帮助其他人。