【发布时间】:2019-09-06 17:44:12
【问题描述】:
我正在尝试将 HTTP PUT 发送到远程 API 以更新数据。
我在 IBM i V7R3M0 上,使用 SQL 命令 SYSTOOLS.HTTPPUTCLOB。当我在 Postman 中进行类似测试时(针对相同的 URL、相同的标头、正文中的相同 JSON),远程数据更新成功。
但是使用 SYSTOOLS.HTTPPUTCLOB(:myUrl, :myHdr, :myRequest),我得到了响应,但没有更改任何数据。
对于此测试,我正在尝试更新客户的城市和邮政编码。
IBM 说 CLOB 参数是 CCSID 1208,所以这就是我正在使用的。 https://www.ibm.com/support/knowledgecenter/en/ssw_ibm_i_74/rzajq/rzajqudfhttpputclob.htm
我包含 CCSID 37 只是为了便于阅读。我尝试传递 CCSID 37 参数,而不是指定 CCSID,但这些都没有改善结果。
**free
dcl-s customers char(7);
dcl-s url varchar(2000);
dcl-s response varchar(5000);
dcl-s reqClob SQLTYPE(CLOB:5000) ccsid(1208);
dcl-s hdrClob SQLTYPE(CLOB:5000) ccsid(1208);
dcl-s reqClob37 SQLTYPE(CLOB:5000) ccsid(37);
dcl-s hdrClob37 SQLTYPE(CLOB:5000) ccsid(37);
customers = 'TEST123'; //my test customer
// format a JSON document
exec sql select json_object(
'zip' value '98756',
'city' value 'Chicago'
)
into :reqClob
from SYSIBM.SYSDUMMY1;
url = 'https://*remoteapi*/customers/'+%Trim(customers);
// format my XML headers
exec sql
with T(tname, tvalue) as (Values
('Authorization', 'Basic *mybase64id*'),
('x-client-id', '111111'),
('x-customer-primary-key', 'customer_number'))
SELECT
XMLGROUP(RTRIM(T.tname) AS "name", RTRIM(T.tvalue) AS "value"
OPTION ROW "header" ROOT "httpHeader" AS ATTRIBUTES)
INTO :hdrClob
From T ;
// convert so I can read it in debug
exec sql select :reqClob INTO :reqClob37 from sysibm.sysdummy1;
exec sql select :hdrClob INTO :hdrClob37 from sysibm.sysdummy1;
// PUT it
exec SQL
select SYSTOOLS.HTTPPUTCLOB(:url, :hdrClob, :reqClob)
into :response
from SYSIBM.SYSDUMMY1;
*inlr = *on;
return;
我在“response”变量中成功接收到客户信息。但是 city 和 zip 值是来自远程站点的旧值,并且站点上的值保持不变。 SQLCOD 和 SQLSTT 值为零。
再次,当我在 Postman 中执行相同操作时,响应具有我的新值,并且数据在远程站点上更新。
在我看来,第三个参数(在本例中为“reqClob”)被忽略了。使用 Postman 之类的工具时,第三个参数中的 JSON 文档不应该使用与正文中相同的 HTTP PUT 进行更新吗?
*编辑 ...试图获得更多信息以运行详细版本 HTTPPUTCLOBVERBOSE。我添加了这段代码
dcl-s verboseHdr SQLTYPE(CLOB:5000) ccsid(37);
exec SQL
select varchar(responseMsg,2048), varchar(responseHttpHeader,1024)
into :response, :verboseHdr
from table (
SYSTOOLS.HTTPPUTCLOBVERBOSE(:url2, :hdrClob, :reqClob));
“verboseHdr”变量包含此标头信息:
<?xml version="1.0" encoding="UTF-8" ?><httpHeader responseCode="200"><responseMessage>OK</responseMessage><header name="HTTP_RESPONSE_CODE" value="HTTP/1.1 200 OK"/><header name="Server" value="Apache/2.4.25 (Ubuntu)"/><header name="Cache-Control" value="no-cache"/><header name="X-Content-Type-Options" value="nosniff"/><header name="Connection" value="keep-alive"/><header name="Vary" value="Authorization"/><header name="Content-Length" value="688"/><header name="Date" value="Fri, 06 Sep 2019 19:32:07 GMT"/><header name="Content-Type" value="application/json"/></httpHeader>
【问题讨论】:
-
有什么回应?
-
请注意,HTTP 函数在幕后使用 Java……因为在作业中启动 JVM 会有开销,所以它会一直存在。因此,请重新考虑是否在大量交互式作业或短期批处理作业中使用。
-
考虑使用Working with JSON in RPG 文章中所述的开源HTTP API 和YAJL 端口
-
响应头看起来不错,但您仍然没有显示响应中的内容。
-
你的邮递员身体是什么样的?
标签: api db2 db2-400 rpgle http-put