概述
在java中,我们发送http请求(get、post) 主要有两种方法
- 使用Java原生HttpURLConnection
- 使用第三方库,例如 Apache的HttpClient库
HttpURLConnection
下面的代码分别是使用 get 进行 http 访问和 使用 post 进行 https 访问的例子
package com.mkyong; import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import javax.net.ssl.HttpsURLConnection; public class HttpURLConnectionExample { private final String USER_AGENT = "Mozilla/5.0"; public static void main(String[] args) throws Exception { HttpURLConnectionExample http = new HttpURLConnectionExample(); System.out.println("Testing 1 - Send Http GET request"); http.sendGet(); System.out.println("\nTesting 2 - Send Http POST request"); http.sendPost(); } // HTTP GET请求 private void sendGet() throws Exception { String url = "http://www.google.com/search?q=mkyong"; URL obj = new URL(url); HttpURLConnection con = (HttpURLConnection) obj.openConnection(); //默认值我GET con.setRequestMethod("GET"); //添加请求头 con.setRequestProperty("User-Agent", USER_AGENT); int responseCode = con.getResponseCode(); System.out.println("\nSending 'GET' request to URL : " + url); System.out.println("Response Code : " + responseCode); BufferedReader in = new BufferedReader( new InputStreamReader(con.getInputStream())); String inputLine; StringBuffer response = new StringBuffer(); while ((inputLine = in.readLine()) != null) { response.append(inputLine); } in.close(); //打印结果 System.out.println(response.toString()); } // HTTP POST请求 private void sendPost() throws Exception { String url = "https://selfsolve.apple.com/wcResults.do"; URL obj = new URL(url); HttpsURLConnection con = (HttpsURLConnection) obj.openConnection(); //添加请求头 con.setRequestMethod("POST"); con.setRequestProperty("User-Agent", USER_AGENT); con.setRequestProperty("Accept-Language", "en-US,en;q=0.5"); String urlParameters = "sn=C02G8416DRJM&cn=&locale=&caller=&num=12345"; //发送Post请求 con.setDoOutput(true); DataOutputStream wr = new DataOutputStream(con.getOutputStream()); wr.writeBytes(urlParameters); wr.flush(); wr.close(); int responseCode = con.getResponseCode(); System.out.println("\nSending 'POST' request to URL : " + url); System.out.println("Post parameters : " + urlParameters); System.out.println("Response Code : " + responseCode); BufferedReader in = new BufferedReader( new InputStreamReader(con.getInputStream())); String inputLine; StringBuffer response = new StringBuffer(); while ((inputLine = in.readLine()) != null) { response.append(inputLine); } in.close(); //打印结果 System.out.println(response.toString()); } }
输出结果
Sending 'GET' request to URL : http://www.google.com/search?q=mkyong Response Code : 200 Google search result... Testing 2 - Send Http POST request Sending 'POST' request to URL : https://selfsolve.apple.com/wcResults.do Post parameters : sn=C02G8416DRJM&cn=&locale=&caller=&num=12345 Response Code : 200 Apple product detail...
HttpClient 第三方库
下面是两个分别封装进行纯参数 post 请求和 带文件的 post 请求例子
public String httpPost(String url, List<NameValuePair> nvpList, int requestTimeout, int connectTimeout, int socketTimeout) { RequestConfig config = RequestConfig.custom().setConnectionRequestTimeout(requestTimeout) .setConnectTimeout(connectTimeout).setSocketTimeout(socketTimeout).build(); //设置各种超时时间 CloseableHttpClient httpclient = HttpClients.custom().setDefaultRequestConfig(config).build(); //build httpClient HttpPost httpPost = new HttpPost(url); //新建post请求操作类 CloseableHttpResponse response; //返回 String body; try { if (nvpList != null || !nvpList.isEmpty()) { httpPost.setEntity(new UrlEncodedFormEntity(nvpList, "utf-8")); //设置post的参数 } response = httpclient.execute(httpPost); //执行 post HttpEntity entity = response.getEntity(); body = EntityUtils.toString(entity); EntityUtils.consume(entity); } catch (Exception e) { e.printStackTrace(); } return body; } public String httpPost(String url, List<NameValuePair> nvpList, final Map<String, File> files, int requestTimeout, int connectTimeout, int socketTimeout) { RequestConfig config = RequestConfig.custom().setConnectionRequestTimeout(requestTimeout) .setConnectTimeout(connectTimeout).setSocketTimeout(socketTimeout).build(); CloseableHttpClient httpclient = HttpClients.custom().setDefaultRequestConfig(config).build(); HttpPost httpPost = new HttpPost(url); CloseableHttpResponse response; String body; try { httpPost.setEntity(makeMultipartEntity(nvpList, files)); //根据post参数和文件生成post请求的具体信息 response = httpclient.execute(httpPost); HttpEntity entity = response.getEntity(); body = EntityUtils.toString(entity); EntityUtils.consume(entity); } catch (Exception e) { e.printStackTrace(); } return body; } private static HttpEntity makeMultipartEntity(List<NameValuePair> params, final Map<String, File> files) { MultipartEntityBuilder builder = MultipartEntityBuilder.create(); //旧版 HttpClient 使用 MultipartEntity, 已经废弃 builder.setMode(HttpMultipartMode.STRICT); //设置模式,STRICT 为默认模式(RFC 822, RFC 2045, RFC 2046 compliant), BROWSER_COMPATIBLE 为浏览器兼容模式(browser-compatible mode, i.e.), RFC6532(RFC 6532 compliant),一般选 STRICT 或者 BROWSER_COMPATIBLE if (params != null && params.size() > 0) { for (NameValuePair p : params) { builder.addTextBody(p.getName(), p.getValue(), ContentType.TEXT_PLAIN.withCharset("UTF-8")); //生成参数信息 } } if (files != null && files.size() > 0) { Set<Map.Entry<String, File>> entries = files.entrySet(); for (Map.Entry<String, File> entry : entries) { builder.addBinaryBody("file", entry.getValue()); //生成文件信息,另外一种方法为使用 addPart, 那种不能随意设置 ContentType,具体可以参考后面的一个链接网站 } } return builder.build(); }
参考链接
如何在Java中发送HTTP GET/POST请求
HttpClient使用MultipartEntityBuilder实现多文件上传
来源:https://www.cnblogs.com/lemonlotus/p/8662591.html