How to set custom HTTP headers to requests made by a WKWebView

天涯浪子 提交于 2021-02-07 12:05:58

问题


I have built an app that includes a WKWebView, and the website that the web view loads supports multiple languages. How can I change the Accept-Language header in a WKWebView, or other HTTP headers for that matter?


回答1:


I've got it working in a way, but only get requests will have the custom header. As jbelkins answered in the linked so from Gabriel Cartiers comment to your question, you will have to manipulate the request and load it anew.

I've got it working for GET-Requests like this:

(it's in xamarin 0> c#, but i think you will get the idea)

i've created a private field

private bool _headerIsSet

which i check every time a request is made in the deligate method:

[Foundation.Export("webView:decidePolicyForNavigationAction:decisionHandler:")]
    public void DecidePolicy(WKWebView webView, WKNavigationAction navigationAction, Action<WKNavigationActionPolicy> decisionHandler)
    {
        var request = navigationAction.Request;
        // check if the header is set and if not, create a muteable copy of the original request
        if (!_headerIsSet && request is NSMuteableUrlRequest muteableRequest);              
        {
            // define your custom header name and value
            var keys = new object[] {headerKeyString};
            var values = new object[] {headerValueString};
            var headerDict = NSDictionary.FromObjectsAndKeys(values, keys);
            // set the headers of the new request to the created dict
            muteableRequest.Headers = headerDict;
            _headerIsSet = true;
            // attempt to load the newly created request
            webView.LoadRequest(muteableRequest);
            // abort the old one
            decisionHandler(WKNavigationActionPolicy.Cancel);
            // exit this whole method
            return;
        }
        else
        {
            _headerIsSet = false;                
            decisionHandler(WKNavigationActionPolicy.Allow);
        }
    }

As i said, this only works for GET-Requests. Somehow, POST-Requests don't contain the body data of the original request (request.Body and request.BodyStream are null), so the muteableRequest (which is a muteable copy of the original request) won't contain the body data of the original request.

I hope this will help you or others that approach the same problem.

Edit: For your needs, set "Accept-Language" as the key




回答2:


  1. WKWebView supports localization out of the box. You will not be required set the 'Accept-Language' header field.

  2. For some reason if you are required to, this is how it can be done.

Create a 'URLRequest' an instance of URL initialized with the desired website

var request = URLRequest(url: url)

Maintain a mapping of locales required and set the 'Accept-Language' header field accordingly

request.setValue("de-de", forHTTPHeaderField: "Accept-Language")

Load the 'URLRequest' using an instance of 'WKWebView'

webview.load(request)
  1. Similarly any header field can be changed


来源:https://stackoverflow.com/questions/36868935/how-to-set-custom-http-headers-to-requests-made-by-a-wkwebview

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!