The Chainlink Chinese Developer Hub

Welcome to the Chainlink Chinese developer hub. You'll find comprehensive guides and documentation to help you start working with Chainlink Chinese as quickly as possible, as well as support if you get stuck. Let's jump right in!

Get Started    

开发者

外部适配器的开发人员需要知道Chainlink节点如何从中请求数据,以及如何为响应格式化数据。外部适配器可以用任意语言编写,甚至可以在不同的机器上运行,以包含无服务器功能。

请求数据

当外部适配器接收到了来自于Chainlink节点的请求,JSON负载数据将会包涵iddata两个对象。

{"id":"278c97ffadb54a5bbb93cfec5f7b5503","data":{}}

如果节点定义了桥接响应地址(Bridge Response URL),负载数据中会包括一个"responseURL"字段,可以通过PATCH请求更新响应。

{
  "id": "278c97ffadb54a5bbb93cfec5f7b5503",
  "data": {},
  "responseURL": "http://localhost:6688/v2/runs/278c97ffadb54a5bbb93cfec5f7b5503"
}

可以在规范中指定附加数据以供适配器使用。这对于从REST端点请求数据非常有用,其中可以由请求者指定键和值。比如如果REST端点地址路径要求如下:

https://example.com/api/:parent/:child

发到外部适配器的负载数据:

{
  "id": "278c97ffadb54a5bbb93cfec5f7b5503",
  "data": {
    "parent": "myParentValue",
    "child": "myChildValue"
  }
}

适配器可以用这些值来动态的更新:parent:child,为请求构建URL。同样的方法也可以应用到URL参数中:

https://example.com/api/?parent=myParentValue&child=myChildValue

返回数据

当外部适配器有响应数据时,需要将包括给定的jobRunID在内额响应负载数据返回给节点。在适配器中,通过将给定id的值映射到名为jobRunID的返回数据中的新字段,即可完成此操作。
下面是一个响应数据的例子:

{
  "jobRunID": "278c97ffadb54a5bbb93cfec5f7b5503",
  "data": {
    "symbol": "ETH-USD",
    "last": {
      "price": 467.85,
      "size": 0.01816561,
      "timestamp": 1528926483463
    }
  },
  "status": "completed",
  "error": null,
  "pending": false
}

返回错误

如果端点返回了已知错误,错误会在响应数据中返回给Chainlink节点。
一个含有错误的响应数据例子:

{
  "jobRunID": "278c97ffadb54a5bbb93cfec5f7b5503",
  "data": {},
  "status": "errored",
  "error": "The endpoint is under maintenance.",
  "pending": false
}

完整例子

下面是一个无服务器功能(serverless function)的外部适配器的完整例子。这个外部适配器接受两个输入字段,API key作为header插入,返回结果数据给节点。

let request = require('request');

exports.myExternalAdapter = (req, res) => {
  const url = "https://some-api.example.com/api";
  const coin = req.body.data.coin || "";
  const market = req.body.data.market || "";
  let requestObj = {
    coin: coin,
    market: market
  };
  let headerObj = {
    "API_KEY": "abcd-efgh-ijkl-mnop-qrst-uvwy"
  };
  let options = {
      url: url,
      headers: headerObj,
      qs: requestObj,
      json: true
  };

  request(options, (error, response, body) => {
    if (error || response.statusCode >= 400) {
        let errorData = {
            jobRunID: req.body.id,
            status: "errored",
            error: body
        };
        res.status(response.statusCode).send(errorData);
    } else {
      let returnData = {
        jobRunID: req.body.id,
        data: body
      };
      res.status(response.statusCode).send(returnData);
    }
  });
};

如果输入参数是 coin:"ETH"和market:"USD",这个外部适配器将会构建如下请求的URL:

https://some-api.example.com/api?coin=ETH&market=USD

这个例子中的请求头(header)会包含API key,按说如果需要将key添加到URL中,也可以通过将key添加到requestObj中来实现。

Updated about a year ago

开发者


Suggested Edits are limited on API Reference Pages

You can only suggest edits to Markdown body content, but not to the API spec.