অ্যান্ড্রয়েডে HTTPClient ব্যবহার করে কীভাবে JSON এ POST অনুরোধ প্রেরণ করবেন?


111

আমি HTTPClient ব্যবহার করে কীভাবে অ্যান্ড্রয়েড থেকে জেএসএন পোস্ট করতে হবে তা জানার চেষ্টা করছি। আমি এটির জন্য কিছুক্ষণ চেষ্টা করার চেষ্টা করেছি, অনলাইনে প্রচুর উদাহরণ পেয়েছি, তবে আমি তাদের কোনওটিই কাজ করতে পারি না। আমি বিশ্বাস করি এটি সাধারণভাবে আমার JSON / নেটওয়ার্কিং জ্ঞানের অভাবের কারণে। আমি জানি এখানে প্রচুর উদাহরণ রয়েছে তবে কেউ কি আমাকে প্রকৃত টিউটোরিয়ালটিতে নির্দেশ করতে পারে? আপনি প্রতিটি পদক্ষেপ কেন করেন বা এই পদক্ষেপটি কী করে তার কোড এবং ব্যাখ্যা সহ আমি একটি ধাপে ধাপে প্রক্রিয়া সন্ধান করছি। এটি জটিল, সরল ইচ্ছাশক্তি যথেষ্ট হওয়ার দরকার নেই।

আবার, আমি জানি যে এখানে অনেকগুলি উদাহরণ রয়েছে, আমি ঠিক কী ঘটছে এবং কেন সেভাবে চলছে তা ব্যাখ্যা করে আমি সত্যিই একটি উদাহরণ খুঁজছি।

যদি কেউ এই সম্পর্কে একটি ভাল অ্যান্ড্রয়েড বই সম্পর্কে জানেন তবে দয়া করে আমাকে জানান।

@ স্থায়ী সাহায্যের জন্য আবারও ধন্যবাদ, আমি নীচে বর্ণিত কোডটি এখানে

public void shNameVerParams() throws Exception{
     String path = //removed
     HashMap  params = new HashMap();

     params.put(new String("Name"), "Value"); 
     params.put(new String("Name"), "Value");

     try {
        HttpClient.SendHttpPost(path, params);
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
 }

আপনি যে উদাহরণগুলি কাজ করতে পারবেন না তার একটি পোস্ট করতে পারেন? কিছু কাজ করে আপনি শিখবেন যে টুকরাগুলি কীভাবে একসাথে ফিট হয়।
2'11 fredw

উত্তর:


157

এই উত্তরে আমি জাস্টিন গ্রামেনস দ্বারা পোস্ট করা একটি উদাহরণ ব্যবহার করছি ।

JSON সম্পর্কে

JSON এর অর্থ জাভাস্ক্রিপ্ট অবজেক্ট নোটেশন। জাভাস্ক্রিপ্টে বৈশিষ্ট্যগুলি এই জাতীয় object1.nameএবং এর মতো উভয়ই রেফারেন্স করা যায় object['name'];। নিবন্ধের উদাহরণটি JSON এর এই বিটটি ব্যবহার করে।

অংশগুলি
একটি কী হিসাবে ইমেলযুক্ত একটি ফ্যান অবজেক্ট এবং মান হিসাবে foo@bar.com

{
  fan:
    {
      email : 'foo@bar.com'
    }
}

সুতরাং বস্তুর সমতুল্য হবে fan.email;বা fan['email'];। উভয়ের একই মান হবে 'foo@bar.com'

HttpClient অনুরোধ সম্পর্কে

নিম্নলিখিতটি হ'ল আমাদের লেখক এইচটিটিপিপ্লায়েন্ট অনুরোধ করার জন্য ব্যবহার করেছিলেন । আমি এগুলিতে একটি বিশেষজ্ঞ হিসাবে দাবি করি না তাই কারও কাছে যদি কিছু পরিভাষা নির্দ্বিধায় মুক্ত কথা বলা হয়।

public static HttpResponse makeRequest(String path, Map params) throws Exception 
{
    //instantiates httpclient to make request
    DefaultHttpClient httpclient = new DefaultHttpClient();

    //url with the post data
    HttpPost httpost = new HttpPost(path);

    //convert parameters into JSON object
    JSONObject holder = getJsonObjectFromMap(params);

    //passes the results to a string builder/entity
    StringEntity se = new StringEntity(holder.toString());

    //sets the post request as the resulting string
    httpost.setEntity(se);
    //sets a request header so the page receving the request
    //will know what to do with it
    httpost.setHeader("Accept", "application/json");
    httpost.setHeader("Content-type", "application/json");

    //Handles what is returned from the page 
    ResponseHandler responseHandler = new BasicResponseHandler();
    return httpclient.execute(httpost, responseHandler);
}

মানচিত্র

আপনি যদি Mapডেটা কাঠামোর সাথে পরিচিত না হন তবে জাভা মানচিত্রের রেফারেন্সটি একবার দেখুন । সংক্ষেপে, একটি মানচিত্র একটি অভিধান বা হ্যাশের অনুরূপ।

private static JSONObject getJsonObjectFromMap(Map params) throws JSONException {

    //all the passed parameters from the post request
    //iterator used to loop through all the parameters
    //passed in the post request
    Iterator iter = params.entrySet().iterator();

    //Stores JSON
    JSONObject holder = new JSONObject();

    //using the earlier example your first entry would get email
    //and the inner while would get the value which would be 'foo@bar.com' 
    //{ fan: { email : 'foo@bar.com' } }

    //While there is another entry
    while (iter.hasNext()) 
    {
        //gets an entry in the params
        Map.Entry pairs = (Map.Entry)iter.next();

        //creates a key for Map
        String key = (String)pairs.getKey();

        //Create a new map
        Map m = (Map)pairs.getValue();   

        //object for storing Json
        JSONObject data = new JSONObject();

        //gets the value
        Iterator iter2 = m.entrySet().iterator();
        while (iter2.hasNext()) 
        {
            Map.Entry pairs2 = (Map.Entry)iter2.next();
            data.put((String)pairs2.getKey(), (String)pairs2.getValue());
        }

        //puts email and 'foo@bar.com'  together in map
        holder.put(key, data);
    }
    return holder;
}

এই পোস্টটি নিয়ে উত্থাপিত কোনও প্রশ্ন সম্পর্কে বা নির্দ্বিধায় আমি যদি কিছু স্পষ্ট না করে থাকি বা যদি আপনি এখনও বিভ্রান্ত হয়ে পড়ে থাকেন এমন কিছু সম্পর্কে মন্তব্য করতে নির্দ্বিধায় অনুগ্রহ করে ... ইত্যাদি যা সত্যিই আপনার মাথার মধ্যে রয়েছে।

(জাস্টিন গ্রামেনস অনুমোদন না দিলে আমি নেমে যাব। তবে তা না হলে জাস্টিনকে এ সম্পর্কে শীতল হওয়ার জন্য ধন্যবাদ।)

হালনাগাদ

আমি কীভাবে কোডটি ব্যবহার করব সে সম্পর্কে একটি মন্তব্য পেয়ে খুশি হয়েছি এবং বুঝতে পেরেছি যে রিটার্নের ধরণে কোনও ভুল ছিল mistake পদ্ধতিটির স্বাক্ষরটি একটি স্ট্রিং ফেরত দিতে সেট করা হয়েছিল তবে এই ক্ষেত্রে এটি কোনও কিছুই ফেরত দিতে চাইছিল না। আমি স্বাক্ষরটি এইচটিটিপিআরস্পোনসে পরিবর্তন করেছি এবং আপনাকে এই লিঙ্কটি উল্লেখ করব এইচটিটিপি রেসপোনসের প্রতিক্রিয়া বডি পেতে পাথ ভেরিয়েবলটি ইউআরএল এবং কোডটিতে কোনও ভুল সমাধানের জন্য আপডেট করেছি।


ধন্যবাদ @ টরেন্স সুতরাং ভিন্ন শ্রেণিতে তিনি এমন একটি মানচিত্র তৈরি করছেন যাতে বিভিন্ন কী এবং মান রয়েছে যা পরবর্তীতে জেএসএনওবজেক্টে রূপান্তরিত হবে। আমি অনুরূপ কিছু বাস্তবায়নের চেষ্টা করেছি, তবে মানচিত্রের সাথে আমার কোনও অভিজ্ঞতা নেই, আমি আমার মূল পোস্টে যা প্রয়োগ করার চেষ্টা করেছি তার কোডটি যুক্ত করব। সেই থেকে আপনার যা যা চলছে তার জন্য আপনার ব্যাখ্যাগুলি এবং হার্ডকোডযুক্ত নাম এবং মান সহ JSONObjects তৈরি করে এটি কাজ করতে আমি সফল হয়েছিল। ধন্যবাদ!

Woot, খুশি আমি সাহায্য করতে পারে।
টেরেন্স

জাস্টিন বলেছে সে অনুমোদন দিয়েছে। তাঁর কাছে আসতে হবে এবং এতক্ষণে নিজেই একটি মন্তব্য দিতে হবে।
আবিজার্ন

আমি এই কোডটি ব্যবহার করতে চাই। কিভাবে আমি এই সম্পর্কে যান ? দয়া করে নির্দিষ্ট করুন কী কী পাথের পরিবর্তনশীল এবং কী ফিরে আসতে হবে যাতে আমার জাভা প্রান্তে আমি ডেটা আনতে পারি।
পূর্বক

3
এর কোনও কারণ নেই getJsonObjectFromMap(): জেএসএনওবজেক্টের এমন একজন কনস্ট্রাক্টর রয়েছে যা গ্রহণ করে Map: developer.android.com/references/org/json/…
pr1001

41

@ টেরেন্সের উত্তরের বিকল্প সমাধান এখানে। আপনি সহজেই রূপান্তরটি আউটসোর্স করতে পারেন। Gson গ্রন্থাগার বিস্ময়কর কাজ JSON, বিভিন্ন ডাটা স্ট্রাকচার এবং অন্যান্য উপায় কাছাকাছি রূপান্তর করে।

public static void execute() {
    Map<String, String> comment = new HashMap<String, String>();
    comment.put("subject", "Using the GSON library");
    comment.put("message", "Using libraries is convenient.");
    String json = new GsonBuilder().create().toJson(comment, Map.class);
    makeRequest("http://192.168.0.1:3000/post/77/comments", json);
}

public static HttpResponse makeRequest(String uri, String json) {
    try {
        HttpPost httpPost = new HttpPost(uri);
        httpPost.setEntity(new StringEntity(json));
        httpPost.setHeader("Accept", "application/json");
        httpPost.setHeader("Content-type", "application/json");
        return new DefaultHttpClient().execute(httpPost);
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    } catch (ClientProtocolException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return null;
}

অনুরূপভাবে গসনের পরিবর্তে জ্যাকসন ব্যবহার করেও করা যেতে পারে । আমি রেট্রোফিটটি একবার দেখে নেওয়ার পরামর্শ দিচ্ছি যা আপনার জন্য এই বয়লারপ্লেট কোডটি অনেকগুলি গোপন করে। আরও অভিজ্ঞ বিকাশকারীদের জন্য আমি RxAndroid চেষ্টা করে দেখার পরামর্শ দিই


আমার অ্যাপ্লিকেশনটি এইচটিপিপুট পদ্ধতিটির মাধ্যমে ডেটা প্রেরণ করছে server আমি জানি না কীভাবে জসন থেকে ডেটা পাবেন। দয়া করে আমাকে বলবেন. কোড
কংকেয়া

@ কংকেয়া দয়া করে জিএসওএন লাইব্রেরিটি দেখুন । এটি JSON ফাইলটি জাভা অবজেক্টে পার্স করতে সক্ষম।
জেজেডি

@ জেজেডি এ পর্যন্ত আপনি যা পরামর্শ দিচ্ছেন তা হ'ল রিমোট সার্ভারে ডেটা প্রেরণ এবং এটির একটি দুর্দান্ত ব্যাখ্যা, তবে কীভাবে এইচটিটিপি প্রোটোকল ব্যবহার করে জেএসএন বিষয়টিকে পার্স করতে হবে তা জানতে চান। আপনি কী জেএসএন পার্সিংয়ের মাধ্যমে আপনার উত্তরটি বিশদভাবে বর্ণনা করতে পারেন? এটি নতুন যারা আছেন তাদের জন্য এটি খুব সহায়ক হবে।
অ্যান্ড্রয়েডদেভ

@ অ্যান্ড্রয়েডদেভ দয়া করে একটি নতুন প্রশ্ন খুলুন যেহেতু এই প্রশ্নটি ক্লায়েন্টের কাছ থেকে সার্ভারে ডেটা প্রেরণ সম্পর্কিত। এখানে একটি লিঙ্ক বাদ দিতে নির্দ্বিধায়।
জেজেডি

@ জেজেডি আপনি বিমূর্ত পদ্ধতিটি কল করছেন execute()এবং এটি অবশ্যই ব্যর্থ হয়েছে
কনস্ট্যান্টিন কনোপকো

33

আমি HttpURLConnectionপরিবর্তে এটি ব্যবহার করার পরামর্শ দিচ্ছি HttpGet। হিসাবে HttpGetইতিমধ্যে অ্যান্ড্রয়েড এপিআই স্তর 22 অসমর্থিত হয়েছে।

HttpURLConnection httpcon;  
String url = null;
String data = null;
String result = null;
try {
  //Connect
  httpcon = (HttpURLConnection) ((new URL (url).openConnection()));
  httpcon.setDoOutput(true);
  httpcon.setRequestProperty("Content-Type", "application/json");
  httpcon.setRequestProperty("Accept", "application/json");
  httpcon.setRequestMethod("POST");
  httpcon.connect();

  //Write       
  OutputStream os = httpcon.getOutputStream();
  BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os, "UTF-8"));
  writer.write(data);
  writer.close();
  os.close();

  //Read        
  BufferedReader br = new BufferedReader(new InputStreamReader(httpcon.getInputStream(),"UTF-8"));

  String line = null; 
  StringBuilder sb = new StringBuilder();         

  while ((line = br.readLine()) != null) {  
    sb.append(line); 
  }         

  br.close();  
  result = sb.toString();

} catch (UnsupportedEncodingException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
} 

5

এই কাজের জন্য খুব বেশি কোড, এই লাইব্রেরিটি https://github.com/kodart/Httpzoid is অভ্যন্তরীণভাবে GSON ব্যবহার করে এবং এমন API সরবরাহ করে যা বস্তুর সাথে কাজ করে check সমস্ত JSON বিশদ লুকানো আছে।

Http http = HttpFactory.create(context);
http.get("http://example.com/users")
    .handler(new ResponseHandler<User[]>() {
        @Override
        public void success(User[] users, HttpResponse response) {
        }
    }).execute();

দুর্দান্ত সমাধান, দুর্ভাগ্যক্রমে এই প্লাগইনটিতে গ্রেড সাপোর্টের অভাব রয়েছে: /
ইলেক্ট্রনিক্স

3

একটি রেস্ট্রুল ওয়েব পরিষেবা থেকে এইচএইচটিপি সংযোগ স্থাপন এবং ডেটা আনার কয়েকটি উপায় রয়েছে। সর্বাধিক সাম্প্রতিক একটি জিএসওএন। তবে আপনি জিএসএন-তে এগিয়ে যাওয়ার আগে আপনার অবশ্যই একটি HTTP ক্লায়েন্ট তৈরির সর্বাধিক প্রচলিত উপায় সম্পর্কে একটি ধারণা থাকতে হবে এবং একটি রিমোট সার্ভারের সাথে ডেটা যোগাযোগ করতে হবে। আমি HTTPClient ব্যবহার করে POST এবং GET অনুরোধ প্রেরণের দুটি পদ্ধতিই উল্লেখ করেছি।

/**
 * This method is used to process GET requests to the server.
 * 
 * @param url 
 * @return String
 * @throws IOException
 */
public static String connect(String url) throws IOException {

    HttpGet httpget = new HttpGet(url);
    HttpResponse response;
    HttpParams httpParameters = new BasicHttpParams();
    // Set the timeout in milliseconds until a connection is established.
    // The default value is zero, that means the timeout is not used. 
    int timeoutConnection = 60*1000;
    HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);
    // Set the default socket timeout (SO_TIMEOUT) 
    // in milliseconds which is the timeout for waiting for data.
    int timeoutSocket = 60*1000;

    HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);
    HttpClient httpclient = new DefaultHttpClient(httpParameters);
    try {

        response = httpclient.execute(httpget);

        HttpEntity entity = response.getEntity();
        if (entity != null) {
            InputStream instream = entity.getContent();
            result = convertStreamToString(instream);
            //instream.close();
        }
    } 
    catch (ClientProtocolException e) {
        Utilities.showDLog("connect","ClientProtocolException:-"+e);
    } catch (IOException e) {
        Utilities.showDLog("connect","IOException:-"+e); 
    }
    return result;
}


 /**
 * This method is used to send POST requests to the server.
 * 
 * @param URL
 * @param paramenter
 * @return result of server response
 */
static public String postHTPPRequest(String URL, String paramenter) {       

    HttpParams httpParameters = new BasicHttpParams();
    // Set the timeout in milliseconds until a connection is established.
    // The default value is zero, that means the timeout is not used. 
    int timeoutConnection = 60*1000;
    HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);
    // Set the default socket timeout (SO_TIMEOUT) 
    // in milliseconds which is the timeout for waiting for data.
    int timeoutSocket = 60*1000;

    HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);
    HttpClient httpclient = new DefaultHttpClient(httpParameters);
    HttpPost httppost = new HttpPost(URL);
    httppost.setHeader("Content-Type", "application/json");
    try {
        if (paramenter != null) {
            StringEntity tmp = null;
            tmp = new StringEntity(paramenter, "UTF-8");
            httppost.setEntity(tmp);
        }
        HttpResponse httpResponse = null;
        httpResponse = httpclient.execute(httppost);
        HttpEntity entity = httpResponse.getEntity();
        if (entity != null) {
            InputStream input = null;
            input = entity.getContent();
            String res = convertStreamToString(input);
            return res;
        }
    } 
     catch (Exception e) {
        System.out.print(e.toString());
    }
    return null;
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.