没有使用内容类型的应用程序/ JSON iOS获得JSON响应

时间:2014-04-26 11:34:54

标签: ios json rest-client

我的客户已收到REST服务,我应该对我的iOS代码进行JSON响应。我正在使用content-type作为" application / json& #34;但不知何故,它被视为" text / html"默认情况下。我使用" application / json"在我的Mozilla浏览器中的REST客户端中交叉检查了这一点。对于标题部分中的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];

Below is the response which I am getting from the server

2 个答案:

答案 0 :(得分:2)

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

首先观察:

没有工作要求的全部细节&响应对,以及失败的请求&响应对,找到官方解决方案是不可能的。但我很确定如果你提供这些,官方的解决方案会很简单。

<强>测试

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

  

我在Mozilla浏览器中使用REST交叉检查这个   &#34;应用/ JSON&#34;对于标题部分中的内容类型,我可以   看到正确的回应。

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

可能的原因

如上面的引文所示,您给出的印象是希望在回复application/json标题中收到Content-Type,而您似乎认为必须在Content-Type标题中发送application/x-www-form-urlencoded标题请求匹配该响应。 不应该是必要的。服务器应该能够以&email=***@***.com&deviceCode=*****&password_value=***的标准格式接收您的请求,这是典型的服务器,而以您期望的方式响应JSON。

通常,网络服务器自然地接受json作为请求正文格式,同样,它们通常接收传入请求Content-Type of application / json。 但是,我已经看到了他们所做的事情。

在任何情况下,提交带有冲突内容类型和正文格式的请求绝对是一个失败的设置。

在将标题切换为application/x-www-form-urlencoded,application / json之后,我发现我的服务器测试使用您的 [requestOnlineStart setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; 正文使用JSON进行响应。典型的善良。

<强>代码

尝试评论出以下一行:

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

或将其更改为:

{{1}}

答案 1 :(得分: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.