Проблема с REST API на iPhone - PullRequest
       27

Проблема с REST API на iPhone

0 голосов
/ 03 августа 2011

Я работаю над приложением для iPhone, которое будет взаимодействовать с веб-сервисом с помощью RESTful API. Я использую NSURLConnection, чтобы сделать работу. Код сети работал очень хорошо для всех моих потребностей до сегодняшнего дня.

Например, URL-адрес (исключая сайт) выглядит следующим образом:

/Listing/SearchAd?page=1&sortBy=DateDesc&q=BMW&id_category=3016&psize=20

Если параметр «q» (в данном примере BMW) меньше 3 символов или полностью удаляет параметр q, мое приложение может вернуть правильные данные. Но если q имеет более 3 символов, он может вернуть только легальную структуру json с пустыми данными.

Но самое странное, что если я использую другое приложение для тестирования (Rested, приложение для Mac для тестирования служб REST) ​​для проверки того же 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 используется для аутентификации для веб-службы)

Запрос с использованием 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 это только словарь корневого уровня с пустым полем данных.

Что тогда может быть не так?

1 Ответ

1 голос
/ 03 августа 2011

Некоторые советы по отладке:

Используйте netcat -l -p 2000 и используйте http://localhost:2000/ в качестве конечной точки для захвата необработанного запроса.Захватите запрос, также используя Rested, и сравните их.

Кроме того, зарегистрируйте свой необработанный ответ, чтобы увидеть, что в нем действительно есть.Возможно, у вашего преобразования JSON есть проблема.

EDIT

Поскольку запросы кажутся идентичными, давайте сделаем еще один шаг: прокси-сервер регистрации.Вот мой любимый прокси-сервер 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
...