我正在开发一个连接到客户端iOS应用的后端Node应用。我遇到的唯一问题是响应数据。使用Afnetworking和子类化AFHTTPSessionManager当responseSeralizer设置为AFHTTPResponseSerializer并接受“text / html”作为内容类型时,我能够以十六进制数字的形式获取数据。但是,在将responseSeralizer设置为AFJSONResponseSerializer时出现错误,因为节点不会将数据作为json数据发送。我似乎无法让我的节点后端发送“application / json”作为内容类型。它不断地将内容类型设置为“text / html”。我的问题是如何为我收到回复的每条路线或路线完成此操作?我尝试了很多东西,到目前为止没有任何工作,但我相信Stack Overflow社区!我们走了。
iOS客户端:
self.requestSerializer = [AFJSONRequestSerializer serializer];
self.responseSerializer = [AFHTTPResponseSerializer serializer];
self.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"text/html", @"application/json", nil];
[self POST:MOBIAPIHost parameters:params success:^(NSURLSessionDataTask *task, id responseObject) {
completionBlock(responseObject);
NSLog(@"response: %@", responseObject);
} failure:^(NSURLSessionDataTask *task, NSError *error) {
NSLog(@"error %@", error);
completionBlock([NSDictionary dictionaryWithObject:[error localizedDescription] forKey:@"error"]);
}];
Node JS / Express Side:
app.post('/api/signup', function(req, res){
res.writeHead(200, {'Content-Type': 'application/json; charset=utf-8'});
res.type({ 'Content-Type': 'application/json; charset=utf-8' });
var data = {
json: "test to see if data variable goes through as json data"
}
res.json({data:data});
});
结果:
{status code: 200, headers {
"Access-Control-Allow-Headers" = "X-Requested-With, content-type, Authorization";
"Access-Control-Allow-Methods" = "GET, POST";
"Access-Control-Allow-Origin" = "*";
Connection = "keep-alive";
"Content-Length" = 1158;
"Content-Type" = "text/html; charset=utf-8";
}
}
response: <3c68746d 6c206c61 6e673d22 656e2220 6e672d61 70703d22 6d794170 70223e0a
3c686561 643e0a20 2020203c 62617365 20687265 663d272f 273e0a20 2020203c
7469746c 653e4d6f 62694d61 6c6c3c2f 7469746c 653e0a20 2020203c 6d657461
206e616d 653d2276 69657770 6f727422 20636f6e 74656e74 3d227769 6474683d
64657669 63652d77 69647468 2c20696e 69746961 6c2d7363 616c653d 312e302c
206d6178 696d756d 2d736361 6c653d31 2e302c20 75736572>
答案 0 :(得分:0)
在您的节点方面,您可以尝试:
res.writeHead(200, {
'Content-Type': 'application/json'
});
res.end(JSON.stringify(data, null, "\n"));
return;
它将返回Json作为回应。
答案 1 :(得分:0)
你可以这样设置,
NSString *contentType = [NSString stringWithFormat:@"application/json"];
[fav_URL_Request addValue:contentType forHTTPHeaderField: @"Content-Type"];
这是在Request中添加标题字段的最简单方法。
答案 2 :(得分:0)
根据Express 4.x API参考,设置Content-Type的正确方法是使用res.type
res.type('.html'); // => 'text/html'
res.type('html'); // => 'text/html'
res.type('json'); // => 'application/json'
res.type('application/json'); // => 'application/json'
res.type('png'); // => image/png:
或res.set设置任何标题
res.set('Content-Type', 'text/plain');
res.set({
'Content-Type': 'text/plain',
'Content-Length': '123',
'ETag': '12345'
});
如果只使用3.x,res.set
可用。
尝试此行res.set({ 'Content-Type': 'application/json; charset=utf-8' });
看看它是否能解决您的问题。
另一种选择是不设置'Content-Type'
标题并仅调用res.json
。快递方式将为您设置标题。