IT-Swarm.Net

Αποστολή HTTP POST Αίτηση στη Java

ας υποθέσουμε αυτό το URL ...

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

(Το αναγνωριστικό εδώ πρέπει να αποσταλεί σε ένα αίτημα POST)

Θέλω να στείλω τον id = 10 στον page.php του εξυπηρετητή, ο οποίος τον αποδέχεται σε μια μέθοδοPOST.

Πώς μπορώ να το κάνω αυτό μέσα από την Java;

Δοκίμασα αυτό:

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

Αλλά ακόμα δεν μπορώ να καταλάβω πώς να το στείλετε μέσω POST

262
Jazz

Ενημερωμένη απάντηση:

Επειδή ορισμένες από τις κλάσεις, στην αρχική απάντηση, έχουν καταργηθεί στη νεότερη έκδοση των Apache HTTP Components, δημοσιεύω αυτή την ενημερωμένη έκδοση.

Με την ευκαιρία, μπορείτε να έχετε πρόσβαση στην πλήρη τεκμηρίωση για περισσότερα παραδείγματα εδώ .

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

Αρχική Απάντηση:

Συνιστώ να χρησιμοποιήσω το Apache HttpClient. την ταχύτερη και ευκολότερη υλοποίησή του.

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.

για περισσότερες πληροφορίες, ελέγξτε αυτή τη διεύθυνση url: http://hc.Apache.org/

306
mhshams

Η αποστολή ενός αιτήματος POST είναι εύκολη στη Java Vanilla. Αρχίζοντας με 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);

Στη συνέχεια, πρέπει να δηλώσουμε τι πρόκειται να στείλουμε:

Αποστολή απλής φόρμας

Μια κανονική POST που προέρχεται από μια φόρμα http έχει μια μορφή καλά καθορισμένη . Πρέπει να μετατρέψουμε τα δεδομένα μας σε αυτή τη μορφή:

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 request με κατάλληλες κεφαλίδες και να το στείλουμε.

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

Μπορούμε επίσης να στείλουμε json χρησιμοποιώντας Java, αυτό είναι επίσης εύκολο:

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()

Θυμηθείτε ότι διαφορετικοί διακομιστές δέχονται διαφορετικούς τύπους περιεχομένου για το json, δείτε this ερώτηση.


Αποστολή αρχείων με δημοσίευση Java

Η αποστολή αρχείων μπορεί να θεωρηθεί πιο δύσκολη, καθώς η μορφή είναι πιο πολύπλοκη. Θα προσθέσουμε επίσης υποστήριξη για την αποστολή των αρχείων ως συμβολοσειρά, αφού δεν θέλουμε να αποθηκεύσουμε πλήρως το αρχείο στη μνήμη.

Γι 'αυτό, καθορίζουμε μερικές βοηθητικές μεθόδους:

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()
169
Ferrybig
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());
98
DuduAlul

Η πρώτη απάντηση ήταν μεγάλη, αλλά έπρεπε να προσθέσω try/catch για να αποφύγω τα λάθη του compiler Java.
Επίσης, είχα προβλήματα για να καταλάβω πώς να διαβάσω την HttpResponse με τις βιβλιοθήκες Java.

Εδώ είναι ο πιο πλήρης κώδικας:

/*
 * 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();
}
21
Mar Cnu

Ένας απλός τρόπος με τον οποίο χρησιμοποιείται το Apache HTTP Components είναι

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

Ρίξτε μια ματιά στο Fluent API

15
Mathias Bak

ο απλούστερος τρόπος για την αποστολή παραμέτρων με το αίτημα μετάδοσης:

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.
}
5
chandan kumar

Κλήση HttpURLConnection.setRequestMethod("POST") και HttpURLConnection.setDoOutput(true); Στην πραγματικότητα μόνο η τελευταία είναι απαραίτητη ως POST τότε γίνεται η προεπιλεγμένη μέθοδος.

1
user207421