#http #post #chainlink
Вопрос:
Я уже научился отправлять запрос http get из документа chainlink, но я не знаю, как отправить запрос http post.
Например, когда мы хотим получить номер блока тестовой сети Kovan, мы можем выполнить команду curl:
curl https://rinkeby-light.eth.linkpool.io/
-X POST
-d '{"method":"eth_blockNumber","params":[],"id":1,"jsonrpc":"2.0"}'
-H "Content-Type: application/json"
и тогда мы получим такой ответ:
{"jsonrpc":"2.0","id":1,"result":"0x919cd2"}
в result
ответе указан номер блока.
Я нахожу ПОСТ->Uint256 >задание тестовой сети Кована, а затем смоделированное на примере кода http get
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;
import "@chainlink/contracts/src/v0.8/ChainlinkClient.sol";
/**
* THIS IS AN EXAMPLE CONTRACT WHICH USES HARDCODED VALUES FOR CLARITY.
* PLEASE DO NOT USE THIS CODE IN PRODUCTION.
*/
contract APIConsumer is ChainlinkClient {
using Chainlink for Chainlink.Request;
uint256 public blockNumber;
address private oracle;
bytes32 private jobId;
uint256 private fee;
/**
* Network: Kovan
* Oracle: 0x109391576634572AA0a18EE0BD3854Ad71Cf814d (Fibodor kovan)
* Job ID: a100c3e583484688be229c6883a2cac3
* Fee: 0.1 LINK
*/
constructor() {
setPublicChainlinkToken();
oracle = 0x917d919dDD0faa12C71146E7DE9BdDD28A7e4aA0;
jobId = "669d8dac695d4c44b4d65397d4bd253e";
fee = 0.1 * 10 ** 18; // (Varies by network and job)
}
/**
* Create a Chainlink request to retrieve API response, find the target data
*/
function requestData() public returns (bytes32 requestId)
{
Chainlink.Request memory request = buildChainlinkRequest(jobId, address(this), this.fulfill.selector);
// Set the URL to perform the POST request on
request.add("post", "https://rinkeby-light.eth.linkpool.io/");
request.add("body", "{"id":0,"jsonrpc":"2.0","method":"eth_blockNumber","params":[]}");
// Set the path to find the desired data in the API response, where the response format is:
// {
// "jsonrpc": "2.0",
// "id": 1,
// "result": "0x919cd2"
// }
request.add("path", "result");
// no need to multiply
request.addInt("times", 1);
// Sends the request
return sendChainlinkRequestTo(oracle, request, fee);
}
/**
* Receive the response in the form of uint256
*/
function fulfill(bytes32 _requestId, uint256 _blockNumber) public recordChainlinkFulfillment(_requestId)
{
blockNumber = _blockNumber;
}
// function withdrawLink() external {} - Implement a withdraw function to avoid locking your LINK in the contract
}
Я развернул контракт с remix в Коване по адресу и финансировал его с помощью ссылки 0.2. Все готово , и я вызываю requestData
успешную отправку tx, но я не вижу обратного вызова oracle, и blockNumber
он всегда равен нулю.
Пожалуйста, помогите мне, где мой код неверен.
Комментарии:
1. Ваш код выглядит правильно… возможно, узел не работает. Вы проверили, не отключен ли их узел?
2. Я попробовал некоторые другие узлы kovan, но все еще не работают, я заметил, что в документе httppost говорится
Headers amp; Body Currently not available on-chain. Available for job specs only.
, что, возможно, мы не можем добавить парам «тело» в контракт.3. Ах, я не видел, чтобы ты добавлял тело. ДА. Это, вероятно, что-то не так.