HTTP请求响应详解 (HTTP请求数据格式,常见请求方式,后端响应参数)及Apifox(postman)使用方式


目录

一.HTTP协议

二.HTTP请求数据格式

请求方式

三.后端响应请求

基于SpringBoot响应数据

请求响应的参数类型

同一响应格式

四.Apifox(postman)使用方法


一.HTTP协议

HTTP(Hypertext Transfer Protocol,超文本传输协议)是一种用于传输超媒体文档(如HTML)的应用层协议。

HTTP的特点和工作原理如下:

  1. 无连接性:HTTP默认是无连接的,即每个请求都是一个独立的、独立的事务。当服务器完成对客户端请求的响应后,会立即关闭连接,不会保持长连接。这种无连接性可以节省服务器资源,但也会增加每个请求的延迟,因为需要重新建立连接。
  2. 无状态性:HTTP协议是无状态的,即服务器不会保存客户端的状态信息。每个请求都是独立的,服务器不会记住之前的请求。为了处理这个问题,引入了Cookie和Session机制,通过在客户端和服务器之间传递标识符来跟踪会话状态。
  3. 请求-响应模型:HTTP通过请求-响应模型进行通信。客户端发送一个HTTP请求,服务器接收并处理请求,并返回一个HTTP响应。响应包含响应状态码、响应头和响应体
  4. 支持多种请求方法:HTTP定义了多种请求方法,最常见的是GET和POST。其他常见的方法有PUT、DELETE、HEAD等,用于不同的操作和目的
  5. 使用URL定位资源:HTTP使用统一资源定位符(URL)来标识要获取的资源地址。URL包含协议、主机名、端口号和资源路径。
  6. 使用TCP作为传输协议:HTTP默认使用TCP作为传输协议,通过建立TCP连接来传输数据。TCP提供可靠的、面向连接的通信。

HTTP协议由请求和响应组成,它们都由报文(message)组成。报文包括报文头和报文体。报文头包含了请求/响应行、报文头部字段和换行符等信息。报文体包含了实际的请求/响应数据,如HTML文档。

总结起来,HTTP是一种简单、灵活、无连接、无状态的协议,广泛应用于Web开发和数据传输。它使用URL定位资源,通过请求-响应模型进行通信,使用TCP作为传输协议。


二.HTTP请求数据格式

HTTP请求格式是由三部分组成:

  1. 请求行(Request line):包括请求方法、URL和协议版本。

    • 请求方法(Request method):表示要执行的操作,常见的方法有GET、POST、PUT、DELETE等。
    • URL(Uniform Resource Locator):表示要访问的资源路径。
    • 协议版本(Protocol version):表示使用的HTTP协议版本,如HTTP/1.1。
  2. 请求头部(Request headers):包括一些关于请求的额外信息,如User-Agent、Content-Type、Authorization等。

  3. 请求体(Request body):用于传输请求的数据,对于GET请求来说,请求体通常为空。

以下是一个示例HTTP请求的格式:

html 复制代码
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

请求头部包括HostUser-AgentAcceptAccept-EncodingAccept-Language等字段。

请求体为空,因为这是一个GET请求。

在上述实例中,申明了该请求是GET请求,我们最常用的请求方式就是GET和POST请求,二者在请求参数的传递中有很大不同,正如上述实例中所说:

GET请求的请求参数在请求行中,没有请求体

POST请求的请求参数在请求体中

下方是另一个响应的实例,在响应体中则展示了许多参数的信息

请求方式

除了上述最常用的GET请求和POST请求外,在HTTP请求响应中还有如下其他的请求方式

笔者这里选取一些相对常用的进行介绍:

  1. GET:用于从服务器获取资源,也是最常见的请求方式。GET请求将请求的参数附加在URL的末尾,发送给服务器。
  2. POST:用于向服务器提交数据,一般用于发送表单数据。POST请求将请求的参数放在请求的主体中,而不是URL中。
  3. PUT:用于向服务器上传文件或更新资源。PUT请求会将请求的数据存储在服务器上指定的位置。
  4. DELETE:用于删除服务器上的资源。
  5. HEAD:用于获取服务器对资源的头部信息,而不获取实际的资源内容。
  6. OPTIONS:用于获取服务器支持的请求方法。

此外,对于其他一些不太常见的请求方式,比如PATCH、TRACE等,用途较少。


三.后端响应请求

在现在主流的Web开发中,当前端给后端发送请求后,后端就需要响应这个请求,执行对应需要的操作,然后加工数据再返回给前端,从而达到前后端分离更高效的维护项目。

以下方代码举例,在传统的Java编程中,我们需要在Controller方法中申明HttpServletRequest对象,然后通过这个对象去拿到前端传给我们的数据,最后返回给前端一个**"OK"**的字符串。

java 复制代码
//原始方式
@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";
    }
}

基于SpringBoot响应数据

但这样的方式是非常低效的,我们可以通过使用Spring框架来帮助我们更高效的实现功能和需求

如下代码,使用SpringBoot的话在代码量上只管的就可以感受到快捷和轻便

java 复制代码
//SpringBOot方式
@RestController
public class RequestController {
    
    //简单类型参数
    @RequestMapping("/getNameAge")
    public String getNameAge(String name,Integer age) {
        //... ...
        return "OK";
    }

使用SpringBoot的话只需要请求参数名方法形式参数变量名相同,框架就会自动帮我们进行类型转化并且拿到数据

请求响应的参数类型

关于请求响应的参数部分,既可以是非常简单的基础类型,也可以是复杂的自定义类型

java 复制代码
public class Student {
    private String name;
    private String age;
    private Address address;
}
public class Address {
    private String provice;
    private String city;
}
java 复制代码
    //复杂类型参数
    @RequestMapping("/getpojo")
    public String getPojo(Student student) {
        System.out.println(student);
        return "OK";
    }

比如我们这里,自定义一个学生类,再在参数中使用学生类对象进行接收

此外数组和集合也是可以作为参数的

java 复制代码
    //数组参数
    @RequestMapping("/array")
    public String getArray(String[] hobby) {
        System.out.println(Arrays.toString(hobby));
        return "ok";
    }
java 复制代码
    //集合参数
    @RequestMapping("/list")
    public String getList(@RequestParam List<String> hobby) {
        System.out.println(hobby);
        return "ok";
    }

但是需要注意,在使用集合作为参数的时候,需要加上注解**@RequestParam**

日期时间参数在使用的时候同上,也要加上对应的注解**@DateTimeFormat**

java 复制代码
    //日期时间参数
    @RequestMapping("/getdatetime")
    public String getTime(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime localDateTime) {
        System.out.println(localDateTime);
        return "OK";
    }

还可以使用JSON格式的参数,但需加上对应的注解**@RequestBody**

java 复制代码
    //JSON参数
    @RequestMapping("/jsonParam")
    public String jsonParam(@RequestBody Student student) {
        System.out.println(student);
        return "OK";
    }

路径参数也是在开发中最常用的一种,加上注释**@PathVariable**声明它是路径变量

java 复制代码
    //路径参数
    @RequestMapping("/path/{id}")
    public String pathParam(@PathVariable Integer id) {
        System.out.println(id);
        return "OK";
    }

存在多个路径参数的时候,可以用**'/'**将他们分开

java 复制代码
    //路径参数
    @RequestMapping("/path/{id}/{name}")
    public String pathParam2(@PathVariable Integer id,@PathVariable String name) {
        System.out.println(id + "--" +name);
        return "OK";
    }

同一响应格式

在企业级开发中,为了方便阅读和管理,我们一般要求返回统一的数据格式

如下,各个响应的返回类型都不一样,这是不便于我们管理和操作的

java 复制代码
@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;
    }
}

因此我们写一个统一返回结果的类,然后将上述各自的返回值封装成这个结果类,然后统一进行返回

经过上述的改善后,我们就可以得到如下的代码

java 复制代码
@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);
    }
}

四.Apifox(postman)使用方法

对于上述HTTP的请求响应和后端响应数据我们有了一些基础的理解后,我们就可以通过一些工具来帮助我们测试,我们能否成功的向后端发起请求,能否成功的拿到后端返回的数据,对此我们可以借助一些接口管理工具,诸如Yapi,postman,Apifox等

笔者这里使用Apifox进行举例,各个工具之间的使用方式是通用的,因此不需要担心方法不兼容的问题。

大体界面是这样的

我们这里只是进行基础的使用,我们可以点击目录旁边的添加接口

点击创建接口后,我们就可以看见如下的界面

对于数据请求的路径,除了图中说明的端口号后,还需注意端口号后的路径必须和请求路径相同,如下图 /hello 和接口中的 /hello 相同,所以就会调用这个 hello()方法

笔者这里给个示例,我们先运行Java项目,在控制台中就会显示本地的服务器端口号,如下图显示为8080

点击这里的运行

然后点击发送

然后就会根据路径找到项目中对应的方法,返回我们需要的数据

以上就是Apifox的基础使用方法,后序笔者会分享一些更高级的使用方式




本次的分享就到此为止了,希望我的分享能给您带来帮助,也欢迎大家三连支持,你们的点赞就是博主更新最大的动力! 如有不同意见,欢迎评论区积极讨论交流,让我们一起学习进步! 有相关问题也可以私信博主,评论区和私信都会认真查看的,我们下次再见

相关推荐
花千树-0107 分钟前
使用 Frp 同时实现 HTTP 和 HTTPS 内网穿透
网络协议·http·https
夜空晚星灿烂10 分钟前
http通信之axios vs fecth该如何选择?
网络·网络协议·http
爱的叹息18 分钟前
【前端】基于 Promise 的 HTTP 客户端工具Axios 详解
前端·网络·网络协议·http
遗憾随她而去.25 分钟前
从 0 开始认识 WebSocket:前端实时通信的利器!
前端·websocket·网络协议
风象南1 小时前
SpringBoot中3种内容协商策略实现
java·spring boot·后端
细心的莽夫8 小时前
SpringCloud 微服务复习笔记
java·spring boot·笔记·后端·spring·spring cloud·微服务
EasyDSS10 小时前
视频监控从安装到优化的技术指南,视频汇聚系统EasyCVR智能安防系统构建之道
大数据·网络·网络协议·音视频
普if加的帕10 小时前
java Springboot使用扣子Coze实现实时音频对话智能客服
java·开发语言·人工智能·spring boot·实时音视频·智能客服
rufeike10 小时前
UDP协议理解
网络·网络协议·udp
〆、风神11 小时前
Spring Boot 整合 Lock4j + Redisson 实现分布式锁实战
spring boot·分布式·后端