How to retrieve cookies in Retrofit?
android, cookies, retrofit
Solution
I had similar situation in my app. This solution works for me to retrieve cookies using Retrofit. MyCookieManager.java
import java.io.IOException;
import java.net.CookieManager;
import java.net.URI;
import java.util.List;
import java.util.Map;
class MyCookieManager extends CookieManager {
@Override
public void put(URI uri, Map<String, List<String>> stringListMap) throws IOException {
super.put(uri, stringListMap);
if (stringListMap != null && stringListMap.get("Set-Cookie") != null)
for (String string : stringListMap.get("Set-Cookie")) {
if (string.contains("userid")) {
//save your cookie here
}
}
}
}
Here is how to set your cookie for future requests using RequestInterceptor:
MyCookieManager myCookieManager = new MyCookieManager();
CookieHandler.setDefault(myCookieManager);
private static final RestAdapter REST_ADAPTER = new RestAdapter.Builder()
.setEndpoint(API_URL)
.setLogLevel(RestAdapter.LogLevel.FULL)
.setRequestInterceptor(new RequestInterceptor() {
@Override
public void intercept(RequestFacade requestFacade) {
String userId = ;//get your saved userid here
if (userId != null)
requestFacade.addHeader("Cookie", userId);
}
})
.build();
Problem
I read about request interceptors and what not but no clue how to really use them to obtain cookies... I am sending the cookie like so from nodejs... ``` res.cookie('userid', user._id, { maxAge: 86400000, signed: true, path: '/' }); ``` And in my android client - I have this set up so far for my RestApiManager ``` public class RestApiManager { private static final String API_URL = "ip: port"; private static final RestAdapter REST_ADAPTER = new RestAdapter.Builder() .setEndpoint(API_URL) .setLogLevel(RestAdapter.LogLevel.FULL) .build(); //Call interface public interface AsynchronousApi { //Login User @FormUrlEncoded @POST("/login") public void loginUser( @Field("loginName") String loginName, @Field("password") String password, Callback<UserResponse> callback); //Profile Picture @Multipart @POST("/profilePicture") public void uploadProfilePicture( @Part("photo") TypedFile photo, @Part("userId") String userId, Callback<UserResponse> callback); //success thumbnail to picasso } //create adapter private static final AsynchronousApi ASYNCHRONOUS_API = REST_ADAPTER.create(AsynchronousApi.class); //call service to initiate public static AsynchronousApi getAsyncApi() { return ASYNCHRONOUS_API; } } ``` Separate cookie class: ``` public class ApiCookie implements RequestInterceptor{ // cookie use private String sessionId; public ApiCookie() { } //COOKIE BELOW public void setSessionId(String sessionId) { this.sessionId = sessionId; } public void clearSessionId() { sessionId = null; } @Override public void intercept(RequestFacade requestFacade) { setSessionId(); } } ``` trying to figure out how to obtain the cookie and be able to send it with future requests, so I do not need to include a userId field?