Sending HTTP POST Request In Java

后端 未结 8 1289
清歌不尽
清歌不尽 2020-11-21 11:17

lets assume this URL...

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

(Here id needs to be sent in a POST request)

I want to se

相关标签:
8条回答
  • 2020-11-21 11:36

    Sending a POST request is easy in vanilla Java. Starting with a URL, we need t convert it to a URLConnection using url.openConnection();. After that, we need to cast it to a HttpURLConnection, so we can access its setRequestMethod() method to set our method. We finally say that we are going to send data over the connection.

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

    We then need to state what we are going to send:

    Sending a simple form

    A normal POST coming from a http form has a well defined format. We need to convert our input to this format:

    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;
    

    We can then attach our form contents to the http request with proper headers and send it.

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

    Sending JSON

    We can also send json using java, this is also easy:

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

    Remember that different servers accept different content-types for json, see this question.


    Sending files with java post

    Sending files can be considered more challenging to handle as the format is more complex. We are also going to add support for sending the files as a string, since we don't want to buffer the file fully into the memory.

    For this, we define some helper methods:

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

    We can then use these methods to create a multipart post request as follows:

    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()
    
    0 讨论(0)
  • 2020-11-21 11:39

    Updated Answer:

    Since some of the classes, in the original answer, are deprecated in the newer version of Apache HTTP Components, I'm posting this update.

    By the way, you can access the full documentation for more examples here.

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

    Original Answer:

    I recommend to use Apache HttpClient. its faster and easier to implement.

    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.
    

    for more information check this url: http://hc.apache.org/

    0 讨论(0)
  • 2020-11-21 11:46
    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());
    
    0 讨论(0)
  • 2020-11-21 11:47

    simplest way to send parameters with the post request:

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

    You have done. now you can use responsePOST. Get response content as string:

    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.
    }
    
    0 讨论(0)
  • 2020-11-21 11:49

    The first answer was great, but I had to add try/catch to avoid Java compiler errors.
    Also, I had troubles to figure how to read the HttpResponse with Java libraries.

    Here is the more complete code :

    /*
     * 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();
    }
    
    0 讨论(0)
  • 2020-11-21 11:50

    I recomend use http-request built on apache http api.

    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();
    }
    
    0 讨论(0)
提交回复
热议问题