0

I have created a custom API using python and it's running on http://127.0.0.1:5000/ . I have tried the code below for the given URL and it works. However, when I use the URL to the local host and the corresponding API parameters it stops working. I guess this problem is because the Chainlink node doesn't see my local host.

My question is: How do I make a GET request to an API running on local host using Chainlink?

I would appreciate any help.

// SPDX-License-Identifier: MIT

pragma solidity ^0.6.6;

import "@chainlink/contracts/src/v0.6/ChainlinkClient.sol";

contract APIConsumer is ChainlinkClient {


uint256 public volume;

address private oracle;
bytes32 private jobId;
uint256 private fee;

/**
 * Network: Kovan
 * Oracle: 0x2f90A6D021db21e1B2A077c5a37B3C7E75D15b7e
 * Job ID: 29fa9aa13bf1468788b7cc4a500a45b8
 * Fee: 0.1 LINK
 */
constructor(address _oracle, string memory _jobId, uint256 _fee, address _link) public {
    if (_link == address(0)) {
        setPublicChainlinkToken();
    } else {
        setChainlinkToken(_link);
    }
    // oracle = 0x2f90A6D021db21e1B2A077c5a37B3C7E75D15b7e;
    // jobId = "29fa9aa13bf1468788b7cc4a500a45b8";
    // fee = 0.1 * 10 ** 18; // 0.1 LINK
    oracle = _oracle;
    jobId = stringToBytes32(_jobId);
    fee = _fee;
}

/**
 * Create a Chainlink request to retrieve API response, find the target
 * data, then multiply by 1000000000000000000 (to remove decimal places from data).
 */
function requestVolumeData() public returns (bytes32 requestId) 
{
    Chainlink.Request memory request = buildChainlinkRequest(jobId, address(this), this.fulfill.selector);
    
    // Set the URL to perform the GET request on
    request.add("get", "https://min-api.cryptocompare.com/data/pricemultifull?fsyms=ETH&tsyms=USD");
    
    // Set the path to find the desired data in the API response, where the response format is:
    // {"RAW":
    //   {"ETH":
    //    {"USD":
    //     {
    //      "VOLUME24HOUR": xxx.xxx,
    //     }
    //    }
    //   }
    //  }
    request.add("path", "RAW.ETH.USD.VOLUME24HOUR");
    
    // Multiply the result by 1000000000000000000 to remove decimals
    int timesAmount = 10**18;
    request.addInt("times", timesAmount);
    
    // Sends the request
    return sendChainlinkRequestTo(oracle, request, fee);
}

/**
 * Receive the response in the form of uint256
 */ 
function fulfill(bytes32 _requestId, uint256 _volume) public recordChainlinkFulfillment(_requestId)
{
    volume = _volume;
}

function stringToBytes32(string memory source) public pure returns (bytes32 result) {
    bytes memory tempEmptyStringTest = bytes(source);
    if (tempEmptyStringTest.length == 0) {
        return 0x0;
    }

    assembly {
        result := mload(add(source, 32))
    }
}
}
4

1 回答 1

0

If you are using someone else's node (ie one from market.link) to do a HTTPGET, then yes they don't know about your locally running API. You have a couple options:

  1. Publish the API as a serverless function on the cloud (ie google cloud), then you get a public facing URL that cabe used in your request
  2. Run your own chainlink node, in which case you can then access your local API (as the node is also local)

In either case, if your project ever goes to mainnet, you'll want to have the API somewhere that can be publicly accessed

于 2021-08-18T00:59:24.937 回答