我正在向Web服务发送HTTP请求,我应该获得JSON作为响应。在Objective C中,responseData不为空,但它作为JSON的序列化为null。这是我的代码:
- (IBAction)getProfileInfo:(id)sender
{
NSString *code = @"oanure!1";
//Start request
NSURL *url = [NSURL URLWithString:@"http://192.168.1.8:5000/login?json"];
ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
[request setPostValue:code forKey:@"logincode"];
[request setDelegate:self];
[request startAsynchronous];
}
- (void)requestFinished: (ASIHTTPRequest *) request{
if (request.responseStatusCode == 400){
self.profileInfo.text = @"Invalid code";
} else if (request.responseStatusCode == 403) {
self.profileInfo.text = @"Code alredy used";
} else if (request.responseStatusCode == 200) {
NSData *responseData = [request responseData];
NSLog(@"%@", responseData);
NSError *error;
//I tried with NSDictionary as well
NSArray *json = (NSArray *)
[NSJSONSerialization JSONObjectWithData:responseData
options:kNilOptions
error:&error];
NSLog(@"%@", json);
}
else {
self.profileInfo.text = @"Unexpected error";
}
}
控制台打印出来:
2013-07-02 16:30:16.047 AppName[1396:c07] <3c68746d 6c3e0a0a 3c686561 643e0a3c
7469746c 653e5072 6f66696c 65206f66 206f616e 7572653c 2f746974 6c653e0a 0a3c7363
72697074 20747970 653d2274 6578742f 6a617661 53637269 70742220 7372633d 22737461
7469632f 6a717565 7279312e 392e6a73 223e3c2f 73637269 70743e0a 0a0a3c2f 68656164
3e0a0a3c 626f6479 3e0a3c68 313e4865 6c6c6f2c 206f616e 75726521 3c2f6831 3e0a3c74
61626c65 3e0a2020 3c74723e 3c746820 636f6c73 70616e3d 323e4661 6365626f 6f6b3c2f
74683e3c 2f74723e 0a20203c 74723e0a 20202020 3c74643e 75736572 6e616d65 3c2f7464
3e3c7464 3e6f616e 7572653c 2f74643e 0a20203c 2f74723e 0a3c2f74 61626c65 3e0a3c2f
626f6479 3e0a0a3c 2f68746d 6c3e0a>
2013-07-02 16:30:16.048 AppName[1396:c07] (null)
我想我没有正确地进行序列化......
为了证明Web服务有效,我用Python编写了一个小脚本:
import httplib, urllib
params = urllib.urlencode({
'logincode' : 'oanure!1',
})
conn = httplib.HTTPConnection("192.168.1.8:5000")
conn.request("POST", "/login?json",
params)
response = conn.getresponse()
print response.status, response.reason
data = response.read()
print data
conn.close()
在这种情况下,控制台打印出来: 200好的 {“loggedin”:0,“错误”:“未登录”}
我想在Objective C中得到同样的东西。
请帮忙!
答案 0 :(得分:1)
我尝试使用十六进制转换为在线转换器的responseData,它是HTML格式(不是JSON格式)。请检查服务器端是否正确发送数据。这是转换后的responseData:
<html>
<head>
<?title>Profile of oanure</title>
<sc?ript type="text/javaScript" src="sta?tic/jquery1.9.js"></script>
</head?>
<body>
<h1>Hello, oanure!</h1>
<t?able>
<tr><th colspan=2>Facebook</?th></tr>
<tr>
<td>username</td?><td>oanure</td>
</tr>
</table>
</?body>
</html>
十六进制转换器:
http://www.string-functions.com/hex-string.aspx
其次,您可能应该打印出errMessage以检查详细错误。一旦JSON无法转换格式,它将始终将nil(null)返回给json对象。
答案 1 :(得分:0)
可能会出现类似问题,因为您正在使用URL
端口。如果是Python
,则在指定端口打开连接。也许您需要找到一个解决方案才能正确使用ASIFormDataRequest
中的端口或尝试使用其他库。