第一种方法:使用HttpClient的第三方工具封装的方法:
1.使用maven工程 或 手动导入HttpClient jar包;
如果是maven工程,可以直接使用aliyun的maven仓库,在项目的pom.xml中的<dependencies></dependencies>中间添加如下:
<dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.3</version> </dependency>
添加完成后Ctrl+S保存pom.xml文件的修改,如果maven正常,网络正常,jar包会自动下载到工程中(然后直接进入第二步)。
如果不是maven工程,那只能自己去下载啦~
下载链接:http://maven.aliyun.com/mvn/search
在搜索栏里搜索httpclient,找到对应的版本号,下载,搜索httpcore,找到对应版本号,下载;
2.将包导入工程中后(导入过程自行百度或查看后续),我们就可以开始通过写一个工具类对这个发起http请求的方法进行一个封装,后面直接调用就可以啦~上代码:
import java.util.ArrayList; import java.util.List; import java.util.Map; import org.apache.http.HttpEntity; import org.apache.http.NameValuePair; import org.apache.http.client.entity.UrlEncodedFormEntity; 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.StringEntity; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.message.BasicNameValuePair; import org.apache.http.util.EntityUtils; /** * <p>用于进行发起http请求,并返回数据</p> * @ClassName HttpclientTest * @Description * @Author Cui Jian * @version * @Date 2018年11月28日 下午6:00:42 */ public class HttpclientTest { /** * Get请求 * @param url 访问的地址 * @param params 参数列表 * @return 返回的html或者json */ public static String getDataFromHttp(String url, Map<String, String> params) throws Exception { if(url == null || url.trim().isEmpty()) return null; //创建一个HttpClient对象 CloseableHttpClient httpClient = HttpClients.createDefault(); //get请求根据参数拼接好url if(params != null && params.size() > 0) { url += "?"; for(String key: params.keySet()) { url += (key + "=" + params.get(key) + "&"); } } //创建一个HttpGet对象,这里需要指定一个请求的url HttpGet get = new HttpGet(url); //执行http请求 CloseableHttpResponse response = httpClient.execute(get); //接收返回结果的对象 HttpEntity entity = response.getEntity(); //获取响应内容数据 String result = EntityUtils.toString(entity); //关闭流 response.close(); httpClient.close(); //返回 return result; } /** * Post请求 * @param url 访问的地址 * @param params 参数列表 * @return 返回的html或者json */ public static String postDataFromHttp(String url, Map<String, String> params) throws Exception { if(url == null || url.trim().isEmpty()) return null; //创建一个HttpClient对象 CloseableHttpClient httpClient = HttpClients.createDefault(); //创建一个HttpPost对象,并制定一个url HttpPost post = new HttpPost(url); //将参数添加进一个包含NameValuePair对象的List中 List<NameValuePair> formList = new ArrayList<NameValuePair>(); if(params != null && params.size() > 0) { for(String key: params.keySet()) { formList.add(new BasicNameValuePair(key, params.get(key))); } } //将参数包装到entity对象中 StringEntity entity = new UrlEncodedFormEntity(formList, "utf-8"); post.setEntity(entity); //执行请求 CloseableHttpResponse response = httpClient.execute(post); //接受返回结果 HttpEntity httpEntity = response.getEntity(); String result = EntityUtils.toString(httpEntity); //关闭流 response.close(); httpClient.close(); //返回接收到的数据 return result; } //测试一下~ public static void main(String[] args) { //get测试 try { String result = getDataFromHttp("https://createdpro.com", null); //测试输出打印到控制台 System.out.println(result); } catch (Exception e) { e.printStackTrace(); } } }
3.将上面的类加入到你的工具类中,后面就可以直接进行 类名.方法名(请求的地址,请求的参数) 直接进行调用啦~。这里需要注意的是,get请求的参数是包含在url中的,所以你也可以自行将参数直接加入到url中,然后将params设置为null,这样也是可以哒(详见main方法的测试)~
4.在这里到特别注意jar包的版本,因为有些版本是没有这些类的……笔者在这里就吃了版本的亏……(辛酸往事不愿再提)
第二种方法:使用java自带的net包发起http请求(不需要额外的jar包)
1.这种方法相比较上一种方法笔者认为比较简便,不需要导入任何额外的jar包;
2.直接上代码
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.nio.charset.StandardCharsets; import java.util.Map; /** * <p>用于进行发起http请求,并返回数据</p> * * @version v2.0 * @ClassName NetUtil * @Description HttpclientTest * @Author Cui Jian * @Date 2018年11月28日 下午6:00:42 */ public class NetUtil { /** * 发起一次Get请求并返回接收到的数据 */ //这里可以自行将参数拼接到url中,也可以改我的代码。。。随你便吧 public static String getDataFromHttp(String urlText) throws IOException { if (urlText == null || urlText.trim().isEmpty()) return null; //定义一个StringBuffer,用于储存结果 StringBuilder result = new StringBuilder(); //定义一个url对象 URL url = new URL(urlText); //创建一个连接请求对象 HttpURLConnection conn = (HttpURLConnection) url.openConnection(); //规定请求的方式 conn.setRequestMethod("GET"); //执行 conn.connect(); //使用一个输入流接收数据 InputStream is = conn.getInputStream(); //!@#$^&* BufferedReader br = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8)); String readStr = null; //将数据一行一行的存入StringBuffer while ((readStr = br.readLine()) != null) { result.append(readStr); result.append("\r\n"); } //关闭流 br.close(); //返回数据 return result.toString(); } /** * 发起一次post请求并返回数据 */ public String postDataFromHttp(String urlText, Map<String, String> params) throws IOException { if (urlText == null || urlText.trim().isEmpty()) return null; //定义一个StringBuffer,用于储存结果 StringBuilder result = new StringBuilder(); //定义一个Url对象用于制定一个地址 URL url = new URL(urlText); //创建一个HttpURLConnection连接对象 HttpURLConnection conn = (HttpURLConnection) url.openConnection(); //将参数添加加入到HttpURLConnection中 if (params != null && params.size() > 0) { for (String key : params.keySet()) { conn.setRequestProperty(key, params.get(key)); } } //指定请求的类型 conn.setRequestMethod("POST"); //开始请求 conn.connect(); //使用一个输入流接收数据 InputStream is = conn.getInputStream(); //!@#$^&* BufferedReader br = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8)); String readStr = null; //将数据一行一行的存入StringBuffer while ((readStr = br.readLine()) != null) { result.append(readStr); result.append("\r\n"); } //关闭流 br.close(); return result.toString(); } }
3.除了实现方式略有差别,流程上都是差不多的~~~