2016-07-17 8 views
7

को रेट्रोफिट करने के लिए कुकीज़ जोड़ें मुझे रेट्रोफिट 2.0 के साथ कुकीज़ जोड़ने की आवश्यकता है। अगर मैं सही समझता हूं, कुकीज़ - हेडर के समान। इस कुकीज़ जोड़ा जाना चाहिए:2 अनुरोध

private HashMap<String, String> cookies = new HashMap(); 
cookies.put("sessionid", "sessionId"); 
cookies.put("token", "token"); 

Jsoup lib के साथ इस एक काम:

String json = Jsoup.connect(apiURL + "/link") 
        .cookies(cookies) 
        .ignoreHttpErrors(true) 
        .ignoreContentType(true) 
        .execute() 
        .body(); 

यहां पुराना वापस अनुरोध के साथ मेरी कोड है:

@GET("link") 
Call<CbGet> getData(@Header("sessionid") String sessionId, @Header("token") String token); 

लेकिन यह काम नहीं करता है। .. मुझे 403 त्रुटि कोड मिलता है इसलिए अनुरोध में कोई कुकीज़ नहीं है ...

कोई भी मैं डीईए?

+0

http://stackoverflow.com/questions/34881775/automatic-cookie-handling-with-okhttp-3 – USKMobility

उत्तर

25

सबसे पहले: कुकी शीर्षलेख के समान नहीं है। कुकी कुकी नामक एक विशेष HTTP शीर्षलेख है जिसके बाद कुंजी और मानों के जोड़े (";" से अलग) की सूची होती है। की तरह कुछ:

Cookie: sessionid=sessionid; token=token 

you cannot set multiple Cookie headers in the same request जब से तुम अलग मूल्यों (sessionid और टोकन अपने नमूने में) के लिए दो @Header एनोटेशन का उपयोग करने में सक्षम नहीं हैं। मैं एक बहुत hacky वैकल्पिक हल के बारे में सोच सकते हैं:

@GET("link") 
Call<CbGet> getData(@Header("Cookie") String sessionIdAndToken); 

आप sessionId भेजने के लिए और एक स्ट्रिंग में टोकन के लिए अपने-प्रक्रिया में परिवर्तन। तो इस मामले में आपको मैन्युअल रूप से कुकी स्ट्रिंग को मैन्युअल रूप से जेनरेट करना चाहिए। पुस्तकालय रेट्रोफिट के लिए उपयोग करता

उचित समाधानOkHttp की जोड़कर कुकी सेट करने की है (कि है, आपके मामले में sessionIdAndToken स्ट्रिंग ऑब्जेक्ट के "टोकन = here_goes_token sessionid = here_goes_sessionid" बराबर होना चाहिए अंतर्निहित http कॉल करना) request interceptor। आप समाधान देख सकते हैं या कस्टम हेडर here जोड़ सकते हैं।

+1

पूरी तरह से काम कर रहा है। हैकी तरीके से कोशिश की :) –

2

अनुरोध हेडर okhttp कुकी शीर्ष लेख जोड़ने के लिए, इंटरसेप्टर में जोड़ें:

request= request.newBuilder().addHeader("Cookie", sessionIdAndToken).build();

रेफरी: https://github.com/square/okhttp/wiki/Interceptors रूप

पूर्ण उदाहरण कोड यहाँ @Alexander मिरोनोव ने उल्लेख किया: आशा है कि यह आप में मदद करता है

import okhttp3.Interceptor; 
import okhttp3.Request; 
import okhttp3.Response; 
import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 

import java.io.IOException; 
import java.util.List; 


public class LoggingInterceptor implements Interceptor { 

    private static final Logger logger = LoggerFactory.getLogger(LoggingInterceptor.class); 
    @Override 
    public Response intercept(Interceptor.Chain chain) throws IOException { 
     Request request = chain.request(); 

     long t1 = System.nanoTime(); 
     request = processRequest(request); 
     logger.info("Sending request with url:{} and connection status:{} and request headers:{}", 
       request.url(), chain.connection(), request.headers()); 

     Response response = chain.proceed(request); 
     long t2 = System.nanoTime(); 
     logger.info("Received response for url:{} and time taken:{} and response headers as:{}", 
       response.request().url(), (t2 - t1)/1e6d, response.headers()); 

     response = processResponse(response); 
     return response; 
    } 
    //Add cookies for all subsequent requests 
    private Request processRequest(Request request) { 
     if(!request.url().toString().contains("/v1/authorize")) { 
      final EmployeeSession session = getSession(); 
      StringBuilder etokenAndUId = new StringBuilder("etoken="); 
      etokenAndUId.append(session.getEtoken()).append(";").append("uId=").append(session.getUId()); 
      logger.info("inside processRequest for all subsequent requests, sending cookies as etokenAndUId values:{}", etokenAndUId.toString()); 
      request= request.newBuilder().addHeader("Cookie", etokenAndUId.toString()).build(); 
     } 
     return request; 
    } 

    //Extract cookies from login url 
    private Response processResponse(Response response) { 
     if(response.request().url().toString().contains("/v1/authorize")) { 
      final List<String> cookieHeaders = response.headers("Set-Cookie"); 
      String etoken = "", uId = ""; 
      for (String cookieHeader : cookieHeaders) { 
       if(cookieHeader.contains("etoken=")) { 
        etoken = cookieHeader.substring(7, cookieHeader.indexOf(';')); 
       } 
       else if(cookieHeader.contains("uId=")) { 
        uId = cookieHeader.substring(4, cookieHeader.indexOf(';')); 
       } 
      } 
      logger.info("inside processResponse found cookies from login url response: etoken:{} and uid:{}", etoken, uId); 
      setSession(etoken, uId, "c1"); 
      logger.info("current employee session:{}", getSession()); 
     } 
     return response; 
    } 
}  
0

एपीआई वेब सेवा उदाहरण शीर्षलेख

जोड़ें
@FormUrlEncoded 
@POST("getDriverRoutes") 
Call<Guzergah> getGuzergah(@Header("Cookie") String userCookie, @Field("driver_id") int driver_id); 

आप की तरह

public void onResponse(Response<Login> response, Retrofit retrofit) { 
      hidepDialog(); 
      String cookie = response.headers().get("Set-Cookie"); 
      editor.putString("user_cookie", cookie.split(";")[0]); 
      editor.commit(); 

प्रतिक्रिया पर अपने स्थानीय करने के लिए कुकीज़ को बचाने प्रणाली के लिए लॉग इन और हर सेवा में आप autorised जाने की जरूरत है, अपने कुकीज़ भेज sharepreference से मिलता है और अपने वेब सेवा

साथ भेज देते हैं जब
String userCookie = shp.getString("user_cookie", ""); // here is cookies before send 
    Retrofit retrofit = new Retrofit.Builder() 
      .baseUrl("http://server.aracadabra.com:8080/"). 
        addConverterFactory(GsonConverterFactory.create()) 
      .build(); 

    final APIService service = retrofit.create(APIService.class); 

    final Call<SenMsgStatus> loginMCall = service.sendMessage(userCookie, type, route_id, user_id, passenger_id, passenger_status, text); 
संबंधित मुद्दे