我正在开发一个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

08-19 12:20