PL SQL UTL_HTTP Restful Web服务调用不起作用

时间:2016-09-19 12:05:23

标签: encoding plsql oracle11g character-encoding encode

我创建了一个使用UTL_HTTP包从Oracle 11.2服务器调用restful Web服务的过程。这是一个帖子请求,我发送一个阿拉伯语值以及定义为varchar2的其他数据。

阿拉伯字符串作为" ????发送????",到我在日志记录中检查的Web服务。我将主体设置为UTF-8,数据库服务器字符集为" AR8ISO8859P6"。

我尝试了转换功能和所有可能的方法。我无法弄清楚如何解决它。

查找以下代码。

  t_request_body :=
         '{
 "ArabicValue":"'
      || p_arabic_value
      || '",
 "EnglishValue":"'
      || p_english_value
      || '"
}';

   UTL_HTTP.set_transfer_timeout (5);
   t_http_req :=
      UTL_HTTP.begin_request
         ('webservice_url',
          'POST',
          'HTTP/1.1'
         );
   /*Describe in the request-header*/
   UTL_HTTP.SET_BODY_CHARSET('UTF-8');
   UTL_HTTP.set_header (t_http_req, 'Content-Type', 'application/json;charset=UTF-8');
   UTL_HTTP.set_header (t_http_req, 'Content-Length', LENGTH (t_request_body));
   UTL_HTTP.set_header (t_http_req, 'TransactionId', t_transaction_id);
   UTL_HTTP.set_header (t_http_req, 'Accept', 'application/xml');

   /*Put the data in de body of the request*/
   UTL_HTTP.write_text (t_http_req, t_request_body);
/*Web service call*/
   t_http_resp := UTL_HTTP.get_response (t_http_req);
/*Reading transaction id from header*/
   UTL_HTTP.get_header_by_name (t_http_resp, 'TransactionId', t_trans);

英文值参数正在传递给Web服务。阿拉伯语价值正在变为" ????? ????&#34 ;.我尝试在oracle中使用转换函数将其转换为UTF-8。它也不起作用。

1 个答案:

答案 0 :(得分:0)

使用以下内容:

length_bytes:= length(utl_raw.convert(utl_raw.cast_to_raw(t_request_body),'AL32UTF8','AR8ISO8859P6');

UTL_HTTP.set_header(t_http_req,'Content-Length',length_bytes);

UTL_HTTP.write_raw(t_http_req,t_request_body);