当正文中包含表情符号时 HTTP POST 失败
HTTP POST fails when the body has emoji in it
我正在为用户在 uiTextField 中输入的任何内容执行 HTTP POST。文本在 NSString 中捕获,然后添加到 NSDictionary。然后它被转换为 JSON,最后转换为 NSData 作为 HTTP 主体的 UTF8。
如果用户输入的是纯文本,这将非常有效。但是,如果用户输入表情符号,那么它会一直工作到 HTTP POST 本身。
从 NSString 到 NSDict 到 JSON 的转换都很好。它甚至会以 UTF8 格式转换为 NSData。但是当 POST 被调用时它会抛出一个错误。这是我的代码:
它实际上是在我尝试将 JSON 转换为 NSData (UTF8) 时发生的,因此我可以将它作为 HTTP Body 传递给我从我的应用程序制作的 POST 到我的后端。这是它抛出错误的区域:
NSString *jsonPushData = [self mutDictToJson:pushData];
NSLog(@"sendMessage:jsonPushData has: %@",jsonPushData);
//NSData *requestBodyData = [NSData dataWithBytes:[jsonPushData UTF8String] length:[jsonPushData length]];
NSData *requestBodyData = [NSData dataWithBytes:[jsonPushData UTF8String] length:[jsonPushData length]];
NSMutableURLRequest *request =
[[NSMutableURLRequest alloc] initWithURL: restApiUrl
cachePolicy: NSURLRequestUseProtocolCachePolicy
timeoutInterval: 10.0];
NSLog(@"sendMessage:requestBodyData has: %@ with length: %lu",requestBodyData, [jsonPushData length]);
[request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[request setValue:[NSString stringWithFormat:@"%lu",(unsigned long)[requestBodyData length]] forHTTPHeaderField:@"Content-Length"];
[request setHTTPMethod: @"POST"];
[request setHTTPBody: requestBodyData];
returnData = [NSURLConnection sendSynchronousRequest: request returningResponse: nil error: nil];
这是node.js中的代码:
// get all the insert (accessed at POST http://localhost:8080/api/insert)
router.route('/sendMessage')
.post(function(req, res) {
console.log('-- Entered Send Message -- at:' + getDateTime());
var message = req.body.message;
console.log("tag is: " + req.body.tag + " message is: "+message)
azureNh.sendPushViaApns(req.body.tag, req.body.message);
res.write("Response from Post function");
res.end("end connection");
});
当我发送纯文本时,这按预期工作。但是当我通过 HTTP POST 从 iphone 发送表情符号时,它在 node.js 中点击了这个方法并立即抛出以下错误:它不打印第一行“--Entered sendMessage - -":
SyntaxError: Unexpected end of input
at Object.parse (native)
at parse (/home/azureuser/node_modules/body-parser/lib/types/json.js:88:17)
at /home/azureuser/node_modules/body-parser/lib/read.js:108:18
at done (/home/azureuser/node_modules/body-parser/node_modules/raw-body/index.js:239:14)
at IncomingMessage.onEnd (/home/azureuser/node_modules/body-parser/node_modules/raw-body/index.js:285:7)
at IncomingMessage.g (events.js:199:16)
at IncomingMessage.emit (events.js:104:17)
at _stream_readable.js:908:16
at process._tickCallback (node.js:355:11)
我知道 POST 没有准备好正确处理表情符号。但是我在 Xcode 中没有看到 POST 尝试的任何错误。
我迷失了,请指教如何解决这个问题。
提前致谢。
我能够解决这个问题。我在 Xcode 中做了一个小改动,使 HTTP post 被 node.js 成功接受并正确处理。这是我更改的代码行:
旧方法:
NSData *requestBodyData = [NSData dataWithBytes:[jsonPushData UTF8String] length:[jsonPushData length]];
更改为:
NSData *requestBodyData = [jsonPushData dataUsingEncoding:NSUTF8StringEncoding];
现在消息和表情符号按预期到达。
我正在为用户在 uiTextField 中输入的任何内容执行 HTTP POST。文本在 NSString 中捕获,然后添加到 NSDictionary。然后它被转换为 JSON,最后转换为 NSData 作为 HTTP 主体的 UTF8。
如果用户输入的是纯文本,这将非常有效。但是,如果用户输入表情符号,那么它会一直工作到 HTTP POST 本身。
从 NSString 到 NSDict 到 JSON 的转换都很好。它甚至会以 UTF8 格式转换为 NSData。但是当 POST 被调用时它会抛出一个错误。这是我的代码:
它实际上是在我尝试将 JSON 转换为 NSData (UTF8) 时发生的,因此我可以将它作为 HTTP Body 传递给我从我的应用程序制作的 POST 到我的后端。这是它抛出错误的区域:
NSString *jsonPushData = [self mutDictToJson:pushData];
NSLog(@"sendMessage:jsonPushData has: %@",jsonPushData);
//NSData *requestBodyData = [NSData dataWithBytes:[jsonPushData UTF8String] length:[jsonPushData length]];
NSData *requestBodyData = [NSData dataWithBytes:[jsonPushData UTF8String] length:[jsonPushData length]];
NSMutableURLRequest *request =
[[NSMutableURLRequest alloc] initWithURL: restApiUrl
cachePolicy: NSURLRequestUseProtocolCachePolicy
timeoutInterval: 10.0];
NSLog(@"sendMessage:requestBodyData has: %@ with length: %lu",requestBodyData, [jsonPushData length]);
[request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[request setValue:[NSString stringWithFormat:@"%lu",(unsigned long)[requestBodyData length]] forHTTPHeaderField:@"Content-Length"];
[request setHTTPMethod: @"POST"];
[request setHTTPBody: requestBodyData];
returnData = [NSURLConnection sendSynchronousRequest: request returningResponse: nil error: nil];
这是node.js中的代码:
// get all the insert (accessed at POST http://localhost:8080/api/insert)
router.route('/sendMessage')
.post(function(req, res) {
console.log('-- Entered Send Message -- at:' + getDateTime());
var message = req.body.message;
console.log("tag is: " + req.body.tag + " message is: "+message)
azureNh.sendPushViaApns(req.body.tag, req.body.message);
res.write("Response from Post function");
res.end("end connection");
});
当我发送纯文本时,这按预期工作。但是当我通过 HTTP POST 从 iphone 发送表情符号时,它在 node.js 中点击了这个方法并立即抛出以下错误:它不打印第一行“--Entered sendMessage - -":
SyntaxError: Unexpected end of input
at Object.parse (native)
at parse (/home/azureuser/node_modules/body-parser/lib/types/json.js:88:17)
at /home/azureuser/node_modules/body-parser/lib/read.js:108:18
at done (/home/azureuser/node_modules/body-parser/node_modules/raw-body/index.js:239:14)
at IncomingMessage.onEnd (/home/azureuser/node_modules/body-parser/node_modules/raw-body/index.js:285:7)
at IncomingMessage.g (events.js:199:16)
at IncomingMessage.emit (events.js:104:17)
at _stream_readable.js:908:16
at process._tickCallback (node.js:355:11)
我知道 POST 没有准备好正确处理表情符号。但是我在 Xcode 中没有看到 POST 尝试的任何错误。
我迷失了,请指教如何解决这个问题。
提前致谢。
我能够解决这个问题。我在 Xcode 中做了一个小改动,使 HTTP post 被 node.js 成功接受并正确处理。这是我更改的代码行:
旧方法:
NSData *requestBodyData = [NSData dataWithBytes:[jsonPushData UTF8String] length:[jsonPushData length]];
更改为:
NSData *requestBodyData = [jsonPushData dataUsingEncoding:NSUTF8StringEncoding];
现在消息和表情符号按预期到达。