2016-01-31 12 views
5

सेट करें मैं एंड्रॉइड पर प्रतिक्रिया मूल के साथ User-Agent सेट करने का प्रयास कर रहा हूं। कुछ शोध किया और ऐसा लगता है कि मुझे okhttpइंटरसेप्टर का उपयोग करना चाहिए। एक उदाहरण जो मैंने पाया है यह कैसे समझाया जाना चाहिए (Link) लेकिन फिर मुझे इंटरसेप्टर को पंजीकृत करने के बारे में निश्चित नहीं है।एंड्रॉइड पर मूल और okhttp प्रतिक्रिया - उपयोगकर्ता-एजेंट

तो User-Agent सेट करने के लिए मैं इस वर्ग का उपयोग कर रहा में:

public class CustomInterceptor implements Interceptor { 
    @Override public Response intercept(Interceptor.Chain chain) throws IOException { 
     Request originalRequest = chain.request(); 
     Request requestWithUserAgent = originalRequest.newBuilder() 
      .removeHeader("User-Agent") 
      .header("User-Agent", "Trevor") 
      .build(); 
     return chain.proceed(requestWithUserAgent); 
    } 
} 

तो क्या बचा है ऊपर इंटरसेप्टर रजिस्टर करने के लिए तो जहां यह किया जाना चाहिए है? शायद MainActivity.java में?

OkHttpClient okHttp = new OkHttpClient(); 
okHttp.interceptors().add(new CustomInterceptor()); 

मैं किसी भी त्रुटि जब एप्लिकेशन बनाने नहीं मिल रहा है तो मुझे लगता है कि CustomInterceptor ठीक होना चाहिए - बस एप्लिकेशन इसका इस्तेमाल करने की जरूरत है।

अद्यतन: मैं वर्तमान में MainActivity में इंटरसेप्टर रजिस्टर करने के लिए कोशिश कर रहा हूँ, लेकिन यह यह लेने नहीं होगा:

public class MainActivity extends ReactActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    OkHttpClient client = new OkHttpClient(); 
    client.networkInterceptors().add(new CustomInterceptor()); 

    }; 

}; 
+0

हैलो @ एकोन्स्टेंटिनिडीस, मैं 'प्रतिक्रिया-मूल 'के साथ' ओखट्प 'का उपयोग करने का प्रयास करता हूं।हालांकि जब मैं 'प्रतिक्रिया-देशी रन-एंड्रॉइड' के आदेश को चलाता हूं तो मुझे एक त्रुटि मिलती है। आप उस पर काबू पाने में कैसे सफल हुए? – efkan

+0

मुझे लगता है कि आप 'okhttp' lib का उपयोग करते हैं, आपको कोई त्रुटि नहीं मिली। 'प्रतिक्रिया-मूल' 'okhttp3' lib का उपयोग करता है और मैं दुर्भाग्य से उसी lib का उपयोग करने का प्रयास करता हूं। – efkan

उत्तर

3

तो आखिर में मैंने इसे समझ लिया है। प्रतिक्रिया मूल के साथ okhttp के उपयोगकर्ता-एजेंट को ओवरराइड करने का समाधान यहां दिया गया है।

... 
import com.facebook.react.modules.network.OkHttpClientProvider; 
... 

public class MainActivity extends ReactActivity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     attachInterceptor(); 
    } 

    private void attachInterceptor() { 
     OkHttpClient client = OkHttpClientProvider.getOkHttpClient(); 
     client.networkInterceptors().add(new CustomInterceptor()); 
    } 
} 

ध्यान दें कि मैं com.facebook.react.modules.network.OkHttpClientProvider; आयात और है कि ग्राहक अधिभावी के बजाय एक वेनिला बना रहा हूं:

package com.trevor; 

import com.squareup.okhttp.Interceptor; 
import com.squareup.okhttp.Request; 
import com.squareup.okhttp.Response; 

import java.io.IOException; 

public class CustomInterceptor implements Interceptor { 

    public CustomInterceptor() {} 

    @Override 
    public Response intercept(Interceptor.Chain chain) throws IOException { 
     Request originalRequest = chain.request(); 
     Request requestWithUserAgent = originalRequest.newBuilder() 
      .removeHeader("User-Agent") 
      .addHeader("User-Agent", "Trevor") 
      .build(); 

     return chain.proceed(requestWithUserAgent); 
    } 

} 
फिर MainActivity.java ओवरराइड onCreate विधि में

:

एक फ़ाइल CustomInterceptor.java बनाएं जिसका नाम OkHttpClient क्योंकि यह वह है जो प्रतिक्रियात्मक मूल का उपयोग करेगा।

0

मैं OkHttp का उपयोग कर इस कार्यशीलता को क्रियान्वित किया है और मेरे कोड सुंदर है तुम्हारा जैसा ही है - और सबकुछ ठीक काम करता है।

header("User-Agent", "Trevor") के बजाय addHeader("User-Agent", "Trevor") का उपयोग करने पर विचार करें, क्योंकि बाद वाले सभी पहले से सेट हेडर को प्रतिस्थापित कर देगा।

मैं okHttp.interceptors().add(new CustomInterceptor()); के बजाय okHttp.networkInterceptors().add(new CustomInterceptor()); का उपयोग कर रहा हूं, लेकिन मुझे नहीं लगता कि यह चिंता का विषय है।

अद्यतन मैं इसे onCreate() विधि में भी करता हूं। हर चीज़ वैसे ही काम कर रही है जैसी उसे करनी चाहिए।

+0

यह सही लगता है! मैं जो खोज रहा हूं वह इंटरसेप्टर को पंजीकृत करने का एक तरीका है। क्या मुझे 'मुख्य क्रिया' में 'क्रिएट' पर ओवरराइड करना चाहिए और कैसे? मैंने प्रश्न पर एक उदाहरण जोड़ा है। – manosim

+0

@iamemmanouil ने मेरा उत्तर –

5

प्रतिक्रिया मूल इतनी तेज़ी से चल रहा है कि स्वीकृत उत्तर मेरे लिए काम नहीं करता है।

आरएन 0.27.2 के लिए मुझे अपने कस्टमइंटरसेप्टर में okhttp3.OkHttpClient आयात करना था और क्लाइंट को प्रतिस्थापित करने के लिए मुख्य सक्रियता में attachInterceptor() विधि को बदलना था।

private void attachInterceptor() { 
    OkHttpClient currentClient = OkHttpClientProvider.getOkHttpClient(); 
    OkHttpClient replacementClient = currentClient.newBuilder().addNetworkInterceptor(new CustomInterceptor()).build(); 
    OkHttpClientProvider.replaceOkHttpClient(replacementClient); 
} 

ekonstantinidis के उत्तर से बाकी सब कुछ मेरे लिए काम करता है।

+0

अपडेट किया है जो मेरे लिए आरएन 0.51.0 के साथ काम नहीं करता है, मूल मॉड्यूल एक नया बना देता है – hoot

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