【问题标题】:HTTP POST fails when the body has emoji in it当正文中包含表情符号时,HTTP POST 失败
【发布时间】:2015-09-04 15:50:09
【问题描述】:

我正在为用户在 uiTextField 中输入的任何内容执行 HTTP POST。文本在 NSString 中捕获,然后添加到 NSDictionary。然后将其转换为 JSON,最后转换为 NSData 作为 HTTP 正文的 UTF8。

如果用户输入了纯文本,这将非常有效。但是,如果用户输入了表情符号,那么它会一直运行到 HTTP POST 本身。

从 NSString 到 NSDict 到 JSON 的转换都很好。它甚至被转换为 NSData 作为 UTF8。但是当调用 POST 时,它会引发错误。这是我的代码:

它实际上是在我尝试将 JSON 转换为 NSData (UTF8) 时发生的,因此我可以将它作为 HTTP 正文传递给我正在从我的应用程序到我的后端的 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 尝试的错误。

我对此感到迷茫,请告知如何解决此问题。

提前致谢。

【问题讨论】:

    标签: objective-c node.js express http-post emoji


    【解决方案1】:

    我能够解决这个问题。我在 Xcode 中做了一个小改动,这使得 HTTP 帖子能够被 node.js 成功接受并正确处理。这是我更改的代码行:

    旧方法:

    NSData *requestBodyData = [NSData dataWithBytes:[jsonPushData UTF8String] length:[jsonPushData length]];
    

    改为:

    NSData *requestBodyData = [jsonPushData dataUsingEncoding:NSUTF8StringEncoding];
    

    现在消息和表情符号按预期到达。

    【讨论】:

    • 嘿,这对我解决同样的问题很有帮助。希望我能投票 10 倍。谢谢!
    猜你喜欢
    • 2020-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-19
    • 2017-01-07
    • 2023-04-04
    • 1970-01-01
    相关资源
    最近更新 更多