<p>ας υποθέσουμε αυτό το url ...</p><pre><code>http://www.example.com/page.php?id=10 </code></pre><p>(το αναγνωριστικό εδώ πρέπει να αποσταλεί σε ένα αίτημα post)</p><p>θέλω να στείλω τον <code>id = 10</code> στον <code>page.php</code> του εξυπηρετητή, ο οποίος τον αποδέχεται σε μια μέθοδοpost.</p><p>πώς μπορώ να το κάνω αυτό μέσα από την java;</p><p>δοκίμασα αυτό:</p><pre><code>url aaa = new url("http://www.example.com/page.php"); urlconnection ccc = aaa.openconnection(); </code></pre><p>αλλά ακόμα δεν μπορώ να καταλάβω πώς να το στείλετε μέσω post</p>
αποστολή http post αίτηση στη java
<h3>ενημερωμένη απάντηση:</h3><p>επειδή ορισμένες από τις κλάσεις, στην αρχική απάντηση, έχουν καταργηθεί στη νεότερη έκδοση των apache http components, δημοσιεύω αυτή την ενημερωμένη έκδοση.</p><p>με την ευκαιρία, μπορείτε να έχετε πρόσβαση στην πλήρη τεκμηρίωση για περισσότερα παραδείγματα <a href="http://hc.apache.org/httpcomponents-client-ga/tutorial/html/fundamentals.html#d5e37">εδώ</a> .</p><pre><code>httpclient httpclient = httpclients.createdefault(); httppost httppost = new httppost("http://www.a-domain.com/foo/"); // request parameters and other properties. list&lt;namevaluepair&gt; params = new arraylist&lt;namevaluepair&gt;(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 } } </code></pre><h3>αρχική απάντηση:</h3><p>συνιστώ να χρησιμοποιήσω το apache httpclient. την ταχύτερη και ευκολότερη υλοποίησή του.</p><pre><code>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. </code></pre><p>για περισσότερες πληροφορίες, ελέγξτε αυτή τη διεύθυνση url: <a href="http://hc.apache.org/">http://hc.apache.org/</a> </p>
<p>η αποστολή ενός αιτήματος post είναι εύκολη στη java vanilla. αρχίζοντας με <code>url</code>, πρέπει να το μετατρέψουμε σε <code>urlconnection</code> χρησιμοποιώντας <code>url.openconnection();</code>. μετά από αυτό, πρέπει να το ρίξουμε σε <code>httpurlconnection</code>, ώστε να έχουμε πρόσβαση στη μέθοδο <code>setrequestmethod()</code> για να ορίσουμε τη μέθοδο μας. τέλος, λέμε ότι πρόκειται να στείλουμε στοιχεία σχετικά με τη σύνδεση.</p><pre class="lang-java prettyprint-override"><code>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); </code></pre><p>στη συνέχεια, πρέπει να δηλώσουμε τι πρόκειται να στείλουμε:</p><h2>αποστολή απλής φόρμας</h2><p>μια κανονική post που προέρχεται από μια φόρμα http έχει μια μορφή <a href="https://tools.ietf.org/html/rfc1866#section-8.2.1">καλά καθορισμένη</a> . πρέπει να μετατρέψουμε τα δεδομένα μας σε αυτή τη μορφή:</p><pre class="lang-java prettyprint-override"><code>map&lt;string,string&gt; arguments = new hashmap&lt;&gt;(); arguments.put("username", "root"); arguments.put("password", "sjh76hsn!"); // this is a fake password obviously stringjoiner sj = new stringjoiner("&amp;"); for(map.entry&lt;string,string&gt; 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; </code></pre><p>μπορούμε στη συνέχεια να επισυνάψουμε τα περιεχόμενα της φόρμας μας στο http request με κατάλληλες κεφαλίδες και να το στείλουμε.</p><pre class="lang-java prettyprint-override"><code>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() </code></pre><hr><h2>αποστολή json</h2><p>μπορούμε επίσης να στείλουμε json χρησιμοποιώντας java, αυτό είναι επίσης εύκολο:</p><pre class="lang-java prettyprint-override"><code>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() </code></pre><p>θυμηθείτε ότι διαφορετικοί διακομιστές δέχονται διαφορετικούς τύπους περιεχομένου για το json, δείτε <a href="https://stackoverflow.com/q/477816/1542723">this</a> ερώτηση.</p><hr><h2>αποστολή αρχείων με δημοσίευση java</h2><p>η αποστολή αρχείων μπορεί να θεωρηθεί πιο δύσκολη, καθώς η μορφή είναι πιο πολύπλοκη. θα προσθέσουμε επίσης υποστήριξη για την αποστολή των αρχείων ως συμβολοσειρά, αφού δεν θέλουμε να αποθηκεύσουμε πλήρως το αρχείο στη μνήμη.</p><p>γι 'αυτό, καθορίζουμε μερικές βοηθητικές μεθόδους:</p><pre class="lang-java prettyprint-override"><code>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 &gt;= 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)); } </code></pre><p>στη συνέχεια, μπορούμε να χρησιμοποιήσουμε αυτές τις μεθόδους για να δημιουργήσουμε ένα αίτημα πολλαπλών αναρτήσεων ως εξής:</p><pre class="lang-java prettyprint-override"><code>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() </code></pre>
<pre><code>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()); </code></pre>
<p>η πρώτη απάντηση ήταν μεγάλη, αλλά έπρεπε να προσθέσω try/catch για να αποφύγω τα λάθη του compiler java.<br> επίσης, είχα προβλήματα για να καταλάβω πώς να διαβάσω την <code>httpresponse</code> με τις βιβλιοθήκες java.</p><p>εδώ είναι ο πιο πλήρης κώδικας:</p><pre><code>/* * create the post request */ httpclient httpclient = new defaulthttpclient(); httppost httppost = new httppost("http://example.com/"); // request parameters and other properties. list&lt;namevaluepair&gt; params = new arraylist&lt;namevaluepair&gt;(); 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(); } </code></pre>
<p>ένας απλός τρόπος με τον οποίο χρησιμοποιείται το apache http components είναι</p><pre><code>request.post("http://www.example.com/page.php") .bodyform(form.form().add("id", "10").build()) .execute() .returncontent(); </code></pre><p>ρίξτε μια ματιά στο <a href="http://hc.apache.org/httpcomponents-client-ga/tutorial/html/fluent.html">fluent api</a> </p>
<p>ο απλούστερος τρόπος για την αποστολή παραμέτρων με το αίτημα μετάδοσης:</p><pre><code>string posturl = "http://www.example.com/page.php"; httppost post = new httppost(posturl); list&lt;namevaluepair&gt; params = new arraylist&lt;namevaluepair&gt;(); 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); </code></pre><p>εχεις κανει. τώρα μπορείτε να χρησιμοποιήσετε <code>responsepost</code>. αποκτήστε το περιεχόμενο απάντησης ως συμβολοσειρά:</p><pre><code>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. } </code></pre>
<p>κλήση <code>httpurlconnection.setrequestmethod("post")</code> και <code>httpurlconnection.setdooutput(true);</code> στην πραγματικότητα μόνο η τελευταία είναι απαραίτητη ως post τότε γίνεται η προεπιλεγμένη μέθοδος.</p>