জাভাতে HTTP পোস্ট অনুরোধ প্রেরণ


294

এই URL টি ধরে নিই ...

http://www.example.com/page.php?id=10            

(এখানে পোষ্ট অনুরোধে আইডি প্রেরণ করা দরকার)

আমি id = 10সার্ভারটির কাছে এটি পাঠাতে চাই page.php, যা এটি কোনও পোস্ট পদ্ধতিতে গ্রহণ করে।

আমি জাভা থেকে কীভাবে এটি করতে পারি?

আমি এটি চেষ্টা করেছি:

URL aaa = new URL("http://www.example.com/page.php");
URLConnection ccc = aaa.openConnection();

তবে কীভাবে এটি পোস্টের মাধ্যমে পাঠাতে হয় তা আমি এখনও বুঝতে পারি না

উত্তর:


339

আপডেট উত্তর:

যেহেতু কিছু ক্লাস, আসল উত্তরে, অ্যাপাচি এইচটিটিপি উপাদানগুলির নতুন সংস্করণে অবচিত হয়েছে, তাই আমি এই আপডেটটি পোস্ট করছি।

উপায় দ্বারা, আপনি এখানে আরও উদাহরণের জন্য সম্পূর্ণ ডকুমেন্টেশন অ্যাক্সেস করতে পারেন

HttpClient httpclient = HttpClients.createDefault();
HttpPost httppost = new HttpPost("http://www.a-domain.com/foo/");

// Request parameters and other properties.
List<NameValuePair> params = new ArrayList<NameValuePair>(2);
params.add(new BasicNameValuePair("param-1", "12345"));
params.add(new BasicNameValuePair("param-2", "Hello!"));
httppost.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));

//Execute and get the response.
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();

if (entity != null) {
    try (InputStream instream = entity.getContent()) {
        // do something useful
    }
}

আসল উত্তর:

আমি অ্যাপাচি এইচটিপিপিলেট ব্যবহার করার পরামর্শ দিচ্ছি। এটির দ্রুত এবং কার্যকর করা সহজ।

HttpPost post = new HttpPost("http://jakarata.apache.org/");
NameValuePair[] data = {
    new NameValuePair("user", "joe"),
    new NameValuePair("password", "bloggs")
};
post.setRequestBody(data);
// execute method and handle any error responses.
...
InputStream in = post.getResponseBodyAsStream();
// handle response.

আরও তথ্যের জন্য এই ইউআরএলটি পরীক্ষা করুন: http://hc.apache.org/


25
কিছুক্ষণ চেষ্টা করার পরে PostMethodএটিতে আমার হাত পেতে স্ট্যাকওভারফ্লো.comHttpPost / a / 9242394 / 1338936 অনুসারে এটি আসলে বলা হয়েছে - যার যেমন এই উত্তরটি আমি পেয়েছিলাম ঠিক তার জন্যই :)
মার্টিন লিন

1
@ জুয়ান (এবং মার্টিন লিন) মন্তব্যগুলির জন্য আপনাকে ধন্যবাদ। আমি সবেমাত্র উত্তরটি আপডেট করেছি।
mhshams

আপনার সংশোধিত উত্তর এখনও hc.apache.org ব্যবহার করে?
জাঙ্গোফান

@ ডিজেঙ্গোফান হ্যাঁ সংশোধিত উত্তরেও অ্যাপাচি-এইচসি-র একটি লিঙ্ক রয়েছে।
mhshams

6
আপনার আমদানিকৃত libs
গিচাওয়ের

191

ভ্যানিলা জাভাতে একটি পোষ্ট অনুরোধ পাঠানো সহজ। একটি দিয়ে শুরু করে URLআমাদের এটি URLConnectionব্যবহারে রূপান্তর করতে হবে url.openConnection();। এর পরে, আমাদের এটিকে কাস্ট করা দরকার HttpURLConnection, যাতে setRequestMethod()আমাদের পদ্ধতিটি সেট করার জন্য আমরা এর পদ্ধতিটি অ্যাক্সেস করতে পারি । আমরা শেষ পর্যন্ত বলেছি যে আমরা সংযোগের মাধ্যমে ডেটা প্রেরণ করতে যাচ্ছি।

URL url = new URL("https://www.example.com/login");
URLConnection con = url.openConnection();
HttpURLConnection http = (HttpURLConnection)con;
http.setRequestMethod("POST"); // PUT is another valid option
http.setDoOutput(true);

তারপরে আমাদের কী প্রেরণ করতে হবে তা আমাদের জানিয়ে দেওয়া দরকার:

একটি সাধারণ ফর্ম পাঠানো

একটি HTTP ফর্ম থেকে আসা একটি সাধারণ POST একটি ভাল সংজ্ঞায়িত ফর্ম্যাট আছে। আমাদের এই ইনপুটটিকে এই ফর্ম্যাটে রূপান্তর করতে হবে:

Map<String,String> arguments = new HashMap<>();
arguments.put("username", "root");
arguments.put("password", "sjh76HSn!"); // This is a fake password obviously
StringJoiner sj = new StringJoiner("&");
for(Map.Entry<String,String> entry : arguments.entrySet())
    sj.add(URLEncoder.encode(entry.getKey(), "UTF-8") + "=" 
         + URLEncoder.encode(entry.getValue(), "UTF-8"));
byte[] out = sj.toString().getBytes(StandardCharsets.UTF_8);
int length = out.length;

তারপরে আমরা আমাদের ফর্মের বিষয়বস্তু যথাযথ শিরোনামের সাথে http অনুরোধের সাথে সংযুক্ত করতে পারি এবং এটি প্রেরণ করতে পারি।

http.setFixedLengthStreamingMode(length);
http.setRequestProperty("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
http.connect();
try(OutputStream os = http.getOutputStream()) {
    os.write(out);
}
// Do something with http.getInputStream()

JSON প্রেরণ করা হচ্ছে

আমরা জাভা ব্যবহার করে জসন পাঠাতে পারি, এটিও সহজ:

byte[] out = "{\"username\":\"root\",\"password\":\"password\"}" .getBytes(StandardCharsets.UTF_8);
int length = out.length;

http.setFixedLengthStreamingMode(length);
http.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
http.connect();
try(OutputStream os = http.getOutputStream()) {
    os.write(out);
}
// Do something with http.getInputStream()

মনে রাখবেন যে বিভিন্ন সার্ভারগুলি জসনের জন্য বিভিন্ন সামগ্রী-প্রকার গ্রহণ করে, এই প্রশ্নটি দেখুন।


জাভা পোস্ট সহ ফাইল পাঠানো হচ্ছে

ফর্ম্যাটটি আরও জটিল হওয়ায় ফাইলগুলি প্রেরণাকে পরিচালনা করা আরও চ্যালেঞ্জ হিসাবে বিবেচিত হতে পারে। আমরা স্ট্রিং হিসাবে ফাইলগুলি প্রেরণের জন্য সমর্থন যুক্ত করতে যাচ্ছি, যেহেতু আমরা ফাইলটিকে মেমরিতে পুরোপুরি বাফার করতে চাই না।

এর জন্য, আমরা কিছু সহায়ক পদ্ধতি সংজ্ঞায়িত করি:

private void sendFile(OutputStream out, String name, InputStream in, String fileName) {
    String o = "Content-Disposition: form-data; name=\"" + URLEncoder.encode(name,"UTF-8") 
             + "\"; filename=\"" + URLEncoder.encode(filename,"UTF-8") + "\"\r\n\r\n";
    out.write(o.getBytes(StandardCharsets.UTF_8));
    byte[] buffer = new byte[2048];
    for (int n = 0; n >= 0; n = in.read(buffer))
        out.write(buffer, 0, n);
    out.write("\r\n".getBytes(StandardCharsets.UTF_8));
}

private void sendField(OutputStream out, String name, String field) {
    String o = "Content-Disposition: form-data; name=\"" 
             + URLEncoder.encode(name,"UTF-8") + "\"\r\n\r\n";
    out.write(o.getBytes(StandardCharsets.UTF_8));
    out.write(URLEncoder.encode(field,"UTF-8").getBytes(StandardCharsets.UTF_8));
    out.write("\r\n".getBytes(StandardCharsets.UTF_8));
}

এরপরে আমরা নিম্নোক্তভাবে একটি বহুগর্ভ পোস্ট অনুরোধ তৈরি করতে এই পদ্ধতিগুলি ব্যবহার করতে পারি:

String boundary = UUID.randomUUID().toString();
byte[] boundaryBytes = 
           ("--" + boundary + "\r\n").getBytes(StandardCharsets.UTF_8);
byte[] finishBoundaryBytes = 
           ("--" + boundary + "--").getBytes(StandardCharsets.UTF_8);
http.setRequestProperty("Content-Type", 
           "multipart/form-data; charset=UTF-8; boundary=" + boundary);

// Enable streaming mode with default settings
http.setChunkedStreamingMode(0); 

// Send our fields:
try(OutputStream out = http.getOutputStream()) {
    // Send our header (thx Algoman)
    out.write(boundaryBytes);

    // Send our first field
    sendField(out, "username", "root");

    // Send a seperator
    out.write(boundaryBytes);

    // Send our second field
    sendField(out, "password", "toor");

    // Send another seperator
    out.write(boundaryBytes);

    // Send our file
    try(InputStream file = new FileInputStream("test.txt")) {
        sendFile(out, "identification", file, "text.txt");
    }

    // Finish the request
    out.write(finishBoundaryBytes);
}


// Do something with http.getInputStream()

5
এই পোস্টটি দরকারী, কিন্তু বেশ ত্রুটিযুক্ত। এটি কাজ করতে আমার 2 দিন সময় লেগেছে। সুতরাং এটি কাজ করার জন্য আপনাকে স্ট্যান্ডার্ডচর্সেটস.ইউটিএফ 8 এর সাথে স্ট্যান্ডার্ডচারেটস.ইউটিএফ_ 8 দিয়ে প্রতিস্থাপন করতে হবে। বাউন্ডারিবাইটস এবং ফিনিসবাউন্ডারিবাইটসের জন্য দুটি অতিরিক্ত হাইফেন পাওয়া দরকার যা সামগ্রী-প্রকারে প্রেরণ করা হয় না, তাই সীমানা বাইটস = ("-" + সীমানা + "\ r \ n") পেয়ে যান ... আপনাকেও একবার বাউন্ডারিবাইটগুলি প্রেরণ করতে হবে প্রথম ক্ষেত্রের আগে বা প্রথম ক্ষেত্রটিকে উপেক্ষা করা হবে!
অ্যালগোম্যান

out.write(finishBoundaryBytes);লাইনের দরকার কেন ? http.connect();পোস্ট প্রেরণ সম্পাদন করবে, তাই না?
জ্যানোস

16
"ভ্যানিলা জাভাতে একটি পোষ্ট অনুরোধ পাঠানো সহজ” " এবং তারপরে পাইথনের মতো কয়েকটি তুলনায় কয়েক ডজন লাইন কোড অনুসরণ করে requests.post('http://httpbin.org/post', data = {'key':'value'})… আমি জাভাতে নতুন তাই এটি আমার কাছে "সহজ" শব্দের খুব অদ্ভুত ব্যবহার :)
লিন

1
আমি কি বিবেচনা করা প্রত্যাশিত এটা জাভা :) চেয়ে অপেক্ষাকৃত সহজ
shaahiin

মায়াবী \ r \ n \ r \ n এর অর্থ CRLF CRLF (ক্যারেজ রিটার্ন + লাইন ফিড)। এটি 2x নতুন লাইন তৈরি করে। প্রথম নতুন লাইনটি বর্তমান লাইনটি শেষ করা। দ্বিতীয় লাইনটি একটি অনুরোধে http শিরোনাম থেকে http শিরোনামকে আলাদা করা। এইচটিটিপি হ'ল এএসসিআইআই ভিত্তিক প্রোটোকল। এটি \ r \ n সন্নিবেশ করানোর নিয়ম।
মিতজা গুস্টিন

99
String rawData = "id=10";
String type = "application/x-www-form-urlencoded";
String encodedData = URLEncoder.encode( rawData, "UTF-8" ); 
URL u = new URL("http://www.example.com/page.php");
HttpURLConnection conn = (HttpURLConnection) u.openConnection();
conn.setDoOutput(true);
conn.setRequestMethod("POST");
conn.setRequestProperty( "Content-Type", type );
conn.setRequestProperty( "Content-Length", String.valueOf(encodedData.length()));
OutputStream os = conn.getOutputStream();
os.write(encodedData.getBytes());

গুরুত্বপূর্ণ লক্ষণীয়: স্ট্রিং.জেটবাইটস () এর পরে অন্য কোনও কিছু ব্যবহার করা মনে হয় না। উদাহরণস্বরূপ, একটি মুদ্রণ লেখক ব্যবহার সম্পূর্ণরূপে ব্যর্থ হয়।
লিটল ববি টেবিল

5
এবং কিভাবে 2 পোস্ট ডেটা সেট করবেন? কোলন, কমা দ্বারা আলাদা?
গোলমাল বিড়াল

10
encode(String)অবচয় করা হয়। আপনাকে ব্যবহার করতে হবে encode(String, String), যা এনকোডিংয়ের ধরণ নির্দিষ্ট করে। উদাহরণ: encode(rawData, "UTF-8")
sudo

3
আপনি শেষে অনুসরণ করতে পারেন। এটি নিশ্চিত করে তোলে যে অনুরোধটি শেষ হয়েছে এবং সার্ভার প্রতিক্রিয়াটি প্রক্রিয়াকরণের সুযোগ পেয়েছে: কান.গেটরেসপোনসকোড ();
সিজমন জাচিম

3
পুরো স্ট্রিংটি এনকোড করবেন না .. আপনাকে প্রতিটি প্যারামিটারের
মানটিই

22

প্রথম উত্তরটি দুর্দান্ত ছিল তবে জাভা সংকলক ত্রুটিগুলি এড়াতে আমাকে চেষ্টা / ক্যাচ যুক্ত করতে হয়েছিল।
এছাড়াও, কীভাবে পড়তে হয় তা বুঝতে আমার সমস্যা হয়েছিলHttpResponse জাভা লাইব্রেরিগুলির সাহায্যে ।

এখানে আরও সম্পূর্ণ কোড:

/*
 * Create the POST request
 */
HttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost("http://example.com/");
// Request parameters and other properties.
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("user", "Bob"));
try {
    httpPost.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));
} catch (UnsupportedEncodingException e) {
    // writing error to Log
    e.printStackTrace();
}
/*
 * Execute the HTTP Request
 */
try {
    HttpResponse response = httpClient.execute(httpPost);
    HttpEntity respEntity = response.getEntity();

    if (respEntity != null) {
        // EntityUtils to get the response content
        String content =  EntityUtils.toString(respEntity);
    }
} catch (ClientProtocolException e) {
    // writing exception to log
    e.printStackTrace();
} catch (IOException e) {
    // writing exception to log
    e.printStackTrace();
}

সত্তা ইউটিস সহায়ক ছিল।
জয়

6
দুঃখিত, তবে আপনি কোনও ত্রুটি ধরেননি, আপনি তাদের পরিচয় করিয়ে দিয়েছেন। আপনি যেখানে সেগুলি পরিচালনা করতে পারবেন না এমন জায়গায় ব্যতিক্রমগুলি ধরা খুব সাধারণ ভুল এবং e.printStackTrace()কোনও কিছুই হ্যান্ডেল করে না।
মার্টিনাস

java.net. সংযোগের ধারণা: সংযোগের সময়সীমা শেষ হয়েছে: সংযুক্ত
kerZy হার্ট

17

অ্যাপাচি এইচটিটিপি উপাদান ব্যবহার করার একটি সহজ উপায়

Request.Post("http://www.example.com/page.php")
            .bodyForm(Form.form().add("id", "10").build())
            .execute()
            .returnContent();

ফ্লুয়েন্ট এপিআই দেখুন a


3
শুধু সুবিধার জন্য; নির্ভরতা সেটআপ / তথ্য: hc.apache.org/httpcomponents-client-4.5.x/httpclient/… এবং hc.apache.org/httpcomponents-client-4.5.x/fluent-hc/…
জারোস্লাভ জারুবা

5

পোস্ট অনুরোধের সাথে পরামিতিগুলি প্রেরণের সহজ উপায়:

String postURL = "http://www.example.com/page.php";

HttpPost post = new HttpPost(postURL);

List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("id", "10"));

UrlEncodedFormEntity ent = new UrlEncodedFormEntity(params, "UTF-8");
post.setEntity(ent);

HttpClient client = new DefaultHttpClient();
HttpResponse responsePOST = client.execute(post);

তুমি করেছ. এখন আপনি ব্যবহার করতে পারেন responsePOST। স্ট্রিং হিসাবে প্রতিক্রিয়া সামগ্রী পান:

BufferedReader reader = new BufferedReader(new  InputStreamReader(responsePOST.getEntity().getContent()), 2048);

if (responsePOST != null) {
    StringBuilder sb = new StringBuilder();
    String line;
    while ((line = reader.readLine()) != null) {
        System.out.println(" line : " + line);
        sb.append(line);
    }
    String getResponseString = "";
    getResponseString = sb.toString();
//use server output getResponseString as string value.
}

1

কল HttpURLConnection.setRequestMethod("POST")এবং HttpURLConnection.setDoOutput(true);প্রকৃতপক্ষে কেবলমাত্র পরেরটি পোষ্ট হিসাবে প্রয়োজনীয় তখন ডিফল্ট পদ্ধতিতে পরিণত হয়।


এটি এটি এইচটিপিআরএল সংযোগ.সেটরউকেস্টেমোথড () :)
জোসে ডিয়াজ

1

আমি অ্যাপাচি http এপিআই - তে নির্মিত http-অনুরোধটি পুনরায় ব্যবহার করতে চাই ।

HttpRequest<String> httpRequest = HttpRequestBuilder.createPost("http://www.example.com/page.php", String.class)
.responseDeserializer(ResponseDeserializer.ignorableDeserializer()).build();

public void send(){
   String response = httpRequest.execute("id", "10").get();
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.