似乎有错误的内容类型当柴HTTP POST操作(Seem to Have the Wrong Con

2019-09-26 07:40发布

我期待利用柴HTTP的一些测试。 当然,我想测试更比不过我的GET我似乎试图使职位时被击中的主要障碍。

在试图弄清楚为什么我的帖子没有工作,我开始打他们针对POST测试服务器。

下面是使用测试完全不同的工具链(茉莉花节点和弗里斯比)(即工作得很好)格式化的POST尝试:

frisby.create('LOGIN')
  .post('http://posttestserver.com/post.php', {
    grant_type:'password',
    username:'helllo@world.com',
    password:'password'
  })
  .addHeader("Token", "text/plain")
  .expectStatus(200)
  })
.toss();

这会导致:

Time: Mon, 27 Jun 16 13:40:54 -0700
Source ip: 204.191.154.66

Headers (Some may be inserted by server)
REQUEST_URI = /post.php
QUERY_STRING = 
REQUEST_METHOD = POST
GATEWAY_INTERFACE = CGI/1.1
REMOTE_PORT = 19216
REMOTE_ADDR = 204.191.154.66
HTTP_CONNECTION = close
CONTENT_LENGTH = 64
HTTP_HOST = posttestserver.com
HTTP_TOKEN = text/plain
CONTENT_TYPE = application/x-www-form-urlencoded
UNIQUE_ID = V3GPVkBaMGUAAB1Uf04AAAAc
REQUEST_TIME_FLOAT = 1467060054.9575
REQUEST_TIME = 1467060054

Post Params:
key: 'grant_type' value: 'password'
key: 'username' value: 'hello@world.com'
key: 'password' value: 'password'
Empty post body.

Upload contains PUT data:
grant_type=password&username=hello%40world.com&password=password

这里是用柴柴-HTTP POST一个尝试。 我希望这个工作一样用茉莉和弗里斯比上面的例子,但是,你会看到实际的请求在几个方面有所不同。

describe('/post.php', function() {

  var endPointUnderTest = '/post.php';

  it('should return an auth token', function(done) {
    chai.request('http://posttestserver.com')
      .post(endPointUnderTest)
      .set('Token', 'text/plain')
      .send({
        grant_type: 'password',
        username: 'hello@world.com',
        password: 'password'
      })
      .end(function(err, res) {
        console.log(res);
        res.should.have.status(200);
        done();
      });
  });
});

这会导致:

Time: Tue, 28 Jun 16 06:55:50 -0700
Source ip: 204.191.154.66

Headers (Some may be inserted by server)
REQUEST_URI = /post.php
QUERY_STRING = 
REQUEST_METHOD = POST
GATEWAY_INTERFACE = CGI/1.1
REMOTE_PORT = 1409
REMOTE_ADDR = 204.191.154.66
HTTP_CONNECTION = close
CONTENT_LENGTH = 76
CONTENT_TYPE = application/json
HTTP_TOKEN = text/plain
HTTP_USER_AGENT = node-superagent/2.0.0
HTTP_ACCEPT_ENCODING = gzip, deflate
HTTP_HOST = posttestserver.com
UNIQUE_ID = V3KB5kBaMGUAAErPF6IAAAAF
REQUEST_TIME_FLOAT = 1467122150.9125
REQUEST_TIME = 1467122150

No Post Params.

== Begin post body ==
{"grant_type":"password","username":"hello@world.com","password":"password"}
== End post body ==

Upload contains PUT data:
{"grant_type":"password","username":"hello@world.com","password":"password"}

注意在CONTENT_TYPE,post数据的差异,放在特定的数据(我觉得这是我的问题的来源)。

凡茉莉花/弗里斯比将使用“应用程序/ x-WWW的形式了urlencoded”格式提交POST,柴HTTP似乎是使用“应用/ JSON的”格式。

上午我莫名其妙地滥用柴HTTP的POST能力? 抑或柴HTTP不允许“应用/的X WWW的形式进行了urlencoded” POST请求? 我似乎并不能够解决这一点,它是最后一关,我跳到过渡到采用摩卡/柴工具链我的测试(这是我们的目标,我宁愿不使用一个不同的库,除非它是绝对必要)。

Answer 1:

已经柴HTTP的Git的-中心页上进一步讨论这个问题,我能发现,这是预期行为的SuperAgent ,柴HTTP的引擎盖下的HTTP请求库,它会自动检测基于内容类型是什么样的数据包含在。发送()调用。

我偶然发现这个特殊的问题 ,以及这有助于澄清内容类型之间的差异实际上是。

如果别人运行到这个问题,我已经了解到,柴HTTP的POST请求,可以很容易地改变(荣誉给meeber的帮助这里 )使用这样的电话:

//Override auto-detection by specifying the header explicitly
.set('content-type', 'application/x-www-form-urlencoded')

//Select the type 'form'
.type('form')

//Pass multiple strings in send instead of using an object
.send('grant_type=password')
.send('username=hello@world.com')
.send('password=password')

创建看起来像这样的请求:

describe('/post.php', function() {

  var endPointUnderTest = '/post.php';

  it('should return an auth token', function(done) {
    chai.request('http://posttestserver.com')
      .post(endPointUnderTest)
      .set('Token', 'text/plain')
      .set('content-type', 'application/x-www-form-urlencoded')
      .type('form')
      .send('grant_type=password')
      .send('username=hello@world.com')
      .send('password=password')
      .end(function(err, res) {
        console.log(res);
        res.should.have.status(200);
        done();
      });
  });
});


文章来源: Seem to Have the Wrong Content Type When POSTing with Chai-HTTP