我正在开发一个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进行转换后,它只是根级字典,数据字段为空。
那有什么可能是错的呢?
最佳答案
一些调试技巧:
使用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