我正在使用node-rest-client库来调用运行测试服务器中的python flask应用程序的其余API。节点设置和请求代码如下。
如果我将一个用户令牌添加到请求标题中,那么它很好,但在使用基本身份验证获取用户令牌的调用中,我的python系统成功进行身份验证并返回具有200状态的令牌,但烧瓶服务器则是将此更改为400 Bad Request。它可以使用Postman进行调用。
我的两个配置对象中是否缺少node-rest-client?
干杯。
var options_auth = {
user: "bob",
password: "password",
mimetypes: {
json: ["application/json", "application/json;charset=utf-8"]
}
};
var Client = require('node-rest-client').Client;
var client = new Client(options_auth);
var method = "/authtoken";
var args = {
headers: {
"Content-Type": "application/json",
"api-key": "asf89a7assa98d7sd98d98ds",
//"token": "dsf98s7dsf98dsf7sd98f7dsf",
"Accept": "application/json"
},
responseConfig: {
timeout: 1000 //response timeout
}
};
client.get(Api.url+method, args, function (data, response) {
// parsed response body as js object
// raw response
//console.log(response);
if(Buffer.isBuffer(data)){
data = data.toString('utf8');
}
console.log(data);
var stringData = data.toString('utf8');
console.log("String data = "+stringData);
}).on('error', function (err) {
console.error('Something went wrong with the http client', err);
});
此外,发现服务器收到的请求标头之间存在这些差异:
// Node Request fails: 400
'headers': EnvironHeaders([
('Authorization', u'Basic XXXXXXXXXXXXXX=='),
('Vga-Api-Key', u'xxxxxxxxxxxxxxxxxxxxxxxx'),
('Content-Length', u'0'),
('Connection', u'close'),
('Host', u'127.0.0.1:8080'),
('Accept', u'*/*'),
('Content-Type', u'application/json')]),
// Postman Request works: 200
'headers': EnvironHeaders([
('Authorization', u'Basic XXXXXXXXXXXXXX=='),
('Vga-Api-Key', u'xxxxxxxxxxxxxxxxxxxxxxxx'),
* ('Content-Length', u''),
* ('Connection', u'keep-alive'),
('Host', u'127.0.0.1:8080'),
* ('Cache-Control', u'no-cache'),
('Accept', u'*/*'),
('Content-Type', u''),
* ('Accept-Encoding', u'gzip, deflate')]),
答案 0 :(得分:1)
问题在于您可以直接或通过(已弃用的)Content-Type: application/json
属性间接设置标头request.get_json()
以及request.json
服务器中的可能调用。
调用get_json()
时,Flask将检查是否已在请求正文中发送了JSON有效负载,然后解析它(如果存在)。如果请求实际上在正文中包含JSON,那就没关系,但是,作为GET请求,你的请求不会。在这种情况下,其JSON期望未实现,服务器引发BadRequest
错误并返回HTTP 400错误响应。
根据您显示的内容,您的请求不需要是JSON,因为授权用户名和密码是在Authorization: Basic xxxxxxxx
标头中传递的。
解决问题的最简单方法是简单地省略内容类型标题。
或者你可以告诉Flask如果没有要通过将silent=True
传递给get_json
来解析JSON数据就不要抱怨,但这只是对这个问题进行了论证并不是一个好主意。