环回:使用REST连接器使用json数据发送请求

时间:2017-02-14 21:20:19

标签: json node.js rest datasource loopback

我想在Loopback应用程序中从第三方REST服务获取数据。为了从Service获取数据,我需要首先使用登录名和密码进行身份验证。我可以使用curl测试服务:

Host: http://api.awesome.service.com/
User-Agent: curl/7.47.0
Accept: */*
Cookie: HBFAPI_SESSID=hbapi%3A197887%3A58a3028d12c36%3Anym2
Content-Length: 58
Content-Type: application/x-www-form-urlencoded

{"auth":{"username":"MyUser","password":"Secret"}}

这很有效。 Tcpdump显示这样的请求:

{
    "awesome_datasource": {
    "name": "awesome_datasource",
    "baseURL": "https://api.awesome.service.com/",
    "crud": false,
    "connector": "rest",
    "operations": [{
        "template": {
            "method": "POST",
            "url": "http://api.awesome.service.com/auth",
            "form":{
                 "auth": {
                     "username": "{username:string}",
                     "password": "{password:string}"
                 }
            },
            "json": true
        },
        "functions":{
            "login": ["username", "password"]
        }
    }]
  } 
}

所以,我先创建了数据源:

host: api.awesome.service.com
content-type: application/x-www-form-urlencoded
accept: application/json
content-length: 66 
Connection: close

auth%5Busername%5D=MyUser&auth%5Bpassword%5D=Secret

我使用资源管理器进行了测试。无论我做什么,我都无法将请求体中的数据格式化为json。有或没有json选项结果是相同的,在tcpdump中是:

https://github.com/strongloop/loopback-connector-rest/pull/12

我已尝试将参数传递为'query','form'或'data'选项。还检查了各种标题内容类型选项,但到目前为止没有运气。

模型很简单,没有参数。基本模型是'模型'(没有用户,因为我希望尽可能保持简单)

我能够找到这个帖子,但它没有多大帮助:

{{1}}

非常感谢任何建议。

1 个答案:

答案 0 :(得分:1)

你所要做的就是在那里使用json代替form

{
    "awesome_datasource": {
    "name": "awesome_datasource",
    "baseURL": "https://api.awesome.service.com/",
    "crud": false,
    "connector": "rest",
    "operations": [{
        "template": {
            "method": "POST",
            "url": "http://api.awesome.service.com/auth",
            "json": {
                 "auth": {
                     "username": "{username:string}",
                     "password": "{password:string}"
                 }
            }
        },
        "functions":{
            "login": ["username", "password"]
        }
    }]
  } 
}

REST连接器尝试尽可能地模仿request module。基本上bodyjsonformquery(请求中为qs)执行与请求选项相同的操作,但它们也接受模板字符串。这是来自请求的文档,稍作修改:

  • query(请求中为qs) - 包含要附加到uri的查询字符串值的对象
  • body - PATCH,POST和PUT请求的实体主体。必须是BufferStringReadStream。如果jsontrue,则body必须是JSON可序列化对象。
  • form - 在传递对象或查询字符串时,会将body设置为值的查询字符串表示形式,并添加Content-type: application/x-www-form-urlencoded标头。如果没有选项,则返回FormData实例(并通过管道传递请求)。请参阅"表格"以上部分。
  • json - 将body设置为值的JSON表示,并添加Content-type: application/json标头。另外,将响应主体解析为JSON。