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

PL/SQL调用DVLA API发送HTTP POST请求时请求体格式引发ENQ103错误问题求助

解决PL/SQL调用DVLA API返回ENQ103错误的问题

你遇到的核心问题是JSON请求体的格式转义错误——代码里用了HTML实体"来表示双引号,但DVLA API期望的是原生JSON格式的双引号,这就导致API无法正确解析请求中的车牌字段,最终返回"Invalid format for field"错误。

问题分析

你的代码里这段请求体写法有误:

v_content varchar2(4000):= '{ "registrationNumber": "SOME_REG"}';

"是HTML场景下对双引号的转义符,但在纯JSON请求中,我们需要直接使用双引号。而在PL/SQL中,因为字符串是用单引号包裹的,所以双引号不需要额外转义,可以直接写入字符串。

修改后的代码

把请求体改成原生JSON格式,去掉HTML转义即可:

declare
  v_req utl_http.req;
  v_res utl_http.resp;
  v_url varchar2(4000) := 'https://driver-vehicle-licensing.api.gov.uk/vehicle-enquiry/v1/vehicles';
  v_buffer varchar2(4000);
  -- 使用原生JSON双引号,无需HTML转义
  v_content varchar2(4000):= '{"registrationNumber": "SOME_REG"}';
begin
  utl_http.set_wallet('file:/path/to/wallet', 'Wallet_Password');
  v_req := utl_http.begin_request(v_url, 'POST');
  utl_http.set_header(v_req, 'x-api-key', 'My_API_Key');
  -- 建议明确指定UTF-8字符集,避免编码差异导致解析失败
  utl_http.set_header(v_req, 'content-type', 'application/json; charset=utf-8');
  utl_http.write_text(v_req, v_content);
  v_res := utl_http.get_response(v_req);
  begin
    loop
      utl_http.read_line(v_res, v_buffer);
      dbms_output.put_line(v_buffer);
    end loop;
    utl_http.end_response(v_res);
  exception
    when utl_http.end_of_body then
      utl_http.end_response(v_res);
  end;
end;
/

额外检查项

  • 确认SOME_REG替换成了真实有效的车牌号码(你在其他工具中成功调用,这一步应该没问题,但可以再核对)
  • 确保数据库服务器能正常访问DVLA API的域名,且UTL_HTTP的网络权限配置正确
  • 验证钱包路径和密码无误(既然Postman等工具能成功,这部分大概率没问题,但可以再确认PL/SQL访问钱包的权限)

这样修改后,API应该能正确识别请求中的registrationNumber字段,返回正常的响应。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 20:37:39