2014-04-26 55 views
1

我都已經提供了從我的客戶一個REST服務,我應該得到JSON響應我的iOS code.I我使用content-type爲「應用/ JSON」,但不知何故它被默認作爲「text/html」。我在我的Mozilla瀏覽器中用content-type的頭文件中的「application/json」在我的一個REST客戶端中進行了交叉檢查,我可以看到正確的響應。使用下面的代碼,我得到服務器的400錯誤。我總能看到 「text/html的」 因爲默認情況下被用作400響應的一部分使用沒有得到JSON響應的內容類型的應用程序/ JSON的iOS

NSString * strBodyOnlineStart = [NSString stringWithFormat:@"&email=***@***.com&deviceCode=*****&password_value=***"]; 

     NSURL *urlOnlineStart = [NSURL 
          URLWithString:@"http://local.server/xxxxx"]; 
     NSMutableURLRequest *requestOnlineStart = [NSMutableURLRequest 
                requestWithURL:urlOnlineStart]; 


     [requestOnlineStart setValue:@"application/json" forHTTPHeaderField:@"Accept"]; 
     [requestOnlineStart setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; 

     [requestOnlineStart setHTTPMethod:@"POST"]; 
     NSData *requestBodyOnlineStart = [strBodyOnlineStart 
              dataUsingEncoding:NSUTF8StringEncoding]; 
     [requestOnlineStart setHTTPBody:requestBodyOnlineStart]; 

Below is the response which I am getting from the server

+1

嘗試改變 「應用程序/ JSON」 爲「application/JSON; charset = utf-8「並嘗試編碼您的請求正文與NSUTF8StringEncoding – startswithaj

+0

爲什麼你使用NSUTF32StringEncoding字符串編碼?你有沒有嘗試使用NSUTF8StringEncoding? –

+0

加入application/json; charset = utf-8我仍然得到了迴應(content-type text/html,status code 400)。和@Visput只有nsutf8encoding。我錯誤地輸入了 –

回答

2

我已經建立許多服務器REST服務和許多移動客戶端應用程序訪問它們並遇到類似無數次的問題。所以我知道你的痛苦,我已經用我自己的一套工具(我喜歡Windows上的Fiddler和Mac上的Charles)解決了這些問題,並且學習了許多失敗的原因。

第一觀察:

如果沒有可用的請求&響應對的全部細節,以及失敗的請求&響應對,發現官方的解決辦法是不可能的。但我很確定,如果你提供這些,官方解決方案將很簡單。

測試

要測試你的問題,我自己的計算機上安裝的Firefox REST client和設置新的服務。此外,我使用編輯請求功能在OS X上使用Charles Proxy來自定義原始請求。

我在交叉使用 「應用/ JSON」爲內容類型的標題部分我的Mozilla瀏覽器中選中該在REST客戶端,我可以看到 適當的反應。

奇怪,你說它的工作。我試過了,服務器無法解析正文值。我正在使用的服務器端平臺不是ASP.NET,但我只是談論任何平臺的標準預期行爲。可能您的REST客戶端實際上並未提交標題。我想知道你是否將頭文件轉換爲application/notjson這樣的任意值,並查看它是否仍然有效(然後我會認爲這是REST客戶端的重寫)。

可能原因

如上引用給定的,你給想收到application/json在響應Content-Type頭的印象,似乎你認爲你必須要匹配請求發送Content-Type頭那個迴應。那不應該是必要的。服務器應該能夠以標準格式接收您的請求,如application/x-www-form-urlencoded,這是典型的服務器,而以JSON響應,因爲您期望

通常,web服務器自然地接受JSON作爲請求體格式,類似地,它們通常接收應用/ JSON的傳入請求的內容類型。 但是,我見過他們這樣做的情況。

在任何情況下,提交請求與衝突內容類型和正文格式絕對是一個失敗的設置。

我發現我的服務器測試使用JSON,使用您的&email=***@***.com&deviceCode=*****&password_value=***正文,在將標頭切換爲application/x-www-form-urlencoded application/json之後進行響應。典型的善良。

代碼

嘗試註釋出以下行:

[requestOnlineStart setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; 

或更改爲:

[requestOnlineStart setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; 
+0

嘗試與應用程序/ notjson是遊戲改變者...我教頭是錯誤的。非常感謝 –

+0

@LeoJoseph酷,我很高興我能幫上忙。您是否介意詳細說明您的實際解決方案,以解決您的問題? :) –

1

讓我們嘗試(見我的評論):

// replace strBodyOnlineStart NSDictionary 
// NSString * strBodyOnlineStart = [NSString stringWithFormat:@"&email=***@***.com&deviceCode=*****&password_value=***"]; 
NSDictionary *requestObj = @{ 
          @"email": your email, 
          @"passwordValue": your password, 
          }; 

// Can you try jsonRequest with NSJSONSerialization framework (iOS framework default). 
NSData *jsonRequest = [NSJSONSerialization dataWithJSONObject:strBodyOnlineStart options:0 error:&error]; 

// your url has "/" value at the end or not??? 
NSString *url = @"http://local.server/xxxxx/"; 
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:url]]; 
[request setHTTPMethod:@"POST"]; 
[request setHTTPBody:jsonRequest]; 
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; 

//try set value like this 
[request setValue:[NSString stringWithFormat:@"%d", [jsonRequest length]] forHTTPHeaderField:@"Content-Length"]; 

// Hope this format helps you. 
+0

我在NSData * jsonRequest = ...之後得到一個sigabrt,可能是因爲直到那條線我得到任何JSON響應才能被解析。 –

+0

看到我的評論:) – nmh

相關問題