我正在使用HttpClient和ClientConnectionManager来管理andorid中的http请求。以下MyHttp类是唯一一个处理所有http方法的类。
但是有很多异步http请求,我发现httpClient无法发送正确的cookie。例如,在我的应用程序中,应用程序启动时有五个请求。但是有两种类型的cookie来自并发送到服务器。在服务器端。你能给我任何一个adivse吗?
PS: 我有另一个使用相同api服务器的web项目和ios项目,它们在cookie处理上都是正确的。
MyHttp是我的BaseActivity中的实例化,它扩展了Activtiy
public class MyHttp {
public static HttpClient httpClient;
public static HttpContext localContext;
public MyHttp() {
}
public String getHttp(String url) throws Exception {
String result = "";
HttpGet getMethod = new HttpGet(url);
getMethod.addHeader("Content-Type","application/json");
HttpResponse response = httpClient.execute(getMethod,localContext);
if(response.getStatusLine().getStatusCode() == HttpStatus.SC_OK){
result = EntityUtils.toString(response.getEntity(), "utf-8");
}
return result;
}
public static synchronized HttpClient getHttpClient() {
/**cookie*/
CookieStore cookieStore = new BasicCookieStore();
// Create local HTTP context
localContext = new BasicHttpContext();
// Bind custom cookie store to the local context
localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore);
if (null == httpClient) {
// 初始化工作
HttpParams params = new BasicHttpParams();
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
// 设置http https支持
SchemeRegistry schReg = new SchemeRegistry();
schReg.register(new Scheme("http", PlainSocketFactory
.getSocketFactory(), 80));
schReg.register(new Scheme("https", sf, 443));
ClientConnectionManager conManager = new ThreadSafeClientConnManager(
params, schReg);
httpClient = new DefaultHttpClient(conManager, params);
}
return httpClient;
}
}
答案 0 :(得分:0)
在getHttpClient()
方法中,您要在每次通话时创建BasicCookieStore
和BasicHttpContext
的新实例。这将导致在不同时间使用不同的cookie存储,这可能会导致cookie丢失。
我建议您只实例化localContext
一次,并在每次请求时重复使用此实例。
P.S。我真的建议你不要使用HttpClient
。谷歌不再支持它,你不应该花时间去投资它。最好使用HttpUrlConnection
,或者一些可用的HTTP通信框架 - Volley,OkHttp,Retrofit等。