我正在开发一款iPhone应用程序,它将使用RESTful API与Web服务进行交互。我使用NSURLConnection来完成这项工作。直到今天,网络代码才能满足我的所有需求。
对于一个实例,URL(不包括网站)是这样的:
/Listing/SearchAd?page=1&sortBy=DateDesc&q=BMW&id_category=3016&psize=20
如果“q”参数(本例中的BMW)少于3个字符,或者完全删除q参数,我的应用程序可以取回正确的数据。但是如果q有超过3个字符,它只能返回一个空数据的合法json结构。
但最奇怪的是,如果我使用另一个测试应用程序(Rested,一个用于测试REST服务的mac应用程序)来测试相同的URL,它可以获得所有正确的数据。所以它不应该是服务的问题。
我的应用中的一些代码:
NSURL *url = [[NSURL alloc] initWithString:[urlStr stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding]];
NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:url];
NSURLConnection *con = [NSURLConnection connectionWithRequest:req delegate:self];
if (con) {
NSMutableData *data = [[NSMutableData alloc] init];
self.responseData = data;
[data release];
} else {
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
}
我使用netcat并获得以下结果: (令牌字段用于对Web服务进行身份验证)
请求使用Rested:
GET /Listing/SearchAd?page=1&sortBy=DateDesc&q=BMW&id_category=3016&psize=20 HTTP/1.1
Host: localhost:2000
User-Agent: Rested/1.3 CFNetwork/520.0.13 Darwin/11.0.0 (x86_64) (MacBookPro7%2C1)
Accept: */*
Token: {E53D7DED-510A-414D-824D-3433077CF064}
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
Connection: keep-alive
使用我的应用程序的请求:
GET /Listing/SearchAd?page=1&sortBy=DateDesc&q=BMW&id_category=3016&psize=20 HTTP/1.1
Host: localhost:2000
User-Agent: Pazar/1.0 CFNetwork/485.13.9 Darwin/11.0.0
Token: {E53D7DED-510A-414D-824D-3433077CF064}
Accept: */*
Accept-Language: en-us
Accept-Encoding: gzip, deflate
Connection: keep-alive
我的应用为请求获取的原始数据只有37个字节。使用SBJsonParser进行转换后,它只是数据字段为空的根级别字典。
那可能出现什么问题?
答案 0 :(得分:1)
一些调试提示:
使用netcat -l -p 2000
并使用http://localhost:2000/
作为终端来捕获原始请求。使用Rested捕获请求并比较两者。
此外,记录您的原始响应以查看其中的真实内容。也许您的JSON转换存在问题。
修改强>
由于请求看起来相同,我们更进一步:记录代理。这是我最喜欢的netcat代理,它将localhost:3000转发到localhost:2000并记录到infile和outfile。根据需要进行修改,然后使用Rested和您的应用再次测试以查看真正的内容。:
mkfifo proxypipe
cat proxypipe | nc -l -p 3000 | tee -a inflow | nc localhost 2000 | tee -a outflow 1>proxypipe