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

在很多的外部服务接口的对接中,在很多情况下都难以全部采用客户端的的形式进行数据请求的。这时我们常常需要运用服务器去请求一些参数,以下提供了两种在运用Java编写服务端时,我是如何使用Java服务器发起http请求的。(ps:https也属于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,虽然我几乎不怎么上 哈哈~


739

文章分类:Java web

所属标签: java post get http java服务端 开放对接


评论:

小剑不是程序员⊙▽⊙:

  地板!

小剑不是程序员⊙▽⊙:

  沙发!

小剑不是程序员⊙▽⊙:

  再点一个赞吧!

小剑不是程序员⊙▽⊙:

  很好的文章,给作者点个赞啦!

啊~评论区就像肚皮一样空荡荡的。。。快来留下点啥充充饥