【问题标题】:Not getting JSON response using content-type application/JSON iOS使用内容类型应用程序/JSON iOS 未获得 JSON 响应
【发布时间】:2014-04-26 11:34:54
【问题描述】:

我的客户向我提供了REST 服务,我应该得到JSON 对我的iOS 代码的响应。我使用content-type 作为“应用程序/json”,但不知何故它被视为“文本/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];

【问题讨论】:

  • 尝试将 "application/json" 更改为 "application/json; charset=utf-8" 并尝试使用 NSUTF8StringEncoding 对您的请求正文进行编码
  • 你为什么使用 NSUTF32StringEncoding 字符串编码?您是否尝试使用 NSUTF8StringEncoding?
  • 通过添加application/json; charset=utf-8 我仍然得到响应(内容类型文本/html,状态码 400)。和 @Visput 仅它的 nsutf8encoding。我打错了
  • ASP Web 服务在发送 json 响应之前未对其进行编码。再次检查 API
  • 哪个 API?是 iOS 代码 API 还是服务器 API?并且响应在 Firefox REST 客户端 @Malloc 中正确出现

标签: ios json rest-client


【解决方案1】:

我已经构建了许多服务器 REST 服务和许多移动客户端应用程序来访问它们并无数次遇到此类问题。所以我知道你的痛苦,我已经用我自己的工具集解决了这些问题(我喜欢 Windows 上的 Fiddler 和 Mac 上的 Charles),并了解了许多失败的原因。

第一次观察:

如果没有有效的请求和响应对以及失败的请求和响应对的完整详细信息,就不可能找到官方解决方案。但我很确定如果你提供了这些,官方的解决方案会很简单。

测试

为了测试您的问题,我在 Firefox 中安装了REST client,并在我的开发机器上设置了一个新服务。此外,我在 OS X 上使用带有编辑请求功能的 Charles Proxy 来自定义原始请求。

我在 Mozilla 浏览器的 REST 客户端中使用 标题部分中的内容类型为“application/json”,我可以 查看正确的响应。

奇怪的是你说它有效。我试过了,服务器无法解析正文值。我使用的服务器端平台不是 ASP.NET,但我只是在使用任何平台的标准预期行为。可能您的 REST 客户端实际上并未提交标头。我想知道您是否将标头切换为诸如application/notjson 之类的任意值并查看它是否仍然有效(然后我假设它是 REST 客户端覆盖)。

可能的原因

如上面的引用所示,您给人的印象是希望在响应 Content-Type 标头中接收 application/json,并且您似乎认为您必须在请求中发送 Content-Type 标头以匹配该响应。这不应该是必要的。服务器应该能够以application/x-www-form-urlencoded 的标准格式接收您的请求,这是服务器的典型格式,并且按照您的期望使用 JSON 响应

通常,Web 服务器自然接受 json 作为请求正文格式,同样,它们通常接收传入的请求 Content-Type of application/json。 但是,我见过他们这样做的案例。

无论如何,提交具有冲突 Content-Type 和正文格式的请求绝对是失败的设置。

在将标头切换到 application/x-www-form-urlencoded、application/json 后,我发现我的服务器测试使用您的 &email=***@***.com&deviceCode=*****&password_value=*** 正文响应 JSON。典型的善良。

代码

尝试注释掉以下行:

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

或将其更改为:

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

【讨论】:

  • 尝试使用 application/notjson 改变了游戏规则...我教 header 是错误的。非常感谢
  • @LeoJoseph 很酷,我很高兴能帮上忙。您介意详细说明您的实际解决方法是什么,以解决您的问题吗? :)
【解决方案2】:

让我们试试(见我的评论):

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

【讨论】:

  • 在 NSData *jsonRequest = ... 之后我得到了一个 sigabrt
猜你喜欢
  • 1970-01-01
  • 2017-08-06
  • 2015-04-21
  • 2018-09-05
  • 1970-01-01
  • 2011-02-18
  • 2020-05-25
  • 2017-11-17
  • 2022-10-15
相关资源
最近更新 更多