繁体   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