You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle APEX调用Signit API时阿拉伯字符JSON请求失败问题

问题分析与解决方案

核心问题在于阿拉伯字符属于Unicode字符集,当PL/SQL生成的JSON请求未以UTF-8编码正确传递给Signit API时,网关无法解析字符导致400错误。以下是针对性解决步骤:

1. 确认Oracle数据库字符集

先检查数据库是否使用UTF-8编码(AL32UTF8),执行查询:

SELECT value FROM nls_database_parameters WHERE parameter = 'NLS_CHARACTERSET';

若结果不是AL32UTF8,需确保存储阿拉伯字符的字段使用NVARCHAR2类型(而非VARCHAR2),避免字符转码丢失或错误。

2. 修正HTTP请求的Content-Type头

显式指定请求体编码为UTF-8,强制网关用正确编码解析内容,在PL/SQL调用API时添加:

utl_http.set_header(req, 'Content-Type', 'application/json; charset=utf-8');

3. 确保JSON生成时的字符编码正确

  • 手动拼接JSON时,避免用VARCHAR2存储含阿拉伯字符的内容,改用NVARCHAR2后转换为UTF-8字节流发送:
DECLARE
  l_json_nvarchar NVARCHAR2(4000) := '{"signerName": "علي محمد"}';
  l_json_utf8 VARCHAR2(4000);
BEGIN
  l_json_utf8 := utl_raw.cast_to_varchar2(utl_i18n.string_to_raw(l_json_nvarchar, 'AL32UTF8'));
  -- 后续使用l_json_utf8作为请求体发送
END;
  • 使用Oracle 12c+原生JSON函数(如JSON_OBJECT)时,确保输入字符串为NVARCHAR2类型,函数会自动生成UTF-8兼容的JSON:
SELECT JSON_OBJECT('documentTitle' VALUE CAST('وثيقة تجارية' AS NVARCHAR2(20))) AS json FROM dual;

4. 验证请求体的UTF-8编码

发送前可将JSON转换为十六进制,检查阿拉伯字符的编码是否正确:比如ع的UTF-8十六进制为D8B9、ل为D8B4、ي为D98A,确保这些编码存在于请求体中,而非乱码值。

修正后的PL/SQL代码示例

DECLARE
  l_req UTL_HTTP.REQ;
  l_resp UTL_HTTP.RESP;
  l_json NVARCHAR2(4000) := '{"documentTitle": "وثيقة تجارية", "signerName": "علي محمد"}';
  l_json_utf8 VARCHAR2(4000);
BEGIN
  -- 转换为UTF-8编码
  l_json_utf8 := utl_raw.cast_to_varchar2(utl_i18n.string_to_raw(l_json, 'AL32UTF8'));
  
  l_req := UTL_HTTP.BEGIN_REQUEST('https://api.signit.example.com/create-document', 'POST');
  UTL_HTTP.SET_HEADER(l_req, 'Content-Type', 'application/json; charset=utf-8');
  UTL_HTTP.SET_HEADER(l_req, 'Authorization', 'Bearer YOUR_API_TOKEN');
  UTL_HTTP.WRITE_TEXT(l_req, l_json_utf8);
  
  l_resp := UTL_HTTP.GET_RESPONSE(l_req);
  -- 处理响应逻辑...
  UTL_HTTP.END_RESPONSE(l_resp);
EXCEPTION
  WHEN UTL_HTTP.END_OF_BODY THEN
    UTL_HTTP.END_RESPONSE(l_resp);
END;
/

内容的提问来源于stack exchange,提问作者Karam Alem

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 14:54:55