我正在开发一个 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并得到以下结果: (Token字段用于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
关于iphone - iPhone 上的 REST API 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6928482/