如何在Chainlink中发送携带JSON请求体的HTTP POST请求?
1. 预言机(Oracle)地址与JobID不匹配
你代码构造函数的注释中标注的Oracle地址为0x109391576634572AA0a18EE0BD3854Ad71Cf814d、JobID为a100c3e583484688be229c6883a2cac3,但实际赋值的Oracle地址为0x917d919dDD0faa12C71146E7DE9BdDD28A7e4aA0、JobID为669d8dac695d4c44b4d65397d4bd253e,如果参数和你选用的POST->Uint256任务的官方参数不一致,预言机节点不会监听到你的请求,自然不会触发回调。
请先确认任务对应的Oracle地址、JobID的正确性,二者必须完全匹配。
2. POST请求缺失必要请求头
你示例的curl命令中携带了Content-Type: application/json请求头,但合约请求中没有添加该头信息,服务端会返回415不支持的媒体类型错误,导致节点无法拿到正确响应。需要在构造请求时添加头参数:
request.add("header", "Content-Type: application/json");
3. RPC地址与目标链不匹配
你需要获取Kovan测试网的区块号,但使用的是已废弃的Rinkeby测试网RPC地址https://rinkeby-light.eth.linkpool.io/,该RPC目前已停止服务,请求无法获得有效返回。请替换为Kovan测试网的可用JSON-RPC地址,或迁移到当前仍在维护的Goerli/Sepolia测试网进行测试。
4. 十六进制返回值未配置转换逻辑
你请求的eth_blockNumber接口返回的result字段是0x开头的十六进制字符串,如果你选用的POST->Uint256任务没有默认开启十六进制转Uint256的逻辑,会导致解析失败,无法回调。需要在请求中添加转换参数,示例如下(具体参数名以任务要求为准):
request.add("hex2uint", "true");
5. 预言机访问权限问题
部分私有预言机仅对白名单地址的请求提供服务,如果你使用的是非公开预言机,需要确认你的合约地址是否已经被加入预言机的白名单。
function requestData() public returns (bytes32 requestId) { Chainlink.Request memory request = buildChainlinkRequest(jobId, address(this), this.fulfill.selector); // 替换为Kovan测试网可用的JSON-RPC地址 request.add("post", "替换为Kovan有效RPC地址"); // 新增Content-Type请求头 request.add("header", "Content-Type: application/json"); request.add("body", "{\"id\":0,\"jsonrpc\":\"2.0\",\"method\":\"eth_blockNumber\",\"params\":[]}"); request.add("path", "result"); // 新增十六进制转Uint配置 request.add("hex2uint", "true"); request.addInt("times", 1); return sendChainlinkRequestTo(oracle, request, fee); }
内容的提问来源于stack exchange,提问作者user9018759

