赞
踩
目录
HTTP(Hypertext Transfer Protocol,超文本传输协议)是一种用于传输超媒体文档(如HTML)的应用层协议。
HTTP的特点和工作原理如下:
HTTP协议由请求和响应组成,它们都由报文(message)组成。报文包括报文头和报文体。报文头包含了请求/响应行、报文头部字段和换行符等信息。报文体包含了实际的请求/响应数据,如HTML文档。
总结起来,HTTP是一种简单、灵活、无连接、无状态的协议,广泛应用于Web开发和数据传输。它使用URL定位资源,通过请求-响应模型进行通信,使用TCP作为传输协议。
HTTP请求格式是由三部分组成:
请求行(Request line):包括请求方法、URL和协议版本。
请求头部(Request headers):包括一些关于请求的额外信息,如User-Agent、Content-Type、Authorization等。
请求体(Request body):用于传输请求的数据,对于GET请求来说,请求体通常为空。
以下是一个示例HTTP请求的格式:
- GET /index.html HTTP/1.1
- Host: www.example.com
- User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3
- Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
- Accept-Encoding: gzip, deflate, br
- Accept-Language: en-US,en;q=0.9
-
在这个示例中:
请求行包括GET方法、URL为/index.html和协议版本为HTTP/1.1。
请求头部包括Host、User-Agent、Accept、Accept-Encoding和Accept-Language等字段。
请求体为空,因为这是一个GET请求。
在上述实例中,申明了该请求是GET请求,我们最常用的请求方式就是GET和POST请求,二者在请求参数的传递中有很大不同,正如上述实例中所说:
GET请求的请求参数在请求行中,没有请求体
POST请求的请求参数在请求体中
下方是另一个响应的实例,在响应体中则展示了许多参数的信息
除了上述最常用的GET请求和POST请求外,在HTTP请求响应中还有如下其他的请求方式
笔者这里选取一些相对常用的进行介绍:
此外,对于其他一些不太常见的请求方式,比如PATCH、TRACE等,用途较少。
在现在主流的Web开发中,当前端给后端发送请求后,后端就需要响应这个请求,执行对应需要的操作,然后加工数据再返回给前端,从而达到前后端分离更高效的维护项目。
以下方代码举例,在传统的Java编程中,我们需要在Controller方法中申明HttpServletRequest对象,然后通过这个对象去拿到前端传给我们的数据,最后返回给前端一个“OK”的字符串。
- //原始方式
- @RestController
- public class RequestController {
- @RequestMapping("/getNameAge") //请求数据的路径
- public String getNameAge(HttpServletRequest request) {
- //获取请求参数
- String name = request.getParameter("name");
- String ageStr = request.getParameter("age");
-
- int age = Integer.parseInt(ageStr);
-
- //... ...
-
- return "OK";
- }
- }
但这样的方式是非常低效的,我们可以通过使用Spring框架来帮助我们更高效的实现功能和需求
如下代码,使用SpringBoot的话在代码量上只管的就可以感受到快捷和轻便
- //SpringBOot方式
- @RestController
- public class RequestController {
-
- //简单类型参数
- @RequestMapping("/getNameAge")
- public String getNameAge(String name,Integer age) {
- //... ...
- return "OK";
- }
使用SpringBoot的话只需要请求参数名和方法形式参数变量名相同,框架就会自动帮我们进行类型转化并且拿到数据
关于请求响应的参数部分,既可以是非常简单的基础类型,也可以是复杂的自定义类型
- public class Student {
- private String name;
- private String age;
- private Address address;
- }
- public class Address {
- private String provice;
- private String city;
- }
- //复杂类型参数
- @RequestMapping("/getpojo")
- public String getPojo(Student student) {
- System.out.println(student);
- return "OK";
- }
比如我们这里,自定义一个学生类,再在参数中使用学生类对象进行接收
此外数组和集合也是可以作为参数的
- //数组参数
- @RequestMapping("/array")
- public String getArray(String[] hobby) {
- System.out.println(Arrays.toString(hobby));
- return "ok";
- }
- //集合参数
- @RequestMapping("/list")
- public String getList(@RequestParam List<String> hobby) {
- System.out.println(hobby);
- return "ok";
- }
但是需要注意,在使用集合作为参数的时候,需要加上注解@RequestParam
日期时间参数在使用的时候同上,也要加上对应的注解@DateTimeFormat
- //日期时间参数
- @RequestMapping("/getdatetime")
- public String getTime(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime localDateTime) {
- System.out.println(localDateTime);
- return "OK";
- }
还可以使用JSON格式的参数,但需加上对应的注解@RequestBody
- //JSON参数
- @RequestMapping("/jsonParam")
- public String jsonParam(@RequestBody Student student) {
- System.out.println(student);
- return "OK";
- }
路径参数也是在开发中最常用的一种,加上注释@PathVariable声明它是路径变量
- //路径参数
- @RequestMapping("/path/{id}")
- public String pathParam(@PathVariable Integer id) {
- System.out.println(id);
- return "OK";
- }
存在多个路径参数的时候,可以用 ‘/’ 将他们分开
- //路径参数
- @RequestMapping("/path/{id}/{name}")
- public String pathParam2(@PathVariable Integer id,@PathVariable String name) {
- System.out.println(id + "--" +name);
- return "OK";
- }
在企业级开发中,为了方便阅读和管理,我们一般要求返回统一的数据格式
如下,各个响应的返回类型都不一样,这是不便于我们管理和操作的
- @RestController
- public class ResponseController {
-
- @RequestMapping("/hello")
- public String hello() {
- System.out.println("Hello world");
- return "Hello world";
- }
-
- @RequestMapping("/getAddr")
- public Address getAddress() {
- Address address = new Address();
- address.setProvice("河南省");
- address.setCity("洛阳市");
- return address;
- }
-
- @RequestMapping("/listAddr")
- public List<Address> listAddr() {
- List<Address> list = new ArrayList<>();
-
- Address addr1 = new Address();
- addr1.setProvice("河南省");
- addr1.setCity("洛阳市");
-
- Address addr2 = new Address();
- addr2.setProvice("广西省");
- addr2.setCity("桂林市");
-
- list.add(addr1);
- list.add(addr2);
-
- return list;
- }
- }
因此我们写一个统一返回结果的类,然后将上述各自的返回值封装成这个结果类,然后统一进行返回
经过上述的改善后,我们就可以得到如下的代码
- @RestController
- public class ResponseController {
-
- @RequestMapping("/hello")
- public Result hello() {
- System.out.println("Hello world");
- return new Result(1,"success","hello world");
- }
-
- @RequestMapping("/getAddr")
- public Result getAddress() {
- Address address = new Address();
- address.setProvice("河南省");
- address.setCity("洛阳市");
- return Result.success(address);
- }
-
- @RequestMapping("/listAddr")
- public Result listAddr() {
- List<Address> list = new ArrayList<>();
-
- Address addr1 = new Address();
- addr1.setProvice("河南省");
- addr1.setCity("洛阳市");
-
- Address addr2 = new Address();
- addr2.setProvice("广西省");
- addr2.setCity("桂林市");
-
- list.add(addr1);
- list.add(addr2);
-
- return Result.success(list);
- }
- }
对于上述HTTP的请求响应和后端响应数据我们有了一些基础的理解后,我们就可以通过一些工具来帮助我们测试,我们能否成功的向后端发起请求,能否成功的拿到后端返回的数据,对此我们可以借助一些接口管理工具,诸如Yapi,postman,Apifox等
笔者这里使用Apifox进行举例,各个工具之间的使用方式是通用的,因此不需要担心方法不兼容的问题。
大体界面是这样的
我们这里只是进行基础的使用,我们可以点击目录旁边的添加接口
点击创建接口后,我们就可以看见如下的界面
对于数据请求的路径,除了图中说明的端口号后,还需注意端口号后的路径必须和请求路径相同,如下图 /hello 和接口中的 /hello 相同,所以就会调用这个 hello()方法
笔者这里给个示例,我们先运行Java项目,在控制台中就会显示本地的服务器端口号,如下图显示为8080
点击这里的运行
然后点击发送
然后就会根据路径找到项目中对应的方法,返回我们需要的数据
以上就是Apifox的基础使用方法,后序笔者会分享一些更高级的使用方式
本次的分享就到此为止了,希望我的分享能给您带来帮助,也欢迎大家三连支持,你们的点赞就是博主更新最大的动力!如有不同意见,欢迎评论区积极讨论交流,让我们一起学习进步!有相关问题也可以私信博主,评论区和私信都会认真查看的,我们下次再见
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。