Лучший способ перехвата запроса WebView в Android

Я использую WebView в своем приложении, в котором я должен перехватывать запросы. В настоящее время я использую код follwing для этого.

public WebResourceResponse shouldInterceptRequest (WebView view, String url) {
    HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();
    conn.setRequestProperty("User-Agent", userAgent);

    String mime;
    if (url.lastIndexOf('.') > url.lastIndexOf('/')) {
        String ext = url.substring(url.lastIndexOf('.') + 1);
        mime = MimeTypeMap.getSingleton().getMimeTypeFromExtension(ext);
    } else {
       mime = "text/html";
    }
    return new WebResourceResponse(mime, "UTF-8", conn.getInputStream());
}

В большинстве случаев выше код работает нормально, но не все. Например, когда я пытаюсь войти в Outlook, это просто показывает, что мой адрес электронной почты или пароль неверны, я также видел другие случаи, когда запросы разбиваются, но все работает нормально, если я удаляю shouldInterceptRequest.

Есть ли лучший способ, которым я в настоящее время пользуюсь для перехвата запросов?

Ответы

Ответ 1

Есть два вопроса с кодом

  • Неправильное обнаружение расширений

Например, когда код пытается получить расширение ресурса для этого URL-адреса:

https://login.live.com/login.srf?wa=wsignin1.0&rpsnv=12&ct=1442476202&rver=6.4.6456.0&wp=MBI_SSL_SHARED&wreply=https:%2F%2Fmail.live.com%2Fdefault.aspx%3Frru%3Dinbox&lc=1033&id=64855&mkt=en-us&cbcxt=mai

Он вернет aspx%3Frru%3Dinbox&lc=1033&id=64855&mkt=en-us&cbcxt=mai, что неверно. Существует специальный метод для получения расширения из URL-адреса: getFileExtensionFromUrl()

  1. В соответствии с методом документации MimeTypeMap.getSingleton().getMimeTypeFromExtension(ext) может вернуться null. В этом случае ваш код задает неправильный тип mime для страницы.

Вот код метода, который учитывает обе эти проблемы.

@Override
public WebResourceResponse shouldInterceptRequest(WebView view,
    String url) {
    String ext = MimeTypeMap.getFileExtensionFromUrl(url);
    String mime = MimeTypeMap.getSingleton().getMimeTypeFromExtension(ext);
    if (mime == null) {
        return super.shouldInterceptRequest(view, url);
    } else {
        HttpURLConnection conn = (HttpURLConnection) new URL(
                                                 url).openConnection();
        conn.setRequestProperty("User-Agent", userAgent);
        return new WebResourceResponse(mime, "UTF-8",
                                                 conn.getInputStream());
    }
}