ওয়েবভিউ রিসোর্স অনুরোধগুলিতে কাস্টম শিরোনাম যুক্ত করুন - অ্যান্ড্রয়েড


97

ওয়েবভিউ থেকে আসা প্রতিটি অনুরোধে আমাকে কাস্টম শিরোনাম যুক্ত করতে হবে। আমি জানি loadURLযে এর জন্য প্যারামিটার রয়েছে extraHeadersতবে সেগুলি কেবলমাত্র প্রাথমিক অনুরোধে প্রয়োগ করা হয়। পরবর্তী সমস্ত অনুরোধগুলিতে শিরোনাম নেই। আমি সমস্ত ওভাররাইডের দিকে নজর রেখেছি WebViewClient, তবে কিছুই রিসোর্স অনুরোধগুলিতে শিরোনাম যুক্ত করার অনুমতি দেয় না - onLoadResource(WebView view, String url)। যে কোন সাহায্য চমৎকার হবে।

ধন্যবাদ, রে


4
@ মিডিয়ামওন: এটি কোনও ত্রুটি নয় যতটা আপনি অনুপস্থিত মনে করেন এমন একটি বৈশিষ্ট্য। আমি HTTP স্পেসিফিকেশনের কোনও বিষয় সম্পর্কে অবগত নই যা বলেছে যে পরবর্তী HTTP অনুরোধগুলিতে পূর্ববর্তী HTTP অনুরোধগুলি থেকে স্বেচ্ছাসেবক শিরোনামগুলি মিরর করা উচিত।
কমন্সওয়েয়ার

4
@ কমন্সওয়্যার: "পরবর্তী" শব্দটি এখানে বিভ্রান্ত করছে। আমি যখন ফেসবুক.কম হোমপেজে লোড করতে যে কোনও ব্রাউজারে " ফেসবুক.কম " টাইপ করি তখন সিএসএস, জেএস এবং আইএমজি ফাইলগুলি লোড করার জন্য বেশ কয়েকটি সমর্থনকারী "রিসোর্স রিকোয়েস্টস" থাকে। আপনি এফ 12 বৈশিষ্ট্য (নেটওয়ার্ক ট্যাব) ব্যবহার করে ক্রোমে এটি পরীক্ষা করতে পারেন। এই অনুরোধগুলির জন্য, ওয়েবভিউ শিরোনাম যোগ করে না। আমি addons.mozilla.org/en-us/firefox/addon/modify-headers প্লাগ-ইন ব্যবহার করে ফায়ারফক্স অনুরোধগুলিতে কাস্টম হেডার যুক্ত করার চেষ্টা করেছি । এই প্লাগইনটি এই জাতীয় সমস্ত সংস্থান সরবরাহকারী "রিসোর্স অনুরোধ" এ শিরোনাম যুক্ত করতে সক্ষম হয়েছিল। আমার মনে হয় ওয়েবভিউ'রও এটি করা উচিত।
মাঝারি এক

4
@ মিডিয়ামওন: "আমি মনে করি ওয়েবভিউকেও একই রকম করা উচিত" - এটি এমন একটি বৈশিষ্ট্য যা আপনি মনে করছেন নিখোঁজ। নোট করুন যে ফায়ারফক্সকে এটি করতে আপনাকে একটি প্লাগইন নিতে হয়েছিল। আমি বলছি না যে আপনার প্রস্তাবিত বৈশিষ্ট্যটি একটি খারাপ ধারণা। আমি বলছি যে এটিকে একটি বাগ হিসাবে চিহ্নিত করা আপনার প্রস্তাবিত বৈশিষ্ট্যটি অ্যান্ড্রয়েডে যুক্ত করতে আপনার কারণকে সাহায্য করার সম্ভাবনা কম।
কমন্সওয়্যার

4
@ কমন্সওয়্যার: মনে করুন যে আমি একটি ব্রাউজার তৈরি করতে একটি ওয়েবভিউ ব্যবহার করছি যা কাস্টম এইচটিটিপি প্রক্সি দিয়ে কাজ করার জন্য কনফিগার করা যেতে পারে। এই প্রক্সিটিতে কাস্টম প্রমাণীকরণ ব্যবহার করা হয় যেখানে এটির জন্য অনুরোধগুলি কাস্টম শিরোনাম হওয়া উচিত। এখন, ওয়েবভিউ কাস্টম শিরোনাম সেট করতে একটি API সরবরাহ করে তবে অভ্যন্তরীণভাবে, এটি উত্পন্ন করা সমস্ত সংস্থান অনুরোধগুলিতে শিরোনামটি সেট করে না। এই অনুরোধগুলির জন্য শিরোনাম সেট করার জন্য কোনও অতিরিক্ত API নেই। সুতরাং, ওয়েবভিউ অনুরোধে কাস্টম শিরোনাম যুক্ত করার উপর নির্ভর করে এমন কোনও বৈশিষ্ট্য ব্যর্থ হয়।
মাঝারি এক

4
@ কমন্সওয়্যার - আমি 4 বছর পরে এই কথোপকথনটি পুনর্বিবেচনা করছি। আমি এখনই সম্মত - এটি কোনও বাগ হওয়া উচিত নয়। এইচটিটিপি স্পেসিফিকেশনে এমন কিছু নেই যা বলে যে পরবর্তী অনুরোধগুলিতে একই শিরোনাম প্রেরণ করা উচিত। :)
মিডিয়ামওনে

উত্তর:


84

চেষ্টা করুন

loadUrl(String url, Map<String, String> extraHeaders)

সংস্থানগুলি লোড করার অনুরোধগুলিতে শিরোনাম যুক্ত করার জন্য, কাস্টম ওয়েবভিউক্লিয়েন্ট করুন এবং ওভাররাইড করুন:

API 24+:
WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request)
or
WebResourceResponse shouldInterceptRequest(WebView view, String url)

9
দুঃখিত, কিন্তু এটি কাজ করে না। এটি কেবল শিরোনামগুলিকে প্রারম্ভিক অনুরোধগুলি প্রয়োগ করে। সংস্থানগুলির অনুরোধগুলিতে শিরোনামগুলি যুক্ত করা হয় না। অন্যান্য ধারণা? ধন্যবাদ
রায়

19
হ্যাঁ, ওয়েবক্লিয়েন্ট.শোল্ড ওভাররাইডউর্লিড ওভাররাইড করুন: এইভাবে লোড হচ্ছে: পাবলিক বুলেটিয়ান ওভাররাইডউড়ললয়েডিং (ওয়েবউইউ ভিউ, স্ট্রিং ইউআরএল)। ভিউ.লোডউড়ল (url, এক্সট্রাহাইডার্স); সত্য প্রত্যাবর্তন; }
পিসেপ্সে

4
@ পেপস - রিসোর্স লোড করার সময় কলব্যাক 'shouldOverrideUrlLoading' বলা হয় না। উদাহরণস্বরূপ, যখন আমরা চেষ্টা করি view.loadUrl("http://www.facebook.com", extraHeaders)তখন এমন একাধিক সংস্থান অনুরোধ রয়েছে 'http://static.fb.com/images/logo.png'যা ওয়েব ভিউ থেকে প্রেরিত হয়। এই অনুরোধগুলির জন্য, অতিরিক্ত শিরোনাম যুক্ত করা হয় না। এবং shouldOverrideUrlLoading যেমন রিসোর্স অনুরোধের সময় কল করা হয় না। কলব্যাকটি 'অনলয়েড রিসোর্স' বলা হয়, তবে এই মুহুর্তে শিরোনাম সেট করার কোনও উপায় নেই।
মিডিয়ামনে

4
@MediumOne, সংস্থান লোড জন্য, ওভাররাইড WebViewClient.shouldInterceptRequest(android.webkit.WebView view, java.lang.String url)পরীক্ষা করে দেখুন এপিআই আরো অনেক কিছুর জন্য।
ইয়র্কউ

4
@ ইয়র্কডাব্লু: এই পদ্ধতিটি সমস্ত সংস্থান অনুরোধ url ক্যাপচার করে। তবে এই অনুরোধগুলিতে শিরোনাম যুক্ত করার কোনও উপায় নেই। আমার লক্ষ্যটি সমস্ত অনুরোধে কাস্টম এইচটিটিপি শিরোনাম যুক্ত করা। যদি shouldInterceptRequestপদ্ধতিটি ব্যবহার করে এটি অর্জন করা যায় তবে আপনি কীভাবে ব্যাখ্যা করতে পারেন?
মাঝারি এক

36

ওয়েবভিউক্লিয়েন্ট.শল্ডইনটারসেপ্টরেক্সেস্ট ব্যবহার করে আপনাকে প্রতিটি অনুরোধটি আটকাতে হবে

প্রতিটি বাধা সহ, আপনাকে ইউআরএল নিতে হবে, এই অনুরোধটি নিজেই করা এবং সামগ্রীর স্ট্রিমটি ফিরিয়ে দিতে হবে:

WebViewClient wvc = new WebViewClient() {
    @Override
    public WebResourceResponse shouldInterceptRequest(WebView view, String url) {

        try {
            DefaultHttpClient client = new DefaultHttpClient();
            HttpGet httpGet = new HttpGet(url);
            httpGet.setHeader("MY-CUSTOM-HEADER", "header value");
            httpGet.setHeader(HttpHeaders.USER_AGENT, "custom user-agent");
            HttpResponse httpReponse = client.execute(httpGet);

            Header contentType = httpReponse.getEntity().getContentType();
            Header encoding = httpReponse.getEntity().getContentEncoding();
            InputStream responseInputStream = httpReponse.getEntity().getContent();

            String contentTypeValue = null;
            String encodingValue = null;
            if (contentType != null) {
                contentTypeValue = contentType.getValue();
            }
            if (encoding != null) {
                encodingValue = encoding.getValue();
            }
            return new WebResourceResponse(contentTypeValue, encodingValue, responseInputStream);
        } catch (ClientProtocolException e) {
            //return null to tell WebView we failed to fetch it WebView should try again.
            return null;
        } catch (IOException e) {
             //return null to tell WebView we failed to fetch it WebView should try again.
            return null;
        }
    }
}

Webview wv = new WebView(this);
wv.setWebViewClient(wvc);

যদি আপনার ন্যূনতম এপিআই টার্গেট 21 স্তরের হয় তবে আপনি নতুন shouldInterceptRequest ব্যবহার করতে পারেন যা কেবলমাত্র URL এর পরিবর্তে আপনাকে অতিরিক্ত অনুরোধের তথ্য দেয় (যেমন শিরোনাম হিসাবে)।


4
এই কৌশলটি ব্যবহার করার সময় কেউ যদি আমার একই পরিস্থিতির মুখোমুখি হয়। (এটি যাইহোক ভাল।) আপনার জন্য এখানে একটি নোট দেওয়া আছে। যেহেতু http কনটেন্ট-টাইপ শিরোনাম, যা চরসেটের মতো alচ্ছিক প্যারামিটার ধারণ করতে পারে তা এমআইএম টাইপের সাথে সম্পূর্ণরূপে সামঞ্জস্যপূর্ণ নয়, ওয়েবআরসোর্স রিস্পনস কনস্ট্রাক্টরের প্রথম প্যারামিটারের প্রয়োজনীয়তা রয়েছে, যাতে আমাদের যে কোনও উপায়ে কনটেন্ট-টাইপ থেকে মাইমাই টাইপ অংশটি বের করা উচিত you বেশিরভাগ ক্ষেত্রে এটি কার্যকর করার জন্য RegExp এর মতো ভাবতে পারে।
জেমস চেন

4
এই ইভেন্টটি অবচিত করা হয়েছে .. public WebResourceResponse shouldInterceptRequest (WebView view, WebResourceRequest request)পরিবর্তে এখানে
হিরदेश বিশ্বদেব

4
@ হিরदेश বিশ্বদেওয়া - শেষ বাক্যটি দেখুন।
মার্টিন কনেকনি

4
আপনার ওয়েবভিউ এবং পরামিতি হিসাবে পরিবর্তিত অনুরোধের সাথে সুপারক্লাসের shouldInterceptRequest পদ্ধতির ফলাফলগুলি ফিরিয়ে আপনি নিজের লোডটি এড়িয়ে যেতে পারেন। এটি ইউআরএল-এর উপর ভিত্তি করে ট্রিগার করছেন, পুনরায় লোড এ পরিবর্তন করছেন না এবং একটি অসীম লুপে চলে যাবে এমন দৃশ্যে এটি বিশেষভাবে সহজ। যদিও নতুন অনুরোধ উদাহরণের জন্য অনেক ধন্যবাদ। জিনিসগুলি পরিচালনা করার জাভা উপায়গুলি আমার পক্ষে অত্যন্ত বিপরীত।
এরিক রেপেন

4
এইচটিটিপিপ্লিয়েন্টটি 23 এবং তার বেশি সংকলন সংকলনের সাথে ব্যবহার করা যাবে না
তামাস কোজমির

30

হতে পারে আমার প্রতিক্রিয়াটি বেশ দেরিতে হয়েছে, তবে এটি 21 স্তরের নীচে এবং এর উপরে API কভার করে ।

শিরোনাম যুক্ত করতে আমাদের প্রতিটি অনুরোধটি আটকাতে হবে এবং প্রয়োজনীয় শিরোনাম সহ একটি নতুন তৈরি করা উচিত ।

সুতরাং আমাদের উভয় ক্ষেত্রেই বলা উচিত ' ইন্টারসেপ্ট রিকোয়েস্ট পদ্ধতি' ওভাররাইড করা উচিত : ১. এপিআই-এর জন্য স্তর 21 পর্যন্ত; ২.আইপিএল স্তর 21+ এর জন্য

    webView.setWebViewClient(new WebViewClient() {

        // Handle API until level 21
        @SuppressWarnings("deprecation")
        @Override
        public WebResourceResponse shouldInterceptRequest(WebView view, String url) {

            return getNewResponse(url);
        }

        // Handle API 21+
        @TargetApi(Build.VERSION_CODES.LOLLIPOP)
        @Override
        public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {

            String url = request.getUrl().toString();

            return getNewResponse(url);
        }

        private WebResourceResponse getNewResponse(String url) {

            try {
                OkHttpClient httpClient = new OkHttpClient();

                Request request = new Request.Builder()
                        .url(url.trim())
                        .addHeader("Authorization", "YOU_AUTH_KEY") // Example header
                        .addHeader("api-key", "YOUR_API_KEY") // Example header
                        .build();

                Response response = httpClient.newCall(request).execute();

                return new WebResourceResponse(
                        null,
                        response.header("content-encoding", "utf-8"),
                        response.body().byteStream()
                );

            } catch (Exception e) {
                return null;
            }

        }
   });

প্রতিক্রিয়ার ধরণটি প্রক্রিয়া করা উচিত তবে আপনি পরিবর্তন করতে পারেন

        return new WebResourceResponse(
                null, // <- Change here
                response.header("content-encoding", "utf-8"),
                response.body().byteStream()
        );

প্রতি

        return new WebResourceResponse(
                getMimeType(url), // <- Change here
                response.header("content-encoding", "utf-8"),
                response.body().byteStream()
        );

এবং পদ্ধতি যুক্ত করুন

        private String getMimeType(String url) {
            String type = null;
            String extension = MimeTypeMap.getFileExtensionFromUrl(url);

            if (extension != null) {

                switch (extension) {
                    case "js":
                        return "text/javascript";
                    case "woff":
                        return "application/font-woff";
                    case "woff2":
                        return "application/font-woff2";
                    case "ttf":
                        return "application/x-font-ttf";
                    case "eot":
                        return "application/vnd.ms-fontobject";
                    case "svg":
                        return "image/svg+xml";
                }

                type = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension);
            }

            return type;
        }

4
এই পুরানো পোস্টের উত্তর দেওয়ার জন্য দুঃখিত, তবে এই কোডটি দিয়ে আমার অ্যাপ্লিকেশন পৃষ্ঠাটি লোড না করে ফাইলটি ডাউনলোড করার চেষ্টা করে (এবং এটি ব্যর্থ হয়)।
গিয়াকোমো এম

এটি কি পোস্ট অনুরোধের জন্য ব্যবহার করা যেতে পারে?
মিড

21

পূর্বে উল্লিখিত হিসাবে, আপনি এটি করতে পারেন:

 WebView  host = (WebView)this.findViewById(R.id.webView);
 String url = "<yoururladdress>";

 Map <String, String> extraHeaders = new HashMap<String, String>();
 extraHeaders.put("Authorization","Bearer"); 
 host.loadUrl(url,extraHeaders);

আমি এটি পরীক্ষা করে এমভিসি কন্ট্রোলার দিয়েছিলাম যে শিরোনামটি পরিদর্শন করার জন্য আমি অনুমোদন বৈশিষ্ট্যকে প্রসারিত করেছি এবং শিরোলেখ সেখানে রয়েছে।


আমাকে এটি আবার সম্বোধন করতে হবে যখন এটি লিখিত ছিল এবং পোস্টটি এটি কিট-ক্যাট দিয়ে কাজ করেছিল। আমি ললি পপ দিয়ে চেষ্টা করিনি।
লিওরোয়া

জেলি বিন বা মার্শমেলোতে আমার জন্য কাজ করছেন না ... শিরোনামে কোনও পরিবর্তন হয় না
এরিক ভারবুম

6
এটি ওপি যা বলছে তা করে না। ওয়েবভিউ দ্বারা করা সমস্ত অনুরোধে তিনি শিরোনাম যুক্ত করতে চান। এটি কেবল প্রথম অনুরোধে কাস্টম শিরোলেখ যোগ করে
নিনজা কোডার

এটি ওপি যা জিজ্ঞাসা করছে তা নয়
অক্ষয়

আমি জানি যে এটি ওপি যা খুঁজছিল তার জবাব দেয় না তবে এটি ছিল যা আমি চেয়েছিলাম, অর্থাত্ ওয়েবভিউইন্টেন্ট URL এ অতিরিক্ত শিরোনাম যুক্ত করা। ধন্যবাদ, নির্বিশেষে!
জোশুয়া পিন্টার

9

এটি আমার পক্ষে কাজ করে:

  1. প্রথমে আপনাকে এমন পদ্ধতি তৈরি করতে হবে যা আপনাকে অনুরোধে যুক্ত করতে চান এমন শিরোনামগুলি প্রদান করবে:

    private Map<String, String> getCustomHeaders()
    {
        Map<String, String> headers = new HashMap<>();
        headers.put("YOURHEADER", "VALUE");
        return headers;
    }
    
  2. দ্বিতীয়টি আপনাকে ওয়েবভিউক্লিয়েন্ট তৈরি করতে হবে:

    private WebViewClient getWebViewClient()
    {
    
        return new WebViewClient()
        {
    
        @Override
        @TargetApi(Build.VERSION_CODES.LOLLIPOP)
        public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request)
        {
            view.loadUrl(request.getUrl().toString(), getCustomHeaders());
            return true;
        }
    
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url)
        {
            view.loadUrl(url, getCustomHeaders());
            return true;
        }
    };
    }
    
  3. আপনার ওয়েবভিউতে ওয়েবভিউক্লিয়েন্ট যুক্ত করুন:

    webView.setWebViewClient(getWebViewClient());
    

আশাকরি এটা সাহায্য করবে.


4
সৌন্দর্য ভাল, কিন্তু এই আছে যোগ শীর্ষক অথবা এই আছে প্রতিস্থাপন হেডার?
আইভো রেনকেমা

@ আইভোরেঙ্কমা loadUrl(String url, Map<String, String> additionalHttpHeaders) মানে অ্যাডিশন শিরোনাম
অভিনেমে

4

আপনার নিজের সমস্ত হেডারকে জাভা'র এইচটিপিআরএল সংযোগ ব্যবহার করে লোডআরএল এড়িয়ে এবং নিজস্ব লোডপেজ লিখে আপনার নিয়ন্ত্রণ করতে সক্ষম হবেন। তারপরে প্রতিক্রিয়া প্রদর্শনের জন্য ওয়েবভিউর লোডডেটা ব্যবহার করুন।

গুগল সরবরাহ করে এমন শিরোনামগুলিতে কোনও অ্যাক্সেস নেই। তারা ওয়েবভিউ উত্স থেকে গভীর, একটি জেএনআই কল রয়েছে।


4
আপনার উত্তরে আপনি যা বলছেন সে সম্পর্কে আপনার কি কোনও রেফারেন্স রয়েছে .. আপনি যদি নিজের উত্তরগুলির সাথে প্রয়োগের রেফারেন্স দেন তবে তা অন্যদের জন্য সহায়ক।
হিরदेश বিশ্বদেব

1

এইচটিটিপিআরল সংযোগ ব্যবহার করে একটি বাস্তবায়ন এখানে দেওয়া হয়েছে:

class CustomWebviewClient : WebViewClient() {
    private val charsetPattern = Pattern.compile(".*?charset=(.*?)(;.*)?$")

    override fun shouldInterceptRequest(view: WebView, request: WebResourceRequest): WebResourceResponse? {
        try {
            val connection: HttpURLConnection = URL(request.url.toString()).openConnection() as HttpURLConnection
            connection.requestMethod = request.method
            for ((key, value) in request.requestHeaders) {
                connection.addRequestProperty(key, value)
            }

            connection.addRequestProperty("custom header key", "custom header value")

            var contentType: String? = connection.contentType
            var charset: String? = null
            if (contentType != null) {
                // some content types may include charset => strip; e. g. "application/json; charset=utf-8"
                val contentTypeTokenizer = StringTokenizer(contentType, ";")
                val tokenizedContentType = contentTypeTokenizer.nextToken()

                var capturedCharset: String? = connection.contentEncoding
                if (capturedCharset == null) {
                    val charsetMatcher = charsetPattern.matcher(contentType)
                    if (charsetMatcher.find() && charsetMatcher.groupCount() > 0) {
                        capturedCharset = charsetMatcher.group(1)
                    }
                }
                if (capturedCharset != null && !capturedCharset.isEmpty()) {
                    charset = capturedCharset
                }

                contentType = tokenizedContentType
            }

            val status = connection.responseCode
            var inputStream = if (status == HttpURLConnection.HTTP_OK) {
                connection.inputStream
            } else {
                // error stream can sometimes be null even if status is different from HTTP_OK
                // (e. g. in case of 404)
                connection.errorStream ?: connection.inputStream
            }
            val headers = connection.headerFields
            val contentEncodings = headers.get("Content-Encoding")
            if (contentEncodings != null) {
                for (header in contentEncodings) {
                    if (header.equals("gzip", true)) {
                        inputStream = GZIPInputStream(inputStream)
                        break
                    }
                }
            }
            return WebResourceResponse(contentType, charset, status, connection.responseMessage, convertConnectionResponseToSingleValueMap(connection.headerFields), inputStream)
        } catch (e: Exception) {
            e.printStackTrace()
        }
        return super.shouldInterceptRequest(view, request)
    }

    private fun convertConnectionResponseToSingleValueMap(headerFields: Map<String, List<String>>): Map<String, String> {
        val headers = HashMap<String, String>()
        for ((key, value) in headerFields) {
            when {
                value.size == 1 -> headers[key] = value[0]
                value.isEmpty() -> headers[key] = ""
                else -> {
                    val builder = StringBuilder(value[0])
                    val separator = "; "
                    for (i in 1 until value.size) {
                        builder.append(separator)
                        builder.append(value[i])
                    }
                    headers[key] = builder.toString()
                }
            }
        }
        return headers
    }
}

মনে রাখবেন যে এটি পোষ্ট অনুরোধগুলির জন্য কাজ করে না কারণ WebResourceRequest পোস্টের ডেটা সরবরাহ করে না। একটি অনুরোধ ডেটা আছে - ওয়েবভিউক্লিয়েন্ট লাইব্রেরি যা জাওস্ক্রিপ্ট ইনজেকশন ওয়ার্কআরউন্ড পোষ্ট ডেটা বাধা দেওয়ার জন্য ব্যবহার করে।


0

এটি আমার পক্ষে কাজ করেছে। নীচের মতো ওয়েবভিউক্লিয়েন্ট তৈরি করুন এবং ওয়েবক্লিয়েন্টটি আপনার ওয়েবভিউতে সেট করুন। আমার ইউআরএলগুলি (আমার বিষয়বস্তুতে) বেসুরল না থাকলে কেবলমাত্র আপেক্ষিক ইউআরএল হিসাবে আমাকে ওয়েবভিউ.লোডডাটা উইথব্যাস URL ব্যবহার করতে হয়েছিল। আপনি url সঠিকভাবে তখনই পাবেন যখন সেখানে লোডডাটাবিথবেস URL ব্যবহার করে কোনও বেসুরল সেট থাকে l

public WebViewClient getWebViewClientWithCustomHeader(){
    return new WebViewClient() {
        @Override
        public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
            try {
                OkHttpClient httpClient = new OkHttpClient();
                com.squareup.okhttp.Request request = new com.squareup.okhttp.Request.Builder()
                        .url(url.trim())
                        .addHeader("<your-custom-header-name>", "<your-custom-header-value>")
                        .build();
                com.squareup.okhttp.Response response = httpClient.newCall(request).execute();

                return new WebResourceResponse(
                        response.header("content-type", response.body().contentType().type()), // You can set something other as default content-type
                        response.header("content-encoding", "utf-8"),  // Again, you can set another encoding as default
                        response.body().byteStream()
                );
            } catch (ClientProtocolException e) {
                //return null to tell WebView we failed to fetch it WebView should try again.
                return null;
            } catch (IOException e) {
                //return null to tell WebView we failed to fetch it WebView should try again.
                return null;
            }
        }
    };

}

আমার জন্য এটি কাজ করে: পোষ্ট (রেকবডি) যেখানে অনুরোধবডি রেকবিডি = রিকোয়েস্টবিডি.ক্রেট (নাল, "");
করলি

-2

আপনি এটি ব্যবহার করতে পারেন:

@Override

 public boolean shouldOverrideUrlLoading(WebView view, String url) {

                // Here put your code
                Map<String, String> map = new HashMap<String, String>();
                map.put("Content-Type","application/json");
                view.loadUrl(url, map);
                return false;

            }

4
এটি কেবল ইউআরএলটি পুনরায় লোড করতে থাকে, তাই না?
ওনহিরন

-3

আমি একই সমস্যা জুড়ে এসে সমাধান করেছি।

যেমনটি আপনার কাস্টম ওয়েবভিউক্লিয়েন্ট তৈরি করার আগে অবশ্যই বলা উচিত এবং ইন্টারইনসেপ্টরয়েস্ট পদ্ধতিটি ওভাররাইড করা উচিত।

WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request)

এই "পদ্ধতিটি" খালি "ওয়েব রিসোর্স রিস্পনসে ফিরে যাওয়ার সময় একটি ওয়েবভিউ.লোডআর্ল জারি করা উচিত।

এটার মতো কিছু:

@Override
public boolean shouldInterceptRequest(WebView view, WebResourceRequest request) {

    // Check for "recursive request" (are yor header set?)
    if (request.getRequestHeaders().containsKey("Your Header"))
        return null;

    // Add here your headers (could be good to import original request header here!!!)
    Map<String, String> customHeaders = new HashMap<String, String>();
    customHeaders.put("Your Header","Your Header Value");
    view.loadUrl(url, customHeaders);

    return new WebResourceResponse("", "", null);
}

এই পদ্ধতি থেকে ভিউ.ওললোডকে কল করা অ্যাপ্লিকেশনটিকে ক্র্যাশ করে মনে হচ্ছে
উইলক্লুফ

@ উইলকডাব্লুফের কি আপনার এই দুর্ঘটনার উদাহরণ রয়েছে?
ফ্রান্সেস্কো

@ ফ্রান্সেসকো আমার অ্যাপ্লিকেশনটিও ক্র্যাশ করেছে
গিয়াকোমো এম

খুব বেশি করে এটিকে কমানো হচ্ছে, এটি বলছে যে এটি ক্র্যাশ করছে না। দয়া করে আরও সুনির্দিষ্ট হন, কিছু ত্রুটির তথ্য লিখুন।
ফ্রান্সেস্কো

-14

এটা ব্যবহার কর:

webView.getSettings().setUserAgentString("User-Agent");

11
এটি প্রশ্নের উত্তর দেয় না
younes0

এটি অনুমোদনের শিরোনামের মতো নয়
ভ্লাদ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.