加入收藏 | 设为首页 | 会员中心 | 我要投稿 核心网 (https://www.hxwgxz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长百科 > 正文

oracle – PL / SQL:UTL_HTTP POST与UTF8字符串导致字符损坏

发布时间:2021-01-13 02:10:49 所属栏目:站长百科 来源:网络整理
导读:我想通过utl_http将UTF8 json字符串发送到node.js服务器.发送字符串 ["Sant Julià de Lòria"] 确实到了 ["Sant Juli??? de L???ria"] PL / SQL代码如下: FUNCTION http_post_varchar( p_url VARCHAR2,p_request_body VARCHAR2 ) RETURN VARCHAR2AS req UT

我想通过utl_http将UTF8 json字符串发送到node.js服务器.发送字符串

["Sant Julià de Lòria"]

确实到了

["Sant Juli??? de L???ria"]

PL / SQL代码如下:

FUNCTION http_post_varchar(
    p_url          VARCHAR2,p_request_body VARCHAR2 )
  RETURN VARCHAR2
AS
  req   UTL_HTTP.REQ;
  resp  UTL_HTTP.RESP;
  value VARCHAR2(32767);  -- URL to post to
  v_url VARCHAR2(200) := p_url;
  -- Post Parameters
  v_param VARCHAR2(32767) := p_request_body;
  v_param_length NUMBER := length(v_param);
BEGIN
  req := UTL_HTTP.BEGIN_REQUEST (url=> v_url,method => 'POST');
  UTL_HTTP.SET_HEADER (r      =>  req,name   =>  'Content-Type',value  =>  'application/json;charset=UTF-8');
  UTL_HTTP.SET_HEADER (r      =>   req,name   =>   'Content-Length',value  =>   v_param_length);
  UTL_HTTP.WRITE_TEXT (r      =>   req,data   =>   v_param);

  resp := UTL_HTTP.GET_RESPONSE(req);
  LOOP
    UTL_HTTP.READ_LINE(resp,value,TRUE);    
  END LOOP;
  UTL_HTTP.END_RESPONSE(resp);
  RETURN 'OK';
EXCEPTION
  WHEN UTL_HTTP.END_OF_BODY THEN
    UTL_HTTP.END_RESPONSE(resp);
  RETURN 'OK';
END http_post_varchar;

解决方法

您应该将代码更改为:

UTL_HTTP.SET_BODY_CHARSET('UTF-8');
UTL_HTTP.SET_HEADER (r      =>   req,value  =>    LENGTHB(v_param));

UTL_HTTP.WRITE_RAW (r    => req,data => UTL_RAW.CAST_TO_RAW(v_param));

由于UTF-8,LENGTHB为字节长度.否则计算的长度将为false,并且您在目标端出现错误(意外的输入结束或其他内容).

(编辑:核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读