Java服务器端发起http请求并接收返回数据的两种方案


第一种方法:使用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;

/**
* <p>用于进行发起http请求,并返回数据</p>
* @ClassName HttpclientTest
* @Description
* @Author Cui Jian
* @version
* @Date 2018年11月28日 下午6:00:42
*/

public class NetUtil {
/**
* 发起一次Get请求并返回接收到的数据
*/
//这里可以自行将参数拼接到url中,也可以改我的代码。。。随你便吧
public static String getDataFromHttp(String url) throws IOException {
if(url == null || url.trim().isEmpty())
return null;
//定义一个StringBuffer,用于储存结果
StringBuffer result = new StringBuffer();
//定义一个url对象
URL url = new URL(url);
//创建一个连接请求对象
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
//规定请求的方式
conn.setRequestMethod("GET");
//执行
conn.connect();
//使用一个输入流接收数据
InputStream is = conn.getInputStream();
//!@#$^&*
BufferedReader br = new BufferedReader(new InputStreamReader(is, "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 url, Map<String, String> params) throws IOException {
if(url == null || url.trim().isEmpty())
return null;
//定义一个StringBuffer,用于储存结果
StringBuffer result = new StringBuffer();
//定义一个Url对象用于制定一个地址
URL url = new URL(url);
//创建一个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, "UTF-8"));
String readStr = null;
//将数据一行一行的存入StringBuffer
while((readStr = br.readLine()) != null) {
result.append(readStr);
result.append("\r\n");
}
//关闭流
br.close();
//返回数据
return result.toString();
}
}



3.除了实现方式略有差别,流程上都是差不多的~~~如果有问题欢迎在下面评论留言呦~


如果留言后仍有疑问,想要深入“♂”沟通的,可以加我的qq:1040427275,虽然我几乎不怎么上 哈哈~

服务端接口
http
get
post
java
发布

街角有人祝福,巷口有人哭,这里却没人评论ε=(´ο`*)))