RPC(3):HttpClient实现RPC之GET请求

1HttpClient简介

在JDK中java.net包下提供了用户HTTP访问的基本功能,但是它缺少灵活性或许多应用所需要的功能。

HttpClient起初是Apache Jakarta Common 的子项目。用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本。2007年成为顶级项目。

通俗解释:HttpClient可以实现使用Java代码完成标准HTTP请求及响应。

2 新建服务端项目

新建项目httpclient_rpc_server

2.1 修改maven配置文件

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.3.2.RELEASE</version>
                <scope>import</scope>
                <type>pom</type>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

2.2 新建控制器

package com.example.httpclientserver.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class TestController {

    /*
    * 带参数的get请求
    */
    @RequestMapping(value="/params", produces = {"application/json;charset=UTF-8"})
    @ResponseBody
    public String params(String name, String password){
        System.out.println("name - " + name + " ; password - " + password);
        return "{\"msg\":\"登录成功\", \"user\":{\"name\":\""+name+"\",\"password\":\""+password+"\"}}";
    }
    /*
     * 不带参数的get请求
     */
    @RequestMapping(value="/test",produces = {"application/json;charset=UTF-8"})
    @ResponseBody
    public String test(){
        return "{\"msg\":\"处理返回\"}";
    }
}

2.3 新建启动器

package com.example.httpclientserver;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class ServerApp {
    public static void main(String[] args) {
        SpringApplication.run(ServerApp.class, args);
    }
}

2.4 application.yml修改端口(非必需操作)

server:
  port: 80

2.5 测试

3 新建客户端项目

新建客户端项目httpclient_rpc_client

3.1 添加maven依赖

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

3.2 新建主类进行httpclient访问

package com.example.httpclient;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.utils.URIBuilder;
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.net.URISyntaxException;
import java.util.ArrayList;
import java.util.List;

public class TestHttpClient {
    public static void main(String[] args) throws Exception {
        //访问无参数GET请求
        testGetNoParams();
        //访问有参数GET请求
        testGetNoParams();
    }

    /**
     * 有参数GET请求
     * @throws IOException
     */
    public static void testGetParams() throws IOException, URISyntaxException {
        HttpClient client = HttpClients.createDefault();
        // 基于Builder构建请求地址
        URIBuilder builder = new URIBuilder("http://localhost:80/params");
        // 基于单参数传递,构建请求地址
//        builder.addParameter("name", "bjsxt");
//        builder.addParameter("password", "admin123");
//        URI uri = builder.build();

        // 基于多参数传递,构建请求地址
        List<NameValuePair> nvps = new ArrayList<NameValuePair>();
        nvps.add(new BasicNameValuePair("name","bjsxt"));
        nvps.add(new BasicNameValuePair("password", "admin123"));
        builder.addParameters(nvps);
        URI uri = builder.build();
        System.out.println(uri.toASCIIString());

        String result = EntityUtils.toString(client.execute(new HttpGet(uri)).getEntity());
        System.out.println(result);
    }

    /**
     * 无参数GET请求
     * 使用浏览器,访问网站的过程是:
     *  1、 打开浏览器
     *  2、 输入地址
     *  3、 访问
     *  4、 看结果
     * 使用HttpClient,访问WEB服务的过程:
     *  1、 创建客户端,相当于打开浏览器
     *  2、 创建请求地址, 相当于输入地址
     *  3、 发起请求, 相当于访问网站(回车键)
     *  4、 处理响应结果, 相当于浏览器显示结果
     */
    public static void testGetNoParams() throws IOException {
        // 创建客户端对象
        HttpClient client = HttpClients.createDefault();
        // 创建请求地址
        HttpGet get = new HttpGet("http://localhost:80/test");
        // 发起请求,接收响应对象
        HttpResponse response = client.execute(get);
        // 获取响应体。 响应数据是一个基于HTTP协议标准字符串封装的对象。
        // 所以,响应体和响应头,都是封装的HTTP协议数据。直接使用可能有乱码或解析错误
        HttpEntity entity = response.getEntity();

        // 通过HTTP实体工具类,转换响应体数据。 使用的字符集是UTF-8
        String responseString = EntityUtils.toString(entity, "UTF-8");

        System.out.println("服务器响应数据是 - [ " + responseString + " ]");

        // 回收资源
        client = null;

    }
}

其中有参请求方式有两种,一种是基于单参数传递,构建请求地址,如下:

        // 基于单参数传递,构建请求地址
        builder.addParameter("name", "bjsxt");
        builder.addParameter("password", "admin123");
        URI uri = builder.build();

一种是基于多参数传递,构建请求地址,如下:

        // 基于多参数传递,构建请求地址
        List<NameValuePair> nvps = new ArrayList<NameValuePair>();
        nvps.add(new BasicNameValuePair("name","bjsxt"));
        nvps.add(new BasicNameValuePair("password", "admin123"));
        builder.addParameters(nvps);
        URI uri = builder.build();

4 测试

启动httpclient_rpc_server和httpclient_rpc_client,httpclient_rpc_client控制台输出如下:

GET请求成功。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/256863.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

关于“Python”的核心知识点整理大全27

目录 10.5 小结 第&#xff11;1 章 测试代码 11.1 测试函数 name_function.py 函数get_formatted_name()将名和姓合并成姓名&#xff0c;在名和姓之间加上一个空格&#xff0c;并将它们的 首字母都大写&#xff0c;再返回结果。为核实get_formatted_name()像期望的那样工…

【超图】SuperMap iClient3D for WebGL/WebGPU ——地形影像

作者&#xff1a;taco 号外&#xff01;号外&#xff01;开新坑了&#xff01;开新坑了&#xff01;对于一个代码小白来讲&#xff0c;设置可能是刚接触开发的人&#xff08;还没接触准备接触&#xff09;的人来说。对于读代码或是在对产品的使用上会存在许许多多的疑惑。接下来…

uniapp笔记

/pages/component/swiper/swiper /pages/component/button/button navigator image 设置界面标题 页面跳转 设置TabBar 发起一个请求 网络请求

计算机组成原理——中央处理器cpu1-20

1、中央处理器&#xff08;CPU&#xff09;是指什么。C A、 运算器 B、 控制器 C、 运算器和控制器 D、 运算器、控制器和主存储器 2、在CPU中跟踪指令后继地址的寄存器是什么。B A、 主存地址寄存器 B、 程序计数器 C、 指令寄存器 D、 状态条件寄存器 3、操作控制器的…

VR党建:VR全景技术如何助力党建知识传播

导语&#xff1a; 随着科技的不断发展&#xff0c;虚拟现实技术逐渐深入人们生活的方方面面。VR全景技术作为一种全新的沉浸式体验方式&#xff0c;被广泛应用于娱乐、教育、医疗等领域。而在党建学习中&#xff0c;VR全景技术也展现出了巨大的潜力&#xff0c;成为了一种创新…

项目中webpack优化配置(持续更新)

项目中webpack优化配置 1. 开发效率&#xff0c; 体验 DLL&#xff08;开发过程中减少构建时间和增加应用程序的性能&#xff09; 使用 DllPlugin 进行分包&#xff0c;使用 DllReferencePlugin(索引链接) 对 manifest.json 引用&#xff0c;让一些基本不会改动的代码先打包…

java-sec-code中的文件上传

java-sec-code中的文件上传 这里仅讨论文件上传&#xff0c;不讨论后续利用(中间件解析漏洞等不做讨论) 任意文件伤害上传 any-->uploada.html-->upload访问any路由时&#xff0c;会出现upload.html的上传文件界面&#xff0c;指向upload路由 GetMapping("/any&qu…

java SSM教师业绩管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM教师业绩管理系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代 码和数据库&#xff0c;系统主要采…

谷歌发布Gemini 1.0,开启生成式AI模型新时代!

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; IT杂谈 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 &#x1f4d1;前言一. Gemini的发布前期1.1 Gemini的准备1.2 DeepMnid 二. Gemini的三大杀手锏2.1 多模态能力2…

Linux 音视频SDK开发实践

一、兼容性适配处理 为什么需要兼容处理&#xff1f; 1、c兼容处理 主要有ABI兼容性问题&#xff0c;不同ubuntu系统依赖的ABI版本如下&#xff1a; ubuntu 18.04ubuntu 16.04ubuntu 14.04g7.55.44.8stdc版本libstdc.so.6.0.25libstdc.so.6.0.21libstdc.so.6.0.19GLIBCXXG…

详解YOLOv5网络结构/数据集获取/环境搭建/训练/推理/验证/导出/部署

一、本文介绍 本文给大家带来的教程是利用YOLOv5训练自己的数据集&#xff0c;以及有关YOLOv5的网络结构讲解/数据集获取/环境搭建/训练/推理/验证/导出/部署相关的教程&#xff0c;同时通过示例的方式让大家来了解具体的操作流程&#xff0c;过程中还分享给大家一些好用的资源…

电脑备忘录小工具怎么添加?怎么在电脑桌面添加备忘录?

作为一名天天用电脑办公的上班族&#xff0c;如果你需要对某个项目或问题进入深入思考&#xff0c;想要快速记录想法和思路&#xff0c;这时候会选择什么样的记事方式呢&#xff1f;如果你需要记录常用的工作文字内容、工作注意事项、项目流程、待办的工作安排等&#xff0c;用…

vue 将后端返回的二进制流进行处理并实现下载

什么是二进制流文件&#xff1f; 二进制文件是一种计算机文件格式&#xff0c;它的数据以二进制形式存储&#xff0c;与文本文件不同。二进制文件可以包含任意类型的数据&#xff0c;例如图像、音频、视频、可执行文件、压缩文件等&#xff0c;而文本文件则仅仅包含 ASCII 码或…

PCL 点云匹配 之NICP(Normal ICP)

一、概述 上面一篇中我们已经得出了一个结论&#xff0c;就是ICP虽然简单&#xff0c;但是也有明显的缺点 1、计算速度慢&#xff0c;收敛慢&#xff0c;迭代次数多 2、对内存的开销比较大 3、很容易陷入局部最优的困局 因此我们在经典ICP的基础上添加一两个约束&#xff1a; 第…

鸿蒙开发之简单登录页面

Entry Component struct Index {State loading:booleanfalse;build() {Row() {Column({ space: 5 }) {Image($r("app.media.app_icon")).width(100).height(100).borderRadius(10).margin({top: 60})Text("登录界面").fontSize(40).fontWeight(FontWeight.…

Apollo Planning——PathLaneBorrowDecider

引用 组件数据缓存 DependencyInjector DependencyInjector&#xff1a;依赖注入器&#xff0c;这是一个过于专业的名词&#xff0c;来自软件设计模式的依赖倒置原则的一种具体实现方式&#xff0c;起到模块解耦作用。“依赖倒置原则(Dependence Inversion Principle)是程序要…

全国国控监测点点位数据,shp/excel格式,已可视化

基本信息. 数据名称: 全国国控监测点点位数据 数据格式: shpexcel 时间版本&#xff1a;2023年 数据几何类型: 点 数据精度&#xff1a;全国 数据坐标系: WGS84 数据来源&#xff1a;网络公开数据 数据字段&#xff1a; 序号字段名称字段说明1province省名称2city城市…

设计模式 原型模式 与 Spring 原型模式源码解析(包含Bean的创建过程)

原型模式 原型模式(Prototype模式)是指&#xff1a;用原型实例指定创建对象的种类&#xff0c;并且通过拷贝这些原型&#xff0c;创建新的对象。 原型模式是一种创建型设计模式&#xff0c;允许一个对象再创建另外一个可定制的对象&#xff0c;无需知道如何创建的细节。 工作原…

SQLturning:定位连续值范围起点和终点

在上一篇blog说到&#xff0c;如何去优化查询连续值范围&#xff0c;没看过的朋友&#xff0c;上篇blog链接[在此]。(https://blog.csdn.net/weixin_42575078/article/details/135067645?spm1001.2014.3001.5501) 那么今天来说说怎么将连续的数据合并&#xff0c;然后返回合并…

Android的组件、布局学习

介绍 公司组织架构调整&#xff0c;项目组需要承接其他项目组的android项目&#xff0c;负责维护和开发新需求&#xff0c;故学习下基础语法和项目开发。 组件学习 Toolbarheader布局部分 就是app最顶部的部分 他的显示与否&#xff0c;是与F:\androidProject\android_lear…