簡體   English   中英

沒有使用內容類型的應用程序/ JSON iOS獲得JSON響應

[英]Not getting JSON response using content-type application/JSON iOS

我已經從我的客戶那里獲得了一個REST服務,我應該為我的iOS代碼獲得JSON響應。我使用content-type作為“application / json”但是默認情況下它被視為“text / html”。 我在Mozilla瀏覽器的REST客戶端中使用“application / json”對頭部分中的content-type進行交叉檢查,我可以看到正確的響應。使用下面的代碼,我從服務器收到400錯誤。 我總是可以看到“text / html”默認用作400響應的一部分

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];

以下是我從服務器獲得的響應

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

首先觀察:

如果沒有工作請求和響應對的完整詳細信息,以及失敗的請求和響應對,則無法找到官方解決方案。 但我很確定如果你提供這些,官方的解決方案會很簡單。

測試

為了測試你的問題,我在Firefox中安裝了REST客戶端 ,並在我的開發機器上設置了一個新服務。 此外,我在OS X上使用了Charles Proxy和編輯請求功能來自定義原始請求。

我在Mozilla瀏覽器的REST客戶端中使用“application / json”對頭部分中的內容類型進行交叉檢查,我可以看到正確的響應。

奇怪的是你說它有效。 我試過了,服務器無法解析正文值。 我正在使用的服務器端平台不是ASP.NET,但我只是在進行任何平台的標准預期行為。 可能您的REST客戶端實際上並未提交標頭。 我想知道你是否將標題切換到某個任意值,如application/notjson ,看看它是否仍然application/notjson (然后我假設它是REST客戶端覆蓋)。

可能的原因

如上面引用的那樣,您給出了想要在響應Content-Type標頭中接收application/json的印象,並且您認為必須在請求中發送Content-Type標頭以匹配該響應。 不應該是必要的。 服務器應該能夠以標准格式接收您的請求,如application/x-www-form-urlencoded ,這是典型的服務器,並按照您的期望使用JSON進行響應

通常,Web服務器自然接受json作為請求體格式,同樣,它們通常接收傳入請求Content-Type of application / json。 但是 ,我已經看到了他們所做的事情。

無論如何,提交具有沖突的 Content-Type和body格式的請求絕對是一個失敗的設置。

在將標題切換到application/x-www-form-urlencoded ,我發現我的服務器測試使用您的& &email=***@***.com&deviceCode=*****&password_value=***&email=***@***.com&deviceCode=*****&password_value=***進行了回復,並使用您的& &email=***@***.com&deviceCode=*****&password_value=*** .*。應用程序/ JSON。 典型的善良。

嘗試評論出以下行:

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

或將其更改為:

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

我們試試(看我的評論):

// 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. 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM