使用 apollo-datasource-rest 库将 Content-Type 标头设置为 application/x-www-form-urlencoded

Posted

技术标签:

【中文标题】使用 apollo-datasource-rest 库将 Content-Type 标头设置为 application/x-www-form-urlencoded【英文标题】:Setting Content-Type header to application/x-www-form-urlencoded using apollo-datasource-rest library 【发布时间】:2019-07-06 10:30:59 【问题描述】:

有人在使用apollo-datasource-rest 设置Content-Type 标头时遇到问题吗?我正在尝试为 application/x-www-form-urlencoded 编码,但我的 REST API 仍然没有看到参数:

class AuthAPI extends RESTDataSource 
  ...

  willSendRequest( request ) 
    request.headers.set( 'X-API-KEY', this.apiKey )
    request.headers.set( 'Content-Type', 'application/x-www-form-urlencoded')
    console.log( request.headers )
    console.log( request.body )
  

  async getToken( params ) 
    return this
      .post( apiEndpoints.auth.token, params )
      .catch( err => handleError( err ))
  

输出:

// console.log( request.headers )
Headers 
  [Symbol(map)]: [Object: null prototype] 
    'X-API-KEY': [ '1234567890...' ],
    'Content-Type': [ 'application/x-www-form-urlencoded' ]
  


// console.log( request.body )

  identifier: 'my.name@domain.com',
  format: 'json',
  secret: 'P@55w0rd'

请求 (POST) 正文的格式似乎正确,并且标头设置正确。通过邮递员使用相同的凭据和标头返回成功的结果,但由于某种原因不能通过此库:

// response
 success: 0,
  error:
     status: 400,
      message: 'Missing username or password',
      code: 117
    

【问题讨论】:

【参考方案1】:

可能有点晚了,但我之前也遇到过同样的问题。如果要使用application/x-www-form-urlencoded,则需要将参数作为查询字符串,例如

class AuthAPI extends RESTDataSource 
  ...

  willSendRequest( request ) 
    request.headers.set( 'X-API-KEY', this.apiKey )
    console.log( request.headers )
    console.log( request.body )
  

  async getToken( params ) 
    return this
      .post(
          apiEndpoints.auth.token,
          'loginId=myloginId&password=12345678',
           
              headers: 
                 'Content-Type': 'application/x-www-form-urlencoded',
              ,
           
      )
      .catch( err => handleError( err ))
  

不是很好,但应该可以工作

【讨论】:

谢谢。我将查询参数设置为一个对象,但无法弄清楚为什么事情不起作用。对代码解决方案的一项更正:您不需要在 willSendRequest 和 this.post 中都设置 Content-Type 标头。 我认为您必须向我们展示您的代码才能帮助您。是的,谢谢你的更正! 这个解决方案也适用于我。

以上是关于使用 apollo-datasource-rest 库将 Content-Type 标头设置为 application/x-www-form-urlencoded的主要内容,如果未能解决你的问题,请参考以下文章

NestJS 与 Apollo 数据源

RESTDataSource - 如何知道响应来自获取请求还是缓存

测试扩展类时的 ES6 基类(超级方法)的玩笑模拟方法

测试使用

第一篇 用于测试使用

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?