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
相关产品推荐
相关产品推荐

