অ্যান্ড্রয়েডে কুকি ব্যবহার করে কীভাবে আমি একটি http অনুরোধ করব?


121

কুকিজ সঠিকভাবে পরিচালনা করার সময় আমি কোনও রিমোট সার্ভারে একটি http অনুরোধ করতে চাই (উদাঃ সার্ভারের দ্বারা প্রেরিত কুকিজ সংরক্ষণ করা এবং আমি পরবর্তী অনুরোধগুলি করার সময় এই কুকিগুলি প্রেরণ করব)। এটি যে কোনও এবং সমস্ত কুকিজ সংরক্ষণ করে রাখা ভাল লাগবে, তবে সত্যই আমি কেবল যত্নশীল হ'ল সেশন কুকি।

Java.net এর সাথে দেখা যাচ্ছে যে এটি করার পছন্দের উপায়টি হল java.net.CookieHandler (অ্যাবস্ট্রাক্ট বেস ক্লাস) এবং java.net.CookieManager (কংক্রিট বাস্তবায়ন) ব্যবহার করা। অ্যান্ড্রয়েডে java.net.CookieHandler রয়েছে, তবে এটি java.net.CookieManager আছে বলে মনে হয় না।

আমি HTTP শিরোনামগুলি পরিদর্শন করে হাতে হাতে কোডিং করতে পারলাম, তবে মনে হচ্ছে এটির কোনও সহজ উপায় থাকতে হবে।

কুকিজ সংরক্ষণ করার সময় অ্যান্ড্রয়েডে http অনুরোধ করার সঠিক উপায় কী?



3
ঠিক দু'বছরের পরে একটি নোট যেমন: java.net.CookieManagerসংস্করণ ২.৩ (এপিআই স্তর 9) থেকে এখন অ্যান্ড্রয়েডে সমর্থিত: ডেভেলপার.অ্যান্ড্রয়েড.
com

উত্তর:


92

দেখা যাচ্ছে যে গুগল অ্যান্ড্রয়েড অাপাচি এইচটিটিপিপ্লায়েন্ট ৪.০ সহ জাহাজ চালিয়েছে এবং আমি এইচটিটিপি ক্লিনেন্ট ডক্সে "ফর্ম ভিত্তিক লগন" উদাহরণ ব্যবহার করে এটি কীভাবে করব তা অনুধাবন করতে সক্ষম হয়েছি :

https://github.com/apache/httpcomponents-client/blob/master/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientFormLogin.java


import java.util.ArrayList;
import java.util.List;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.cookie.Cookie;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;

/**
 * A example that demonstrates how HttpClient APIs can be used to perform
 * form-based logon.
 */
public class ClientFormLogin {

    public static void main(String[] args) throws Exception {

        DefaultHttpClient httpclient = new DefaultHttpClient();

        HttpGet httpget = new HttpGet("https://portal.sun.com/portal/dt");

        HttpResponse response = httpclient.execute(httpget);
        HttpEntity entity = response.getEntity();

        System.out.println("Login form get: " + response.getStatusLine());
        if (entity != null) {
            entity.consumeContent();
        }
        System.out.println("Initial set of cookies:");
        List<Cookie> cookies = httpclient.getCookieStore().getCookies();
        if (cookies.isEmpty()) {
            System.out.println("None");
        } else {
            for (int i = 0; i < cookies.size(); i++) {
                System.out.println("- " + cookies.get(i).toString());
            }
        }

        HttpPost httpost = new HttpPost("https://portal.sun.com/amserver/UI/Login?" +
                "org=self_registered_users&" +
                "goto=/portal/dt&" +
                "gotoOnFail=/portal/dt?error=true");

        List <NameValuePair> nvps = new ArrayList <NameValuePair>();
        nvps.add(new BasicNameValuePair("IDToken1", "username"));
        nvps.add(new BasicNameValuePair("IDToken2", "password"));

        httpost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8));

        response = httpclient.execute(httpost);
        entity = response.getEntity();

        System.out.println("Login form get: " + response.getStatusLine());
        if (entity != null) {
            entity.consumeContent();
        }

        System.out.println("Post logon cookies:");
        cookies = httpclient.getCookieStore().getCookies();
        if (cookies.isEmpty()) {
            System.out.println("None");
        } else {
            for (int i = 0; i < cookies.size(); i++) {
                System.out.println("- " + cookies.get(i).toString());
            }
        }

        // When HttpClient instance is no longer needed, 
        // shut down the connection manager to ensure
        // immediate deallocation of all system resources
        httpclient.getConnectionManager().shutdown();        
    }
}

11
আমি কীভাবে জানতে পারি যে কীভাবে কুকিজকে অনুরোধটি ইউরালে সেট করতে হবে সেশনটি বৈধ কিনা তা পরীক্ষা করতে?
প্রবীণ

আপনাকে বেসিকনামভ্যালিউ পেয়ারস সাথে পরিচয় করিয়ে দেওয়ার জন্য ধন্যবাদ। তারা আমাকে সাহায্য করেছিল।
ভেকম্যান

3
আমি পেয়েছি The method getCookieStore() is undefined for the type HttpClient, আমাকে কি পরিবর্তন করতে হবে List<Cookie> cookies = ((AbstractHttpClient) httpclient).getCookieStore().getCookies();? কারণ যদি আমি করি, এটি কাজ করে।
ফ্রান্সিসকো

: @Praveen কটাক্ষপাত এখানে কুকিজ সংরক্ষণ করতে নাও stackoverflow.com/a/5989115/2615737
ফ্রান্সিসকো Corrales মোরালেস

@ এমএমবি: দুর্ভাগ্যক্রমে অ্যান্ড্রয়েড অ্যাপাচি মডিউলটিকে অবমূল্যায়ন করেছে। সুতরাং এখনই তার উত্তর সহায়ক নয় Hএইচটিপিআরএল সংযোগের সাথে এটি করার আরও একটি উপায় আছে?
মিলাদ ফরিদনিয়া

9

একটি কুকি অন্য একটি এইচটিটিপি শিরোনাম। আপনি এপাচি লাইব্রেরির সাথে বা HTTPUrlConnection দিয়ে কোনও HTTP কল করার সময় সর্বদা সেট করতে পারেন। যে কোনও উপায়ে আপনার এই ফ্যাশনটিতে HTTP কুকিজ পড়তে এবং সেট করতে সক্ষম হওয়া উচিত।

আপনি আরও তথ্যের জন্য এই নিবন্ধটি পড়তে পারেন ।

আপনি এটিকে কীভাবে সহজ করে তুলতে পারেন তা প্রদর্শনের জন্য আমি আমার শান্তির শান্তিকে ভাগ করতে পারি।

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

এটি আমাকে অনেক সহায়তা করে, +1 get.setHeader ("কুকি", "PHPSESSID =" + টোকেন + ";"); কাজটি করুন
ওসাকি

@ হেসাম: অস্থিরতা অ্যান্ড্রয়েড অ্যাপাচি মডিউলটিকে অবমূল্যায়ন করেছে। সুতরাং এখনই তার উত্তর সহায়ক নয় Hএইচটিপিআরএল সংযোগের সাথে এটি করার আরও একটি উপায় আছে?
মিলাদ ফরিদনিয়া

7

যেহেতু অ্যাপাচি পাঠাগারটি অবহেলা করা হয়েছে , যারা যারা ব্যবহার করতে চান তাদের HttpURLConncetionজন্য, এই উত্তরটির সাহায্যে গেট অ্যান্ড পোস্ট অনুরোধ পাঠানোর জন্য আমি এই ক্লাসটি লিখেছিলাম :

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");
    /*
    * /programming/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()));
    }

    /*
    * /programming/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;
}
}

2
চমৎকার ক্লাস মিলাদ! এটা আমাকে অনেক সাহায্য করেছে ! এখন, আমি ভাবছিলাম, যদি ব্যবহারকারীটি অ্যাপটি মেরে আবার চালু করে, কুকিটি উপলভ্য হওয়ার জন্য এটি সংরক্ষণ করতে চাইলে আমার ঠিক কী সঞ্চয় করা উচিত এবং কোথায় (কীভাবে)
কি জাই

1

আমি গুগল অ্যান্ড্রয়েড নিয়ে কাজ করি না তবে আমার মনে হয় আপনি এই কাজটি করা এতটা কঠিন নন। আপনি যদি জাভা টিউটোরিয়ালটির প্রাসঙ্গিক বিটটি পড়েন তবে আপনি দেখতে পাবেন যে একটি নিবন্ধিত কুকিহ্যান্ডলার এইচটিটিপি কোড থেকে কলব্যাক পেয়েছে।

সুতরাং যদি কোনও ডিফল্ট না থাকে (আপনি কি CookieHandler.getDefault()সত্যই নাল কিনা তা পরীক্ষা করে দেখেছেন?) তবে আপনি কেবল কুকিহ্যান্ডলারকে প্রসারিত করতে পারেন, পুট / গেট বাস্তবায়ন করতে পারেন এবং এটিকে স্বয়ংক্রিয়ভাবে বেশ কার্যকর করতে পারেন। একযোগে অ্যাক্সেস এবং আপনি যদি সেই রাস্তাটিতে যান তবে সেই মতো বিবেচনা করতে ভুলবেন না।

সম্পাদনা: স্পষ্টতই CookieHandler.setDefault()কলব্যাকগুলি গ্রহণ করার জন্য আপনাকে ডিফল্ট হ্যান্ডলার হিসাবে আপনার কাস্টম প্রয়োগের একটি উদাহরণ স্থাপন করতে হবে। তা উল্লেখ করতে ভুলে গেছি।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.