Java 如何在Android上使用cookies发出http请求?
我希望在正确处理Cookie的同时向远程服务器发出http请求(例如,存储服务器发送的Cookie,并在后续请求时发送这些Cookie)。保留任何和所有cookie都很好,但实际上我唯一关心的是会话cookie 在java.net中,实现这一点的首选方法似乎是使用java.net.CookieHandler(抽象基类)和java.net.CookieManager(具体实现)。Android有java.net.CookieHandler,但似乎没有java.net.CookieManager 我可以通过检查http头手工编写所有代码,但似乎有一种更简单的方法Java 如何在Android上使用cookies发出http请求?,java,android,http,url,cookies,Java,Android,Http,Url,Cookies,我希望在正确处理Cookie的同时向远程服务器发出http请求(例如,存储服务器发送的Cookie,并在后续请求时发送这些Cookie)。保留任何和所有cookie都很好,但实际上我唯一关心的是会话cookie 在java.net中,实现这一点的首选方法似乎是使用java.net.CookieHandler(抽象基类)和java.net.CookieManager(具体实现)。Android有java.net.CookieHandler,但似乎没有java.net.CookieManager 我
在Android上进行http请求同时保留cookies的正确方法是什么?我不使用谷歌Android,但我想你会发现,让它正常工作并不难。如果您阅读,您将看到注册的cookiehandler从HTTP代码获取回调 因此,如果没有默认设置(您是否检查了
CookieHandler.getDefault()
是否真的为null?),那么您可以简单地扩展CookieHandler,实现put/get并使其几乎自动工作。如果你走那条路线,一定要考虑并发访问等。
编辑:显然,您必须通过
CookieHandler.setDefault()
将自定义实现的实例设置为默认处理程序才能接收回调。忘了提到这一点。事实证明,Google Android附带了Apache HttpClient 4.0,我能够通过以下中的“基于表单的登录”示例了解如何实现这一点:
import java.util.ArrayList;
导入java.util.List;
导入org.apache.http.HttpEntity;
导入org.apache.http.HttpResponse;
导入org.apache.http.NameValuePair;
导入org.apache.http.client.entity.UrlEncodedFormEntity;
导入org.apache.http.client.methods.HttpGet;
导入org.apache.http.client.methods.HttpPost;
导入org.apache.http.cookie.cookie;
导入org.apache.http.impl.client.DefaultHttpClient;
导入org.apache.http.message.BasicNameValuePair;
导入org.apache.http.protocol.http;
/**
*演示如何使用HttpClient API执行
*基于表单的登录。
*/
公共类ClientFormLogin{
公共静态void main(字符串[]args)引发异常{
DefaultHttpClient httpclient=新的DefaultHttpClient();
HttpGet HttpGet=新的HttpGet(“https://portal.sun.com/portal/dt");
HttpResponse response=httpclient.execute(httpget);
HttpEntity=response.getEntity();
System.out.println(“登录表单get:+response.getStatusLine());
如果(实体!=null){
entity.consumercontent();
}
System.out.println(“cookies的初始集:”);
列表cookies=httpclient.getCookieStore().getCookies();
if(cookies.isEmpty()){
系统输出打印项次(“无”);
}否则{
对于(int i=0;i
cookie只是另一个HTTP头。在使用apache库或HTTPUrlConnection进行HTTP调用时,始终可以设置它。无论哪种方式,您都应该能够以这种方式读取和设置HTTP cookies
你可以阅读更多信息
我可以分享我的代码和平,以证明您可以使它变得多么容易
public static String getServerResponseByHttpGet(String url, String token) {
try {
HttpClient client = new DefaultHttpClient();
HttpGet get = new HttpGet(url);
get.setHeader("Cookie", "PHPSESSID=" + token + ";");
Log.d(TAG, "Try to open => " + url);
HttpResponse httpResponse = client.execute(get);
int connectionStatusCode = httpResponse.getStatusLine().getStatusCode();
Log.d(TAG, "Connection code: " + connectionStatusCode + " for request: " + url);
HttpEntity entity = httpResponse.getEntity();
String serverResponse = EntityUtils.toString(entity);
Log.d(TAG, "Server response for request " + url + " => " + serverResponse);
if(!isStatusOk(connectionStatusCode))
return null;
return serverResponse;
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
由于不推荐使用Apache库,对于那些想要使用
httpurlconception
的人,我编写了这个类来发送Get和Post请求,其帮助如下:
公共类Web服务{
静态最终字符串COOKIES\u HEADER=“设置Cookie”;
静态最终字符串COOKIE=“COOKIE”;
静态CookieManager msCookieManager=新CookieManager();
专用静态int响应码;
公共静态字符串sendPost(字符串请求URL、字符串URL参数){
网址;
字符串响应=”;
试一试{
url=新url(请求url);
HttpURLConnection conn=(HttpURLConnection)url.openConnection();
连接设置读取超时(15000);
连接设置连接超时(15000);
conn.setRequestMethod(“POST”);
conn.setRequestProperty(“内容类型”,“应用程序/json;字符集=utf-8”);
如果(mscookeManager.getCookieStore().getCookies().size()>0){
//加入cookie时,根据需要使用“,”或“;”。大多数服务器都使用“;”
conn.setRequestProperty(COOKIE,
TextUtils.join(“;”,mscookeManager.getCookieStore().getCookies());
}
conn.setDoInput(真);
连接设置输出(真);
public static String getServerResponseByHttpGet(String url, String token) {
try {
HttpClient client = new DefaultHttpClient();
HttpGet get = new HttpGet(url);
get.setHeader("Cookie", "PHPSESSID=" + token + ";");
Log.d(TAG, "Try to open => " + url);
HttpResponse httpResponse = client.execute(get);
int connectionStatusCode = httpResponse.getStatusLine().getStatusCode();
Log.d(TAG, "Connection code: " + connectionStatusCode + " for request: " + url);
HttpEntity entity = httpResponse.getEntity();
String serverResponse = EntityUtils.toString(entity);
Log.d(TAG, "Server response for request " + url + " => " + serverResponse);
if(!isStatusOk(connectionStatusCode))
return null;
return serverResponse;
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public class WebService {
static final String COOKIES_HEADER = "Set-Cookie";
static final String COOKIE = "Cookie";
static CookieManager msCookieManager = new CookieManager();
private static int responseCode;
public static String sendPost(String requestURL, String urlParameters) {
URL url;
String response = "";
try {
url = new URL(requestURL);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(15000);
conn.setConnectTimeout(15000);
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "application/json; charset=utf-8");
if (msCookieManager.getCookieStore().getCookies().size() > 0) {
//While joining the Cookies, use ',' or ';' as needed. Most of the server are using ';'
conn.setRequestProperty(COOKIE ,
TextUtils.join(";", msCookieManager.getCookieStore().getCookies()));
}
conn.setDoInput(true);
conn.setDoOutput(true);
OutputStream os = conn.getOutputStream();
BufferedWriter writer = new BufferedWriter(
new OutputStreamWriter(os, "UTF-8"));
if (urlParameters != null) {
writer.write(urlParameters);
}
writer.flush();
writer.close();
os.close();
Map<String, List<String>> headerFields = conn.getHeaderFields();
List<String> cookiesHeader = headerFields.get(COOKIES_HEADER);
if (cookiesHeader != null) {
for (String cookie : cookiesHeader) {
msCookieManager.getCookieStore().add(null, HttpCookie.parse(cookie).get(0));
}
}
setResponseCode(conn.getResponseCode());
if (getResponseCode() == HttpsURLConnection.HTTP_OK) {
String line;
BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
while ((line = br.readLine()) != null) {
response += line;
}
} else {
response = "";
}
} catch (Exception e) {
e.printStackTrace();
}
return response;
}
// HTTP GET request
public static String sendGet(String url) throws Exception {
URL obj = new URL(url);
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
// optional default is GET
con.setRequestMethod("GET");
//add request header
con.setRequestProperty("User-Agent", "Mozilla");
/*
* https://stackoverflow.com/questions/16150089/how-to-handle-cookies-in-httpurlconnection-using-cookiemanager
* Get Cookies form cookieManager and load them to connection:
*/
if (msCookieManager.getCookieStore().getCookies().size() > 0) {
//While joining the Cookies, use ',' or ';' as needed. Most of the server are using ';'
con.setRequestProperty(COOKIE ,
TextUtils.join(";", msCookieManager.getCookieStore().getCookies()));
}
/*
* https://stackoverflow.com/questions/16150089/how-to-handle-cookies-in-httpurlconnection-using-cookiemanager
* Get Cookies form response header and load them to cookieManager:
*/
Map<String, List<String>> headerFields = con.getHeaderFields();
List<String> cookiesHeader = headerFields.get(COOKIES_HEADER);
if (cookiesHeader != null) {
for (String cookie : cookiesHeader) {
msCookieManager.getCookieStore().add(null, HttpCookie.parse(cookie).get(0));
}
}
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
return response.toString();
}
public static void setResponseCode(int responseCode) {
WebService.responseCode = responseCode;
Log.i("Milad", "responseCode" + responseCode);
}
public static int getResponseCode() {
return responseCode;
}
}