代码音符

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

创建时间: 2018-11-29 11:10

修改时间: 2023-6-26 18:06

浏览: 674

第一种方法:使用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.除了实现方式略有差别,流程上都是差不多的~~~

创建时间: 2018-11-29 11:10

修改时间: 2023-6-26 18:06

浏览: 674

*本文遵循 CC BY-NC-SA 许可协议。转载请注明出处!