2014-04-26 29 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

相关问题