首页 > 其他分享 >Httpclient基础!!!!实战训练!!!!

Httpclient基础!!!!实战训练!!!!

时间:2024-11-18 18:44:22浏览次数:3  
标签:实战 http 请求 训练 org apache import response Httpclient

1. HttpClient

1.1 介绍

HttpClient 是Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。

HttpClient作用:

  • 发送HTTP请求

  • 接收响应数据

为什么要在Java程序中发送Http请求?有哪些应用场景呢?

HttpClient应用场景:

当我们在使用扫描支付、查看地图、获取验证码、查看天气等功能时

其实,应用程序本身并未实现这些功能,都是在应用程序里访问提供这些功能的服务,访问这些服务需要发送HTTP请求,并且接收响应数据,可通过HttpClient来实现。

HttpClient的maven坐标:

<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5.13</version>
</dependency> 

HttpClient的核心API:

  • HttpClient:Http客户端对象类型,使用该类型对象可发起Http请求。

  • HttpClients:可认为是构建器,可创建HttpClient对象。

  • CloseableHttpClient:实现类,实现了HttpClient接口。

  • HttpGet:Get方式请求类型。

  • HttpPost:Post方式请求类型。

HttpClient发送请求步骤:

  • 创建HttpClient对象

  • 创建Http请求对象

  • 调用HttpClient的execute方法发送请求

1.2 入门案例

如果想测试一下可以查看创建springboot项目

Springboot项目创建!!!接口测试!!!(零基础也能完成!!!直接速通!!!统一返回结果!!!Swagger集成Knife4j!!微信支付测试!!)前端Vue!!!(快速创建项目)_用浏览器测试springboot项目的接口-CSDN博客

对HttpClient编程工具包有了一定了解后,那么,我们使用HttpClient在Java程序当中来构造Http的请求,并且把请求发送出去,接下来,就通过入门案例分别发送GET请求POST请求,具体来学习一下它的使用方法。

1.2.1 GET方式请求

正常来说,首先,应该导入HttpClient相关的坐标,但在项目中,就算不导入,也可以使用相关的API。

因为在项目中已经引入了aliyun-sdk-oss坐标:

 <dependency>
    <groupId>com.aliyun.oss</groupId>
    <artifactId>aliyun-sdk-oss</artifactId>
</dependency>

上述依赖的底层已经包含了HttpClient相关依赖。

故选择导入或者不导入均可。

编写测试代码,发送GET请求。

实现步骤:

  1. 创建HttpClient对象

  2. 创建请求对象

  3. 发送请求,接受响应结果

  4. 解析结果

  5. 关闭资源

package com.example.demo1;

import com.alibaba.fastjson.JSONObject;
import com.example.demo1.utlis.HttpClientUtil;
import org.apache.http.HttpEntity;
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.util.EntityUtils;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

@SpringBootTest
class Demo1ApplicationTests {
    /**
     * 一个关于HttpClient简单的测试案例
     * @throws IOException
     */

    @Test
    public void testPlaceOrder() throws IOException {

        //创建httpclient对象
        CloseableHttpClient httpClient = HttpClients.createDefault();

        //创建请求对象
        HttpGet httpGet = new HttpGet("http://localhost:8090/api/product/test");

        //发送请求,接受响应结果
        CloseableHttpResponse response = httpClient.execute(httpGet);

        //获取服务端返回的状态码
        int statusCode = response.getStatusLine().getStatusCode();
        System.out.println("服务端返回的状态码为:" + statusCode);

        HttpEntity entity = response.getEntity();
        String body = EntityUtils.toString(entity);
        System.out.println("服务端返回的数据为:" + body);

        //关闭资源
        response.close();
        httpClient.close();

    }
   
}

运行结果

1.2.2 POST方式请求

在HttpClientTest中添加POST方式请求方法,相比GET请求来说,POST请求若携带参数需要封装请求体对象,并将该对象设置在请求对象中。

实现步骤:

  1. 创建HttpClient对象

  2. 创建请求对象

  3. 发送请求,接收响应结果

  4. 解析响应结果

  5. 关闭资源

 @Test
    public void testPost() throws Exception { 
        CloseableHttpClient httpClient=HttpClients.createDefault();

        HttpPost httpPost=new HttpPost("http://localhost:8080/admin/employee/login");

        JSONObject jsonObject=new JSONObject();
        jsonObject.put("username","admin");
        jsonObject.put("password","123456");

        StringEntity entity=new StringEntity(jsonObject.toString());
        entity.setContentEncoding("utf-8");
        entity.setContentType("application/json");
        httpPost.setEntity(entity);

        CloseableHttpResponse response=httpClient.execute(httpPost);
        int statusCode=response.getStatusLine().getStatusCode();
        System.out.println("响应码为:"+statusCode);
        HttpEntity entity1=response.getEntity();
        String body =EntityUtils.toString(entity1);
        System.out.println("响应数据为:" + body);
        //为什么要转成字符串,虽然后端传入的是json字符串,但是在响应的时候数据是以流的形势,而且
        //这里HttpEntity entity1=response.getEntity();是对象,所以要转
        //关闭资源
        response.close();
        httpClient.close();
    }

结果如下

1.3封装

代码如下:

package com.example.demo1.utlis;

import com.alibaba.fastjson.JSONObject;
import org.apache.http.NameValuePair;
import org.apache.http.client.config.RequestConfig;
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.client.utils.URIBuilder;
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;

import java.io.IOException;
import java.net.URI;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

public class HttpClientUtil {
    static final  int TIMEOUT_MSEC = 5 * 1000;
    /**
     * get 请求
     * @param url
     * @param paramMap
     * @return
     */

    public static String doGet(String url, Map<String,Object> paramMap){
        // 创建Httpclient对象
        CloseableHttpClient httpClient = HttpClients.createDefault();

        String result = "";
        CloseableHttpResponse response = null;

        try{
            //URIBuilder 用于构建请求的 URL。
            URIBuilder builder = new URIBuilder(url);
            if(paramMap != null){
                for (String key : paramMap.keySet()) {
                    builder.addParameter(key, (String) paramMap.get(key));
                }
            }
            URI uri = builder.build();

            //创建GET请求对象
            HttpGet httpGet = new HttpGet(uri);

            //发送请求,接受响应结果
            response = httpClient.execute(httpGet);

            //判断响应状态
            if(response.getStatusLine().getStatusCode() == 200){
                result = EntityUtils.toString(response.getEntity(),"UTF-8");
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            try {
                response.close();
                httpClient.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        return result;
    }
    /**
     * 发送POST方式请求
     * application/x-www-form-urlencoded 格式的字符串
     * @param url
     * @param paramMap
     * @return
     * @throws IOException
     */
    public static String doPost(String url, Map<String, Object> paramMap) throws IOException {
        // 创建Httpclient对象
        CloseableHttpClient httpClient = HttpClients.createDefault();
        CloseableHttpResponse response = null;
        String resultString = "";

        try {
            // 创建Http Post请求
            HttpPost httpPost = new HttpPost(url);

            // 创建参数列表
            if (paramMap != null) {
                List<NameValuePair> paramList = new ArrayList();
                for (Map.Entry<String, Object> param : paramMap.entrySet()) {
                    paramList.add(new BasicNameValuePair(param.getKey(), (String) param.getValue()));
                }
                // 模拟表单
                //UrlEncodedFormEntity 专门用于将表单参数(键值对)转换为 application/x-www-form-urlencoded 格式的字符串
                UrlEncodedFormEntity entity = new UrlEncodedFormEntity(paramList);
                httpPost.setEntity(entity);
            }

            httpPost.setConfig(builderRequestConfig());

            // 执行http请求
            response = httpClient.execute(httpPost);

            resultString = EntityUtils.toString(response.getEntity(), "UTF-8");
        } catch (Exception e) {
            throw e;
        } finally {
            try {
                response.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        return resultString;
    }
    /**
     * 发送POST方式请求
     * Json格式
     * @param url
     * @param paramMap
     * @return
     * @throws IOException
     */
    public static String doPost4Json(String url, Map<String, Object> paramMap) throws IOException {
        // 创建Httpclient对象
        CloseableHttpClient httpClient = HttpClients.createDefault();
        CloseableHttpResponse response = null;
        String resultString = "";

        try {
            // 创建Http Post请求
            HttpPost httpPost = new HttpPost(url);

            if (paramMap != null) {
                //构造json格式数据
                JSONObject jsonObject = new JSONObject();
                for (Map.Entry<String, Object> param : paramMap.entrySet()) {
                    jsonObject.put(param.getKey(),param.getValue());
                }
                StringEntity entity = new StringEntity(jsonObject.toString(),"utf-8");
                //设置请求编码
                entity.setContentEncoding("utf-8");
                //设置数据类型
                entity.setContentType("application/json");
                httpPost.setEntity(entity);
            }

            httpPost.setConfig(builderRequestConfig());

            // 执行http请求
            response = httpClient.execute(httpPost);

            resultString = EntityUtils.toString(response.getEntity(), "UTF-8");
        } catch (Exception e) {
            throw e;
        } finally {
            try {
                response.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        return resultString;
    }
    private static RequestConfig builderRequestConfig() {
        return RequestConfig.custom()
                .setConnectTimeout(TIMEOUT_MSEC)
                .setConnectionRequestTimeout(TIMEOUT_MSEC)
                .setSocketTimeout(TIMEOUT_MSEC).build();
    }

}

 然后可以简写

package com.example.demo1;

import com.alibaba.fastjson.JSONObject;
import com.example.demo1.utlis.HttpClientUtil;
import org.apache.http.HttpEntity;
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.util.EntityUtils;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

@SpringBootTest
class Demo1ApplicationTests {
    /**
     * 一个关于HttpClient简单的测试案例
     * @throws IOException
     */

    @Test
    public void testPlaceOrder() throws IOException {

        String s = HttpClientUtil.doGet("http://localhost:8090/api/product/test", null);
        System.out.println(s);
       /* //创建httpclient对象
        CloseableHttpClient httpClient = HttpClients.createDefault();

        //创建请求对象
        HttpGet httpGet = new HttpGet("http://localhost:8090/api/product/test");

        //发送请求,接受响应结果
        CloseableHttpResponse response = httpClient.execute(httpGet);

        //获取服务端返回的状态码
        int statusCode = response.getStatusLine().getStatusCode();
        System.out.println("服务端返回的状态码为:" + statusCode);

        HttpEntity entity = response.getEntity();
        String body = EntityUtils.toString(entity);
        System.out.println("服务端返回的数据为:" + body);

        //关闭资源
        response.close();
        httpClient.close();
*/
    }
    @Test
    public void testPost() throws Exception {
        Map map=new HashMap();
        map.put("username","admin");
        map.put("password","123456");

        String s = HttpClientUtil.doPost4Json("http://localhost:8080/admin/employee/login", map);
        System.out.println(s);
       /* CloseableHttpClient httpClient=HttpClients.createDefault();

        HttpPost httpPost=new HttpPost("http://localhost:8080/admin/employee/login");

        JSONObject jsonObject=new JSONObject();
        jsonObject.put("username","admin");
        jsonObject.put("password","123456");

        StringEntity entity=new StringEntity(jsonObject.toString());
        entity.setContentEncoding("utf-8");
        entity.setContentType("application/json");
        httpPost.setEntity(entity);

        CloseableHttpResponse response=httpClient.execute(httpPost);
        int statusCode=response.getStatusLine().getStatusCode();
        System.out.println("响应码为:"+statusCode);
        HttpEntity entity1=response.getEntity();
        String body =EntityUtils.toString(entity1);
        System.out.println("响应数据为:" + body);
        //为什么要转成字符串,虽然后端传入的是json字符串,但是在响应的时候数据是以流的形势,而且
        //这里HttpEntity entity1=response.getEntity();是对象,所以要转
        //关闭资源
        response.close();
        httpClient.close();*/
    }
}

同样能得到结果

标签:实战,http,请求,训练,org,apache,import,response,Httpclient
From: https://blog.csdn.net/qq_56947957/article/details/143863993

相关文章

  • 01MybatisPlus(SpringCloud入门必学!!!!微服务!!项目实战!!深度理解MP用法!!!)
    微服务springCloud,今天第一课就是MybatisPlus!!!大家在日常开发中应该能发现,单表的CRUD功能代码重复度很高,也没有什么难度。而这部分代码量往往比较大,开发起来比较费时。        因此,目前企业中都会使用一些组件来简化或省略单表的CRUD开发工作。目前在国内使用较多的......
  • 3张大图剖析HttpClient和IHttpClientFactory在解决DNS解析问题上的殊途同归
    在开发者便利度角度,我们很轻松地使用HttpClient对象发出HTTP请求,只需要关注应用层协议的BaseAddr、Url、ReqHeader、timeout。实际在HttpClient在源码级别是由HttpMessageHandler实例发出的请求。1.早期.NETHttpClient遇到的Socket滥用/DNS解析问题早期.NET的HttpClient使......
  • 大模型实战(二):langchain+Ollama调用本地大模型实现RAG(保姆级)
    文章目录一、任务描述1.环境2.功能二、代码拆解1.导入包2.配置本地模型3.实例化embedding模型4.导入向量化知识库5.加入提示词6.定义查询方法7.问答三、总体代码一、任务描述由于显卡仍然较为昂贵,个人笔记本的硬件条件很难带动大模型,因此我们可以调用一......
  • OpenAI Assistants API 企业级应用实战
    引言OpenAI在2023年底推出的AssistantsAPI为企业级AI应用开发提供了一个强大的新选择。与传统的ChatCompletionsAPI相比,AssistantsAPI提供了更完整的对话管理、文件处理和工具调用能力,特别适合构建复杂的企业应用。核心优势内置的对话线程管理原生的文件处理能......
  • 多模态大模型LLM与AIGC前沿技术实战,基于训练数据和生成算法模型
    多模态大模型LLM与AIGC前沿技术实战,基于训练数据和生成算法模型在当今人工智能领域,多模态大模型LLM(大型语言模型)与AIGC(人工智能生成内容)正以前所未有的发展态势,引领着技术革新的浪潮。它们的强大能力背后,训练数据和生成算法模型起着至关重要的作用,深入探究这两方面并了解其在实......
  • Flutter项目实战(1):通用项目框架搭建
    下面介绍Flutter最基本的通用项目框架搭建,同时实现了一个登录界面图标和登录界面。先看下效果图:使用ScreenUtilInit自适应界面大小;使用Stack支持多个子界面在同一个全屏主界面上选择显示;使用Get插件实现界面之间的跳转和国际化翻译;界面都通过Transform实现了鼠标移动......
  • AI 大模型应用开发实战营:全流程深度实践大模型应用开发落地
    AI大模型应用开发实战营:全流程深度实践大模型应用开发落地在人工智能蓬勃发展的时代,AI大模型以其强大的能力和广泛的适用性,正逐渐成为推动各行业变革的核心力量。然而,从理论认知到实际应用开发并成功落地,中间存在着诸多技术与实践的挑战。AI大模型应用开发实战营应运而生,旨在......
  • 代码随想录算法训练营第六天|哈希表|LC242. 有效的字母异位词|LC349. 两个数组的交集|
    哈希表    哈希表:用来快速判断一个元素是否出现在集合里;O(1);    哈希碰撞:比如小王和小李都映射到索引下表1的位置,有2中解决办法(拉链法和线性探测法);    拉链发:通过索引找到,其实拉链发就是要选择适当的哈希表的大小,这样既不会因为数组空值而浪费大量内......
  • GPT 大模型 + AIGC 技术实操课:GPT 大模型部署使用与 AIGC 实战落地方案
    GPT大模型+AIGC技术实操课:GPT大模型部署使用与AIGC实战落地方案在人工智能蓬勃发展的今天,GPT大模型与AIGC(人工智能生成内容)技术成为了各界瞩目的焦点,它们正以前所未有的力量重塑着内容创作、智能交互等诸多领域的生态。而开展一门关于GPT大模型+AIGC技术实操课,帮助......
  • 代码随想录算法训练营第四天|LC24.两两交换链表中的节点|LC19. 删除链表的倒数第 N 个
    24.两两交换链表中的节点-力扣(LeetCode)    1、需要一个虚拟节点进行帮助;    2、注意虚拟节点的连接以及变化(尝试有点困惑它的变化,后面有点理解);    3、注意后续第二组的交换时如何与第一组交换进行连接;fromtypingimportOptionalclassLis......