Java - sending HTTP parameters via POST method easily

前端 未结 17 1741
借酒劲吻你
借酒劲吻你 2020-11-21 05:54

I am successfully using this code to send HTTP requests with some parameters via GET method

void sendRequest(String request)
{
            


        
相关标签:
17条回答
  • 2020-11-21 06:49

    Here is a simple example that submits a form then dumps the result page to System.out. Change the URL and the POST params as appropriate, of course:

    import java.io.*;
    import java.net.*;
    import java.util.*;
    
    class Test {
        public static void main(String[] args) throws Exception {
            URL url = new URL("http://example.net/new-message.php");
            Map<String,Object> params = new LinkedHashMap<>();
            params.put("name", "Freddie the Fish");
            params.put("email", "fishie@seamail.example.com");
            params.put("reply_to_thread", 10394);
            params.put("message", "Shark attacks in Botany Bay have gotten out of control. We need more defensive dolphins to protect the schools here, but Mayor Porpoise is too busy stuffing his snout with lobsters. He's so shellfish.");
    
            StringBuilder postData = new StringBuilder();
            for (Map.Entry<String,Object> param : params.entrySet()) {
                if (postData.length() != 0) postData.append('&');
                postData.append(URLEncoder.encode(param.getKey(), "UTF-8"));
                postData.append('=');
                postData.append(URLEncoder.encode(String.valueOf(param.getValue()), "UTF-8"));
            }
            byte[] postDataBytes = postData.toString().getBytes("UTF-8");
    
            HttpURLConnection conn = (HttpURLConnection)url.openConnection();
            conn.setRequestMethod("POST");
            conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            conn.setRequestProperty("Content-Length", String.valueOf(postDataBytes.length));
            conn.setDoOutput(true);
            conn.getOutputStream().write(postDataBytes);
    
            Reader in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
    
            for (int c; (c = in.read()) >= 0;)
                System.out.print((char)c);
        }
    }
    

    If you want the result as a String instead of directly printed out do:

            StringBuilder sb = new StringBuilder();
            for (int c; (c = in.read()) >= 0;)
                sb.append((char)c);
            String response = sb.toString();
    
    0 讨论(0)
  • 2020-11-21 06:50

    i have read above answers and have created a utility class to simplify HTTP request. i hope it will help you.

    Method Call

      // send params with Hash Map
        HashMap<String, String> params = new HashMap<String, String>();
        params.put("email","me@example.com");
        params.put("password","12345");
    
        //server url
        String url = "http://www.example.com";
    
        // static class "HttpUtility" with static method "newRequest(url,method,callback)"
        HttpUtility.newRequest(url,HttpUtility.METHOD_POST,params, new HttpUtility.Callback() {
            @Override
            public void OnSuccess(String response) {
            // on success
               System.out.println("Server OnSuccess response="+response);
            }
            @Override
            public void OnError(int status_code, String message) {
            // on error
                  System.out.println("Server OnError status_code="+status_code+" message="+message);
            }
        });
    

    Utility Class

    import java.io.*;
    import java.net.*;
    import java.util.HashMap;
    import java.util.Map;
    import static java.net.HttpURLConnection.HTTP_OK;
    
    public class HttpUtility {
    
     public static final int METHOD_GET = 0; // METHOD GET
     public static final int METHOD_POST = 1; // METHOD POST
    
     // Callback interface
     public interface Callback {
      // abstract methods
      public void OnSuccess(String response);
      public void OnError(int status_code, String message);
     }
     // static method
     public static void newRequest(String web_url, int method, HashMap < String, String > params, Callback callback) {
    
      // thread for handling async task
      new Thread(new Runnable() {
       @Override
       public void run() {
        try {
         String url = web_url;
         // write GET params,append with url
         if (method == METHOD_GET && params != null) {
          for (Map.Entry < String, String > item: params.entrySet()) {
           String key = URLEncoder.encode(item.getKey(), "UTF-8");
           String value = URLEncoder.encode(item.getValue(), "UTF-8");
           if (!url.contains("?")) {
            url += "?" + key + "=" + value;
           } else {
            url += "&" + key + "=" + value;
           }
          }
         }
    
         HttpURLConnection urlConnection = (HttpURLConnection) new URL(url).openConnection();
         urlConnection.setUseCaches(false);
         urlConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); // handle url encoded form data
         urlConnection.setRequestProperty("charset", "utf-8");
         if (method == METHOD_GET) {
          urlConnection.setRequestMethod("GET");
         } else if (method == METHOD_POST) {
          urlConnection.setDoOutput(true); // write POST params
          urlConnection.setRequestMethod("POST");
         }
    
         //write POST data 
         if (method == METHOD_POST && params != null) {
          StringBuilder postData = new StringBuilder();
          for (Map.Entry < String, String > item: params.entrySet()) {
           if (postData.length() != 0) postData.append('&');
           postData.append(URLEncoder.encode(item.getKey(), "UTF-8"));
           postData.append('=');
           postData.append(URLEncoder.encode(String.valueOf(item.getValue()), "UTF-8"));
          }
          byte[] postDataBytes = postData.toString().getBytes("UTF-8");
          urlConnection.setRequestProperty("Content-Length", String.valueOf(postDataBytes.length));
          urlConnection.getOutputStream().write(postDataBytes);
    
         }
         // server response code
         int responseCode = urlConnection.getResponseCode();
         if (responseCode == HTTP_OK && callback != null) {
          BufferedReader reader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
          StringBuilder response = new StringBuilder();
          String line;
          while ((line = reader.readLine()) != null) {
           response.append(line);
          }
          // callback success
          callback.OnSuccess(response.toString());
          reader.close(); // close BufferReader
         } else if (callback != null) {
          // callback error
          callback.OnError(responseCode, urlConnection.getResponseMessage());
         }
    
         urlConnection.disconnect(); // disconnect connection
        } catch (IOException e) {
         e.printStackTrace();
         if (callback != null) {
          // callback error
          callback.OnError(500, e.getLocalizedMessage());
         }
        }
       }
      }).start(); // start thread
     }
    }
    
    0 讨论(0)
  • 2020-11-21 06:54

    This answer covers the specific case of the POST Call using a Custom Java POJO.

    Using maven dependency for Gson to serialize our Java Object to JSON.

    Install Gson using the dependency below.

    <dependency>
      <groupId>com.google.code.gson</groupId>
      <artifactId>gson</artifactId>
      <version>2.8.5</version>
      <scope>compile</scope>
    </dependency>
    

    For those using gradle can use the below

    dependencies {
    implementation 'com.google.code.gson:gson:2.8.5'
    }
    

    Other imports used:

    import org.apache.http.HttpResponse;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.client.methods.CloseableHttpResponse;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.entity.*;
    import org.apache.http.impl.client.CloseableHttpClient;
    import com.google.gson.Gson;
    

    Now, we can go ahead and use the HttpPost provided by Apache

    private CloseableHttpClient httpclient = HttpClients.createDefault();
    HttpPost httppost = new HttpPost("https://example.com");
    
    Product product = new Product(); //custom java object to be posted as Request Body
        Gson gson = new Gson();
        String client = gson.toJson(product);
    
        httppost.setEntity(new StringEntity(client, ContentType.APPLICATION_JSON));
        httppost.setHeader("RANDOM-HEADER", "headervalue");
        //Execute and get the response.
        HttpResponse response = null;
        try {
            response = httpclient.execute(httppost);
        } catch (IOException e) {
            throw new InternalServerErrorException("Post fails");
        }
        Response.Status responseStatus = Response.Status.fromStatusCode(response.getStatusLine().getStatusCode());
        return Response.status(responseStatus).build();
    

    The above code will return with the response code received from the POST Call

    0 讨论(0)
  • 2020-11-21 06:57

    Try this pattern:

    public static PricesResponse getResponse(EventRequestRaw request) {
    
        // String urlParameters  = "param1=a&param2=b&param3=c";
        String urlParameters = Piping.serialize(request);
    
        HttpURLConnection conn = RestClient.getPOSTConnection(endPoint, urlParameters);
    
        PricesResponse response = null;
    
        try {
            // POST
            OutputStreamWriter writer = new OutputStreamWriter(conn.getOutputStream());
            writer.write(urlParameters);
            writer.flush();
    
            // RESPONSE
            BufferedReader reader = new BufferedReader(new InputStreamReader((conn.getInputStream()), StandardCharsets.UTF_8));
            String json = Buffering.getString(reader);
            response = (PricesResponse) Piping.deserialize(json, PricesResponse.class);
    
            writer.close();
            reader.close();
    
        } catch (Exception e) {
            e.printStackTrace();
        }
    
        conn.disconnect();
    
        System.out.println("PricesClient: " + response.toString());
    
        return response;
    }
    
    public static HttpURLConnection getPOSTConnection(String endPoint, String urlParameters) {
    
        return RestClient.getConnection(endPoint, "POST", urlParameters);
    
    }
    
    
    public static HttpURLConnection getConnection(String endPoint, String method, String urlParameters) {
    
        System.out.println("ENDPOINT " + endPoint + " METHOD " + method);
        HttpURLConnection conn = null;
    
        try {
            URL url = new URL(endPoint);
            conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod(method);
            conn.setDoOutput(true);
            conn.setRequestProperty("Content-Type", "text/plain");
    
        } catch (IOException e) {
            e.printStackTrace();
        }
    
        return conn;
    }
    
    0 讨论(0)
  • 2020-11-21 06:58
    import java.net.*;
    
    public class Demo{
    
      public static void main(){
    
           String data = "data=Hello+World!";
           URL url = new URL("http://localhost:8084/WebListenerServer/webListener");
           HttpURLConnection con = (HttpURLConnection) url.openConnection();
           con.setRequestMethod("POST");
           con.setDoOutput(true);
           con.getOutputStream().write(data.getBytes("UTF-8"));
           con.getInputStream();
    
        }
    
    }
    
    0 讨论(0)
提交回复
热议问题