2016-04-14 10 views
5

retrofit का उपयोग करके मैं http://milzinas.lt/oauthsilent/authorize पर POST अनुरोध करना चाहता हूं। यह यूआरएल विशेष है क्योंकि यह आपको http://milzinas.e-bros.lt/oauthsilent/authorize पर रीडायरेक्ट करता है। मेरा रेट्रोफिट सेटअप OkHttpClient का उपयोग करता है। अगर मैं केवल OkHttpClient का उपयोग करके अनुरोध करता हूं तो केवल ठीक काम करता है, यानी 401 स्थिति कोड प्राप्त होता है। हालांकि, जब मैं रेट्रोफिट के साथ एक ही ओकेएचटीपी क्लाइंट का उपयोग करता हूं तो प्रतिक्रिया स्थिति कोड 307 है। मुझे लगता है कि OkClient कार्यान्वयन के साथ इसका कुछ संबंध है जो OkHttpClient को लपेटता है लेकिन मुझे यकीन नहीं है। नीचे वह कोड है जिसका उपयोग मैंने इस परिदृश्य का परीक्षण करने के लिए किया था। मैं इन पुस्तकालयों का उपयोग कर रहा:ओकेएचटीपी पोस्ट अनुरोधों को रीडायरेक्ट नहीं करता है जब रेट्रोफिट

com.squareup.retrofit:retrofit:1.9.0 
com.squareup.okhttp:okhttp:2.2.0 

मैं समझता हूँ http ग्राहक दो अनुरोध करने के लिए है कि जब URL किसी अन्य URL पर आप पुनः निर्देशित किया गया है। मेरे मामले में पहला अनुरोध 307 (अस्थायी रीडायरेक्ट) देता है और दूसरा एक 401 (अनधिकृत) देता है। हालांकि, retrofit हमेशा पहले अनुरोध की प्रतिक्रिया देता है। क्या आप जानते हैं कि रीट्रोफिट के साथ रीडायरेक्टिंग को सही तरीके से कैसे बनाना है? शायद मैं इसे कुछ अन्य HTTP क्लाइंट का उपयोग करके प्राप्त कर सकता हूं? कोई भी सुझाव प्रशंसनीय होगा।

तो जब मैं कंसोल प्रिंट नीचे कोड निष्पादित

Retrofit failure. Status: 307 
OkHttp. Status: 401 

मैं इसे

Retrofit failure. Status: 401 
OkHttp. Status: 401 

public class MainActivity extends AppCompatActivity { 

interface Api { 

    @POST(URL) 
    @Headers("Accept: application/json") 
    void test(@Body Object dummy, Callback<Object> callback); 

} 

static final String BASE_URL = "http://milzinas.lt"; 
static final String URL = "/oauthsilent/authorize"; 

final OkHttpClient okHttpClient = new OkHttpClient(); 
Api api; 

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

    RestAdapter retrofit = new RestAdapter.Builder() 
      .setEndpoint(BASE_URL) 
      .setClient(new OkClient(okHttpClient)) 
      .setConverter(new Converter() { 
       @Override 
       public Object fromBody(TypedInput body, Type type) throws ConversionException { 
        return null; 
       } 

       @Override 
       public TypedOutput toBody(Object object) { 
        return null; 
       } 
      }) 
      .build(); 

    api = retrofit.create(Api.class); 

    makeRequestOkHttp(); 
    makeRequestRetrofit(); 
} 

void makeRequestOkHttp() { 
    new AsyncTask<Object, Object, Object>() { 
     @Override 
     protected Object doInBackground(Object... objects) { 
      try { 
       Request request = new Request.Builder().url(BASE_URL + URL).build(); 
       com.squareup.okhttp.Response response = okHttpClient.newCall(request).execute(); 
       android.util.Log.d("matka", "OkHttp. Status: " + response.code()); 
      } catch (IOException e) { 
       throw new RuntimeException(e); 
      } 

      return null; 
     } 
    }.execute(); 
} 

void makeRequestRetrofit() { 
    api.test("", new Callback<Object>() { 
     @Override 
     public void success(Object o, Response response) { 
      android.util.Log.d("matka", "Retrofit success. Status: " + response.getStatus()); 
     } 

     @Override 
     public void failure(RetrofitError error) { 
      android.util.Log.d("matka", "Retrofit failure. Status: " + error.getResponse().getStatus()); 
     } 
    }); 
} 

होने के लिए}

+0

कृपया एक और हालिया OkHttp में अपग्रेड करें। 2.7.5 ने कई समस्याएं तय की हैं। –

+1

और OkHttp 3.x भी बेहतर है! –

+3

समस्या नवीनतम रेट्रोफिट (2.0.0-बीटा 2) और ओकेएचटीपी (3.2.0) संस्करणों के साथ भी बनी रहती है। – Egis

उत्तर

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