Как отправить сообщение http с запросом тела json в цепочке?

#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. Ах, я не видел, чтобы ты добавлял тело. ДА. Это, вероятно, что-то не так.