Как обнаружить и обработать коды Ошибки HTTP в UIWebView?

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

- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error

но это не называют, когда я получаю 404 ошибки.

19
задан Axel Guilmin 27 July 2015 в 12:36
поделиться

3 ответа

Вы можете перехватить URLRequest здесь:

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType

и передать запрос делегату, а вернуть нет. Затем в полученном ответном вызове от NSURLConnection отмените соединение и, если все в порядке (проверьте ответ), загрузите url-запрос еще раз в веб-интерфейсе. Убедитесь в том, что при повторной загрузке urlrequest необходимо вернуть YES в вышеуказанном вызове.

Не очень элегантно, но это может сработать.

9
ответ дан 30 November 2019 в 02:27
поделиться

Вы неправильно понимаете, для чего нужен параметр -didFailLoadWithError. Технически, запрос прошел успешно. Он смог обратиться к серверу и обнаружил, что запрашиваемый вами файл не существует (т.е. 404). Метод -didFailLoadWithError будет вызван, если сервер не существует, например. Ваш сервер существует. А файл - нет. Веб-представление не будет интерпретировать ошибки в содержимом. Назначение -didFailLoadWithError из Apple Docs UIWebViewDelegate таково:

Отправляется, если веб-представление не смогло загрузить содержание.

Из статьи Википедии о HTTP 404:

Сообщение об ошибке 404 или Not Found - это стандартный код ответа HTTP указывающий на то, что клиент смог взаимодействовать с сервером, но сервер не смог найти то, что было запрошено. Ошибку 404 не следует путать с "сервер не найден" или подобными ошибками, при которых соединение с целевым сервером не может быть вообще не удалось установить.

По всей вероятности, вам придется разбирать текст ответа 404, который вы могли бы получить с помощью комбинации NSURLConnection/NSURLRequest, а не веб-представления.

С наилучшими пожеланиями,

7
ответ дан 30 November 2019 в 02:27
поделиться

NSURLConnection - это класс, который вы ищете, я не думаю, что это можно сделать непосредственно в UIWebView.

Вы можете использовать синхронный метод

+ (NSData *)sendSynchronousRequest:(NSURLRequest *)request returningResponse:(NSURLResponse **)response error:(NSError **)error

Или асинхронный. Их сложнее настроить, поскольку вам нужно добавить все биты данных, которые вы получаете, в 1 NSData, но конечный результат тот же.


Независимо от того, используете ли вы синхронный или асинхронный методы:

Если вы получили объект NSError *, значит, произошла ошибка COMMS. Как отмечалось в других ответах, это НЕ код состояния HTTP, а скорее проблема связи.

Если соединение прошло успешно, вы получите NSURLResponse и NSData. Важно отметить, что NSURLResponse для HTTP-запросов на самом деле является подклассом NSHTTPURLResponse!

Затем вы должны проверить ответ, чтобы узнать код ошибки. Попробуйте это (где _responseInfo - ваш объект NSURLResponse):

  NSInteger httpStatusCode = (NSHTTPURLResponse*)_responseInfo.statusCode;

responseInfo всегда должен быть NSHTTPURLResponse для HTTP-запросов ... но вы могли бы иметь смысл иметь там assert на всякий случай.

ЕСЛИ statusCode является успешным (например, 200), тогда ваш объект NSData должен содержать данные ответа (какими бы они ни были). Если код состояния указывает на ошибку, тогда NSData может содержать текстовое описание ошибки с сервера.

NB. Я действительно не рекомендую затягивать синтаксический анализ объекта NSData на предмет сообщения об ошибке. Вот для чего нужен HTTP statusCode!

7
ответ дан 30 November 2019 в 02:27
поделиться