2015-09-04 87 views
1

我正在爲用戶在uiTextField中輸入的任何內容做HTTP POST。文本在NSString中被捕獲,然後被添加到NSDictionary中。然後將它轉換爲JSON,最後轉換爲UTF8作爲HTTP Body的NSData。當正文中有表情符號時,HTTP POST失敗

如果用戶輸入了純文本,這個功能完美。但是,如果用戶輸入了表情符號,那麼它一直運行到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沒有準備好處理表情符號。但是在POST嘗試中,我沒有在Xcode中看到任何錯誤。

我迷路了,請指教如何解決此問題。

在此先感謝。

回答

1

我能解決這個問題。我在Xcode中做了一個小改動,並且允許HTTP post被node.js成功接受並正確處理。這裏是代碼,我改了行:

老方法:

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

將其改爲:

NSData *requestBodyData = [jsonPushData dataUsingEncoding:NSUTF8StringEncoding]; 

現在如預期中的消息和表情符號到達。

+0

嘿,這幫助了我很多與同樣的問題。希望我可以upvote 10X。謝謝! – bfich