Java 如何在Android上使用cookies发出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 我

我希望在正确处理Cookie的同时向远程服务器发出http请求(例如,存储服务器发送的Cookie,并在后续请求时发送这些Cookie)。保留任何和所有cookie都很好,但实际上我唯一关心的是会话cookie

在java.net中,实现这一点的首选方法似乎是使用java.net.CookieHandler(抽象基类)和java.net.CookieManager(具体实现)。Android有java.net.CookieHandler,但似乎没有java.net.CookieManager

我可以通过检查http头手工编写所有代码,但似乎有一种更简单的方法


在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;
}
}