2016-07-17 112 views
7

Ho bisogno di aggiungere i cookie con aggiornamento 2.0. Se ho capito bene, i cookie sono gli stessi delle intestazioni. devono essere aggiunti questa immagine Biscotti:Aggiungi cookie per l'aggiornamento di 2 richieste

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

questo lavoro con Jsoup lib:

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

ecco il mio codice con richiesta di retrofit:

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

ma è non funziona. .. ottengo 403 codice di errore quindi non ci sono cookie nella richiesta ...

any io dea?

+0

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

risposta

25

Prima di tutto: il cookie non è lo stesso di un'intestazione. Cookie è un'intestazione HTTP speciale denominata Cookie seguita da un elenco di coppie di chiavi e valori (separati da ";"). Qualcosa di simile:

Cookie: sessionid=sessionid; token=token 

Dal you cannot set multiple Cookie headers in the same request non si è in grado di utilizzare due @Header annotazioni per i valori separati (sessionid e gettone nel campione). Mi viene in mente una molto hacky soluzione:

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

Si cambia il metodo per inviare sessionId e gettone in una stringa. Quindi in questo caso dovresti generare manualmente una stringa di cookie in anticipo. Nel tuo caso oggetto sessionIdAndToken String dovrebbe essere uguale a "SessionID = here_goes_sessionid; gettone = here_goes_token"

La soluzione adeguata è quello di impostare i cookie aggiungendo OkHttp 's (cioè Retrofit libreria utilizza per effettuare chiamate http di base) request interceptor. È possibile visualizzare la soluzione o aggiungere intestazioni personalizzate here.

+1

Funzionamento perfettamente. provato con la via hacky :) –

2

per aggiungere un'intestazione cookie okhttp intestazioni di richiesta, aggiungere questo in Interceptor:

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

Rif: https://github.com/square/okhttp/wiki/Interceptors come detto da @Alexander Mironov

codice di esempio completo qui: Spero che ti aiuta

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

Esempio di servizio Web API aggiungere Intestazione

@FormUrlEncoded 
@POST("getDriverRoutes") 
Call<Guzergah> getGuzergah(@Header("Cookie") String userCookie, @Field("driver_id") int driver_id); 

quando si effettua il login al sistema di salvare i cookie al vostro locale su Response come

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(); 

e in ogni servizio è necessario essere autorised inviare i cookie, ottenere da sharepreference e inviarlo con il servizio web

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); 
Problemi correlati