2017-01-26 9 views
6

मैं shouldInterceptRequest का उपयोग करएंड्रॉयड: WebView shouldInterceptRequest WebView में RequestProperties नहीं जोड़ने

नीचे

लौटने मेरी WebResourceResponse

@TargetApi(Build.VERSION_CODES.LOLLIPOP) 
    private static WebResourceResponse handleRequestViaUrlOnly(WebResourceRequest webResourceRequest){ 
     String url = webResourceRequest.getUrl().toString(); 
     Log.i("intercepting req....!!!", url); 
     String ext = MimeTypeMap.getFileExtensionFromUrl(url); 
     String mime = MimeTypeMap.getSingleton().getMimeTypeFromExtension(ext); 

     try { 
      HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection(); 
      conn.setRequestProperty("Sample-Header", "hello"); 
      conn.setDoOutput(true); 
      conn.setDoInput(true); 
      conn.setUseCaches(false); 
      return new WebResourceResponse(mime, "UTF-8", conn.getInputStream()); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     return null; 
    } 

मैं अपने CustomWebViewClient अंदर इस विधि कॉल के लिए अपने कोड है वेबव्यू से अनुरोध अवरोध उत्पन्न कर रहा हूँ

class CustomWebViewClient extends WebViewClient { 

    @TargetApi(Build.VERSION_CODES.LOLLIPOP) 
    @Override 
    public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) { 
     return handleRequestViaUrlOnly(request); 
    } 
} 

हालांकि, जब मैं क्रोम में वेबव्यू रिमोट डीबगर से अनुरोध शीर्षलेखों की जांच करता हूं: // निरीक्षण/# उपकरण।

अतिरिक्त अनुरोध प्रॉपर्टी जो मैंने जोड़ा है वह मौजूद नहीं है।

conn.setRequestProperty("Sample-Header", "hello"); 

नमूना-शीर्षलेख वेबव्यू में अनुरोध शीर्षलेख में मौजूद नहीं है।

क्या मुझे कुछ याद आ रही है? मैं किसी भी मदद की सराहना करूंगा।

+0

खुराक यह आईओ अपवाद ब्लॉक में चला जाता है:

यहाँ सरल कोड है कि प्रतिक्रिया से WebResourceResponse हेडर का निर्माण और इसे करने के लिए अपने कस्टम हेडर में संलग्न कर देगा है? –

+0

नहीं, यह इस नए यूआरएल (यूआरएल) को कॉल नहीं करता है। ओपन कनेक्शन() को IOException को पकड़ने की आवश्यकता है। – Aaron

+0

बस इस विधि को कॉल करने का पूरा कोड पोस्ट करें? –

उत्तर

0

तो समस्या यह है कि जब आप conn.getInputStream() पास कर रहे हैं तो यह केवल डेटा देता है। प्रतिक्रिया शीर्षलेख conn.getHeaderFields() द्वारा निकाला जा सकता है। इसके अलावा आप अपने अतिरिक्त शीर्षलेख को तब तक प्राप्त नहीं कर पाएंगे जब तक कि सर्वर इसका समर्थन न करे और CORS शामिल न हो। यहां कनेक्शन

GET /~fdc/sample.html HTTP/1.1 
Sample-Header: hello 
Content-Type: application/x-www-form-urlencoded 
User-Agent: Dalvik/2.1.0 (Linux; U; Android 7.1; Android SDK built for x86_64 Build/NPF26K) 
Host: www.columbia.edu 
Connection: Keep-Alive 
Accept-Encoding: gzip 
Content-Length: 0 

HTTP/1.1 200 OK 
Date: Wed, 01 Mar 2017 09:06:58 GMT 
Server: Apache 
Last-Modified: Thu, 22 Apr 2004 15:52:25 GMT 
Accept-Ranges: bytes 
Vary: Accept-Encoding,User-Agent 
Content-Encoding: gzip 
Content-Length: 8664 
Keep-Alive: timeout=15, max=99 
Connection: Keep-Alive 
Content-Type: text/html 

आप देख सकते हैं जवाब में कोई Sample-Header: hello हैडर है की wireshark उत्पादन होता है।

webView.setWebViewClient(new WebViewClient() { 
    private Map<String, String> convertResponseHeaders(Map<String, List<String>> headers) { 
     Map<String, String> responseHeaders = new HashMap<>(); 
     responseHeaders.put("Sample-Header", "hello"); 

     for (Map.Entry<String, List<String>> item : headers.entrySet()) { 
      List<String> values = new ArrayList<String>(); 

      for (String headerVal : item.getValue()) { 
       values.add(headerVal); 
      } 
      String value = StringUtil.join(values, ","); 
      Log.e(TAG, "processRequest: " + item.getKey() + " : " + value); 

      responseHeaders.put(item.getKey(), value); 
     } 

     return responseHeaders; 
    } 

    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) 
    @Override 
    public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) { 
     final String method = request.getMethod(); 
     final String url = request.getUrl().toString(); 
     Log.d(TAG, "processRequest: " + url + " method " + method); 
     String ext = MimeTypeMap.getFileExtensionFromUrl(url); 
     String mime = MimeTypeMap.getSingleton().getMimeTypeFromExtension(ext); 

     try { 
      HttpURLConnection conn = (HttpURLConnection)new URL(url).openConnection(); 
      conn.setRequestMethod(method); 
      conn.setRequestProperty("Sample-Header", "hello"); 
      conn.setDoInput(true); 
      conn.setUseCaches(false); 

      Map<String, String> responseHeaders = convertResponseHeaders(conn.getHeaderFields()); 

      responseHeaders.put("Sample-Header", "hello"); 

      return new WebResourceResponse(
        mime, 
        conn.getContentEncoding(), 
        conn.getResponseCode(), 
        conn.getResponseMessage(), 
        responseHeaders, 
        conn.getInputStream() 
        ); 

     } catch (Exception e) { 
      Log.e(TAG, "shouldInterceptRequest: " + e); 
     } 
     return null; 
    } 
}); 
+0

मेरे पास इस तरह का कोड भी है, हां मुझे प्रतिक्रिया शीर्षलेख मिलते हैं और मेरी समस्या अनुरोध शीर्षलेख है। मैं अपने वेबव्यू में अनुरोध हेडर नहीं जोड़ सकता। अगर मैं एक जोड़ने के बाद अनुरोध हेडर लॉग करता हूं, तो मैं उन्हें लॉग पर ले जाता हूं, हालांकि जब यह वेबव्यू तक पहुंचता है तो यह मौजूद नहीं है, – Aaron

+0

तो आप webResourceReqest को संशोधित करने की कोशिश कर रहे हैं और उस परिवर्तन को जावास्क्रिप्ट पक्ष पर प्रतिबिंबित करने का क्या प्रयास है वेबव्यू? – j2ko

संबंधित मुद्दे