ASIHTTPRequest, запрос отправлен дважды - PullRequest
4 голосов
/ 30 ноября 2011

Я только начал использовать ASIHTTPRequest для iO, и у меня возникла небольшая проблема с ним. Все запросы отправляются на сервер дважды, хотя я получаю только один ответ из библиотеки на мои методы делегата.

Эта проблема возникает как в синхронных, так и в асинхронных запросах. Я использую Xcode 4 с ARC, но отключил его для ASIHTTPRequest, добавив -fno-objc-arc в качестве флагов компилятора.

Есть идеи, что случилось ..?

Код:

ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request startSynchronous];

NSError *error = [request error];
if (!error) {
}

Ответы [ 4 ]

15 голосов
/ 11 февраля 2012

Меня это тоже укусило. Я использовал запрос GET для проверки кода многоразового использования ваучера на сервере. Когда мы добавили ограничение скорости для погашения кодов, некоторые клиенты сообщили о превышении лимита раньше, чем должны были. Оказывается, что некоторые проверки вызвали два погашения.

Ваш запрос использует метод GET.

Поведение по умолчанию при использовании GET - разрешить постоянные соединения ( HTTP-заголовок Keep-Alive ).

При использовании постоянного соединения ваш GET-запрос может быть передан повторно, если что-то в сети выглядит ненадежным (это технический термин), а не просто сбой запроса. Обычно это желательно, потому что запросы GET часто не имеют побочных эффектов на сервере.

С другой стороны, запросы POST или PUT по умолчанию не используют постоянное соединение и не будут повторно передавать вашу операцию, что может быть покупкой кредитной картой или чем-то еще со значительными побочными эффектами.

Если вы хотите, чтобы ваш ASIHTTPRequest GET иногда отправлял 2 или более запросов к серверу (из-за проблем с сетью, находящихся вне вашего контроля), вы можете просто установить этот флаг:

request.shouldAttemptPersistentConnection = NO;

Это должно позаботиться о ложных дубликатах GET на сервере.

3 голосов
/ 05 декабря 2011

Спасибо за ваши ответы.Я перешел на новый MKNetworkKit и никогда не оглядывался назад на ASIHttpRequest.https://github.com/MugunthKumar/MKNetworkKit

Øystein

1 голос
/ 30 ноября 2011

Это может быть связано с тем, что постоянные соединения используются, поэтому вы видите сбойный запрос на старом соединении, за которым следует рабочий запрос на новом соединении.(GregInYEG также прав, что это может быть запрос HEAD.)

Если вы соберете трассировку сети с помощью такого инструмента, как wireshark или charlesproxy, тогда можно будет точно увидеть, что происходит.

1 голос
/ 30 ноября 2011

Это может быть отправка запроса HEAD для получения размера ответа, за которым следует запрос GET для фактического получения содержимого. См. этот раздел документации для получения дополнительной информации.

...