জাভাতে জেএসএন ব্যবহার করে এইচটিটিপি পোস্ট করুন


187

আমি জাভাতে JSON ব্যবহার করে একটি সাধারণ এইচটিটিপি পোস্ট করতে চাই।

যাক ইউআরএল হয় www.site.com

এবং এটি উদাহরণ {"name":"myname","age":"20"}হিসাবে লেবেলযুক্ত মান গ্রহণ করে 'details'

আমি কীভাবে পোষ্টের সিনট্যাক্স তৈরি করতে যাব?

আমি JSON জাভাদোকসে কোনও পোস্টের পদ্ধতি খুঁজে পাচ্ছি বলে মনে হয় না।

উত্তর:


167

এখানেই সব পাবেন আপনি যা করতে চান:

  1. অ্যাপাচি এইচটিটিপিপ্লায়েন্ট পান, এটি আপনাকে প্রয়োজনীয় অনুরোধ করতে সক্ষম করবে
  2. এটির সাথে একটি এইচটিপিপোস্ট অনুরোধ তৈরি করুন এবং "অ্যাপ্লিকেশন / x-www-form-urlencoded" শিরোনাম যুক্ত করুন
  3. একটি স্ট্রিংএন্টিটি তৈরি করুন যা আপনি এটিতে JSON পাস করবেন
  4. কলটি কার্যকর করুন

কোডটি মোটামুটি মত দেখাচ্ছে (আপনার এখনও এটি ডিবাগ করে এটিকে কাজ করতে হবে)

//Deprecated
//HttpClient httpClient = new DefaultHttpClient(); 

HttpClient httpClient = HttpClientBuilder.create().build(); //Use this instead 

try {

    HttpPost request = new HttpPost("http://yoururl");
    StringEntity params =new StringEntity("details={\"name\":\"myname\",\"age\":\"20\"} ");
    request.addHeader("content-type", "application/x-www-form-urlencoded");
    request.setEntity(params);
    HttpResponse response = httpClient.execute(request);

    //handle response here...

}catch (Exception ex) {

    //handle exception here

} finally {
    //Deprecated
    //httpClient.getConnectionManager().shutdown(); 
}

9
আপনি JSONObject হিসাবে এটি বিমূর্ত করা সর্বদা ভাল অনুশীলন হিসাবে আপনি সরাসরি স্ট্রিংয়ে করছেন, আপনি স্ট্রিংটি ভুলভাবে প্রোগ্রাম করতে পারেন এবং সিনট্যাক্স ত্রুটির কারণ হতে পারে। জেএসএনওবজেক্ট ব্যবহার করে আপনি নিশ্চিত হন যে আপনার সিরিয়ালাইজেশন সর্বদা সঠিক JSON কাঠামো অনুসরণ করে
মোমো

3
মূলত, তারা উভয়ই কেবল ডেটা সংক্রমণ করে। পার্থক্য হ'ল আপনি এটি সার্ভারে কীভাবে প্রসেস করবেন। আপনার যদি মাত্র কয়েকটি মূল-মান জুড়ি থাকে তবে কী 1 = মান 1, কী 2 = মান 2 ইত্যাদির সাথে একটি সাধারণ পোষ্ট প্যারামিটার সম্ভবত যথেষ্ট but JSON ব্যবহার বিবেচনা শুরু করুন। কী-মান জোড় ব্যবহার করে জটিল কাঠামো প্রেরণ করা সার্ভারে পার্স করা খুব বাজে এবং কষ্টসাধ্য হবে (আপনি চেষ্টা করতে পারেন এবং আপনি এখনই এটি দেখতে পাবেন)। এখনও সেই দিনের কথা মনে আছে যখন আমাদের সেই উরগটি করতে হয়েছিল .. এটি খুব সুন্দর ছিল না ..
মোমো

1
সাহায্য করে আনন্দ পেলাম! যদি আপনি যা সন্ধান করছেন এটি যদি আপনার হয় তবে আপনার উত্তরটি গ্রহণ করা উচিত যাতে অনুরূপ প্রশ্নযুক্ত অন্যান্য লোকদের তাদের প্রশ্নগুলির ভাল নেতৃত্ব পেতে পারে। আপনি উত্তরের চেক চিহ্নটি ব্যবহার করতে পারেন। আপনার যদি আরও প্রশ্ন থাকে তবে আমাকে জানান
মোমো

12
সামগ্রী-প্রকারটি 'অ্যাপ্লিকেশন / জেসন' হওয়া উচিত নয়। 'অ্যাপ্লিকেশন / x-www-form-urlencoded' বোঝায় স্ট্রিংটি কোয়েরি স্ট্রিংয়ের অনুরূপ বিন্যাসিত হবে। এনএম আমি দেখতে পেয়েছি আপনি কী করেছেন, আপনি কোনও সম্পত্তির মূল্য হিসাবে জসন ব্লাব রেখেছিলেন।
ম্যাথু ওয়ার্ড

1
অবহেলিত অংশটি ক্লোজেবল এইচটিপিপিলেট ব্যবহার করে প্রতিস্থাপন করা উচিত যা আপনাকে একটি। ক্লোজ () - পদ্ধতি দেয়। দেখুন stackoverflow.com/a/20713689/1484047
Frame91

91

আপনি নিজের জাভা ক্লাসগুলি JSON অবজেক্টে রূপান্তর করতে আপনি গসন লাইব্রেরিটি ব্যবহার করতে পারেন।

উপরের উদাহরণ অনুসারে আপনি যে ভেরিয়েবলগুলি প্রেরণ করতে চান তার জন্য একটি পোজো ক্লাস তৈরি করুন

{"name":"myname","age":"20"}

হয়ে

class pojo1
{
   String name;
   String age;
   //generate setter and getters
}

একবার আপনি পোজো 1 শ্রেণিতে ভেরিয়েবলগুলি সেট করে নিলে আপনি নিম্নলিখিত কোডটি ব্যবহার করে তা প্রেরণ করতে পারবেন

String       postUrl       = "www.site.com";// put in your url
Gson         gson          = new Gson();
HttpClient   httpClient    = HttpClientBuilder.create().build();
HttpPost     post          = new HttpPost(postUrl);
StringEntity postingString = new StringEntity(gson.toJson(pojo1));//gson.tojson() converts your pojo to json
post.setEntity(postingString);
post.setHeader("Content-type", "application/json");
HttpResponse  response = httpClient.execute(post);

এবং এগুলি হ'ল আমদানি

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.HttpClientBuilder;

এবং GSON এর জন্য

import com.google.gson.Gson;

1
হাই, আপনি কীভাবে আপনার httpClient অবজেক্টটি তৈরি করবেন? এটি একটি ইন্টারফেস
ব্যবহারকারী 3290180

1
হ্যাঁ এটি একটি ইন্টারফেস। আপনি 'HTTPClient httpClient = new DefaultHttpClient () ব্যবহার করে একটি উদাহরণ তৈরি করতে পারেন;
প্রকাশ

2
এখন এটি হ্রাস করা হয়েছে, আমাদের অবশ্যই HTTPClient httpClient = HttpClientBuilder.create ()। build () ব্যবহার করতে হবে;
ব্যবহারকারী 3290180

5
কিভাবে এইচটিপিপিলেট ক্লায়েন্ট আমদানি করবেন?
এসটারলিঙ্কফ

3
স্ট্রিংউটিলস কনস্ট্রাক্টরের কনটেন্টটাইপ প্যারামিটারটি ব্যবহার করতে এবং কন্টেন্ট টাইপ.এপপিএলিকেশন_জেএসএন ম্যানুয়ালি হেডারের পরিবর্তে পাস করার জন্য আমি এটিকে কিছুটা ক্লিনার মনে করি।
টাউনকিউব

47

@ মোমোর উত্তর অ্যাপাচি এইচটিপিপিলেট, সংস্করণ 4.3.1 বা তার পরে। আমি JSON-Javaআমার JSON অবজেক্টটি তৈরি করতে ব্যবহার করছি :

JSONObject json = new JSONObject();
json.put("someKey", "someValue");    

CloseableHttpClient httpClient = HttpClientBuilder.create().build();

try {
    HttpPost request = new HttpPost("http://yoururl");
    StringEntity params = new StringEntity(json.toString());
    request.addHeader("content-type", "application/json");
    request.setEntity(params);
    httpClient.execute(request);
// handle response here...
} catch (Exception ex) {
    // handle exception here
} finally {
    httpClient.close();
}

20

এইচটিটিপিআরএল সংযোগটি ব্যবহার করা সম্ভবত সবচেয়ে সহজ ।

http://www.xyzws.com/Javafaq/how-to-use-httpurlconnection-post-data-to-web-server/139

আপনি JSONObject বা আপনার JSON তৈরি করতে যা কিছু ব্যবহার করবেন তবে নেটওয়ার্কটি পরিচালনা করার জন্য নয়; আপনার এটির ক্রমিক ক্রিয়াকলাপ করতে হবে এবং তারপরে এটি পোষ্টের কাছে একটি HTTP URL সংযোগে পাস করতে হবে।


JSONObject j = নতুন JSONObject (); j.put ("নাম", "আমার নাম"); জে.পুট ("বয়স", "20"); সে রকমই? কীভাবে এটি সিরিয়াল করব?
//F007

@ asdf007 শুধু ব্যবহার j.toString()
অ্যালেক্স চার্চিল

সত্য, এই সংযোগটি ব্লক করছে। আপনি যদি কোনও পোষ্ট পাঠাচ্ছেন তবে এটি সম্ভবত কোনও বড় বিষয় নয়; আপনি যদি একটি ওয়েব সার্ভার চালাচ্ছেন তবে এটি অনেক বেশি গুরুত্বপূর্ণ।
অ্যালেক্স চার্চিল

এইচটিপিআরএল সংযোগের লিঙ্কটি মারা গেছে।
টোবিয়াস রোল্যান্ড

আপনি কীভাবে শরীরে জসন পোস্ট করবেন উদাহরণ পোস্ট করতে পারেন?

15
protected void sendJson(final String play, final String prop) {
     Thread t = new Thread() {
     public void run() {
        Looper.prepare(); //For Preparing Message Pool for the childThread
        HttpClient client = new DefaultHttpClient();
        HttpConnectionParams.setConnectionTimeout(client.getParams(), 1000); //Timeout Limit
        HttpResponse response;
        JSONObject json = new JSONObject();

            try {
                HttpPost post = new HttpPost("http://192.168.0.44:80");
                json.put("play", play);
                json.put("Properties", prop);
                StringEntity se = new StringEntity(json.toString());
                se.setContentType(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
                post.setEntity(se);
                response = client.execute(post);

                /*Checking response */
                if (response != null) {
                    InputStream in = response.getEntity().getContent(); //Get the data in the entity
                }

            } catch (Exception e) {
                e.printStackTrace();
                showMessage("Error", "Cannot Estabilish Connection");
            }

            Looper.loop(); //Loop in the message queue
        }
    };
    t.start();
}

7
আপনার কোডটি কী করে এবং কেন এটি সমস্যার সমাধান করবে সে সম্পর্কে আরও ব্যাখ্যা যুক্ত করতে আপনার পোস্টটি সম্পাদনা করার বিষয়টি বিবেচনা করুন। একটি উত্তর যা বেশিরভাগ সবে কোড থাকে (এমনকি এটি কাজ করে) সাধারণত ওপিকে তাদের সমস্যা বুঝতে সাহায্য করবে না
রেএনো

14

এই কোড ব্যবহার করে দেখুন:

HttpClient httpClient = new DefaultHttpClient();

try {
    HttpPost request = new HttpPost("http://yoururl");
    StringEntity params =new StringEntity("details={\"name\":\"myname\",\"age\":\"20\"} ");
    request.addHeader("content-type", "application/json");
    request.addHeader("Accept","application/json");
    request.setEntity(params);
    HttpResponse response = httpClient.execute(request);

    // handle response here...
}catch (Exception ex) {
    // handle exception here
} finally {
    httpClient.getConnectionManager().shutdown();
}

ধন্যবাদ! কেবল আপনার উত্তর এনকোডিংয়ের সমস্যা সমাধান করেছে :)
শ্রীকান্ত

@SonuDhakar কেন আপনি পাঠাতে application/jsonএকটি শিরোলেখ গ্রহণ এবং হিসাবে সামগ্রী-প্রকার উভয়
Kasun Siyambalapitiya

মনে হচ্ছে DefaultHttpClientএটি হ্রাস করা হয়েছে।
sdgfsdh

11

গুগল এন্ডপয়েন্টস এ জাভা ক্লায়েন্টের কাছ থেকে পোস্ট অনুরোধটি কীভাবে প্রেরণ করা যায় সে সম্পর্কে সমাধান অনুসন্ধান করতে আমি এই প্রশ্নটি পেয়েছি। উত্তরগুলির উপরে, খুব সম্ভবত সঠিক, তবে গুগল এন্ডপয়েন্টস এর ক্ষেত্রে কাজ করে না।

গুগল এন্ডপয়েন্টস এর সমাধান।

  1. অনুরোধের বডিটিতে কেবল জেএসএন স্ট্রিং থাকতে হবে, নাম = মান জোড় নয়।
  2. সামগ্রীর ধরণের শিরোনাম অবশ্যই "অ্যাপ্লিকেশন / জেসন" এ সেট করতে হবে।

    post("http://localhost:8888/_ah/api/langapi/v1/createLanguage",
                       "{\"language\":\"russian\", \"description\":\"dsfsdfsdfsdfsd\"}");
    
    
    
    public static void post(String url, String json ) throws Exception{
      String charset = "UTF-8"; 
      URLConnection connection = new URL(url).openConnection();
      connection.setDoOutput(true); // Triggers POST.
      connection.setRequestProperty("Accept-Charset", charset);
      connection.setRequestProperty("Content-Type", "application/json;charset=" + charset);
    
      try (OutputStream output = connection.getOutputStream()) {
        output.write(json.getBytes(charset));
      }
    
      InputStream response = connection.getInputStream();
    }

    এটি নিশ্চিতভাবে এইচটিপিপিলেট ব্যবহার করেও করা যেতে পারে।


8

আপনি অ্যাপাচি এইচটিটিপি দিয়ে নিম্নলিখিত কোডটি ব্যবহার করতে পারেন:

String payload = "{\"name\": \"myname\", \"age\": \"20\"}";
post.setEntity(new StringEntity(payload, ContentType.APPLICATION_JSON));

response = client.execute(request);

অতিরিক্তভাবে আপনি একটি জসন অবজেক্ট তৈরি করতে এবং ক্ষেত্রগুলিকে এই জাতীয় বস্তুতে রাখতে পারেন

HttpPost post = new HttpPost(URL);
JSONObject payload = new JSONObject();
payload.put("name", "myName");
payload.put("age", "20");
post.setEntity(new StringEntity(payload.toString(), ContentType.APPLICATION_JSON));

কী জিনিস ContentType.APPLICATION_JSON অন্যথায় এটা কাজ করা হয় নি যোগ করার জন্য আমাকে নতুন StringEntity (পে লোড, ContentType.APPLICATION_JSON) জন্য
জনি কেজ

2

জাভা 11 এর জন্য আপনি নতুন এইচটিটিপি ক্লায়েন্ট ব্যবহার করতে পারেন :

 HttpClient client = HttpClient.newHttpClient();
    HttpRequest request = HttpRequest.newBuilder()
        .uri(URI.create("http://localhost/api"))
        .header("Content-Type", "application/json")
        .POST(ofInputStream(() -> getClass().getResourceAsStream(
            "/some-data.json")))
        .build();

    client.sendAsync(request, BodyHandlers.ofString())
        .thenApply(HttpResponse::body)
        .thenAccept(System.out::println)
        .join();

আপনি ইনপুটস্ট্রিম, স্ট্রিং, ফাইল থেকে প্রকাশক ব্যবহার করতে পারেন। জেএসনকে স্ট্রিংয়ে রূপান্তর করা বা আপনি জ্যাকসনের সাথে করতে পারেন।


1

জাভা 8 অ্যাপাচি httpClient 4

CloseableHttpClient client = HttpClientBuilder.create().build();
HttpPost httpPost = new HttpPost("www.site.com");


String json = "details={\"name\":\"myname\",\"age\":\"20\"} ";

        try {
            StringEntity entity = new StringEntity(json);
            httpPost.setEntity(entity);

            // set your POST request headers to accept json contents
            httpPost.setHeader("Accept", "application/json");
            httpPost.setHeader("Content-type", "application/json");

            try {
                // your closeablehttp response
                CloseableHttpResponse response = client.execute(httpPost);

                // print your status code from the response
                System.out.println(response.getStatusLine().getStatusCode());

                // take the response body as a json formatted string 
                String responseJSON = EntityUtils.toString(response.getEntity());

                // convert/parse the json formatted string to a json object
                JSONObject jobj = new JSONObject(responseJSON);

                //print your response body that formatted into json
                System.out.println(jobj);

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

                e.printStackTrace();
            }

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

0

আমি অ্যাপাচি http এপিআই - তে নির্মিত এইচটিসি -রিকোয়েস্টটি রিকোমেন্ড করি।

HttpRequest<String> httpRequest = HttpRequestBuilder.createPost(yourUri, String.class)
    .responseDeserializer(ResponseDeserializer.ignorableDeserializer()).build();

public void send(){
   ResponseHandler<String> responseHandler = httpRequest.execute("details", yourJsonData);

   int statusCode = responseHandler.getStatusCode();
   String responseContent = responseHandler.orElse(null); // returns Content from response. If content isn't present returns null. 
}

আপনি চাইলে JSONঅনুরোধ বডি হিসাবে প্রেরণ করতে পারেন:

  ResponseHandler<String> responseHandler = httpRequest.executeWithBody(yourJsonData);

আমি হাইগলি ব্যবহারের আগে ডকুমেন্টেশন পড়ার পুনঃসংশোধন করি।


উপরোক্ত উত্তরের উপর আপনি কেন সবচেয়ে বেশি উত্সাহ দিয়ে পরামর্শ দিচ্ছেন?
জেরিল কুক

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