当前位置: 代码网 > it编程>网页制作>网页播放器 > 【从理论到应用】HTTP请求响应详解 (请求数据格式,请求方式,Web开发中的体现)

【从理论到应用】HTTP请求响应详解 (请求数据格式,请求方式,Web开发中的体现)

2024年08月01日 网页播放器 我要评论
HTTP(Hypertext Transfer Protocol,超文本传输协议)是一种用于传输超媒体文档(如HTML)的应用层协议。HTTP通过请求-响应模型进行通信。客户端发送一个HTTP请求,服务器接收并处理请求,并返回一个HTTP响应。响应包含响应状态码、响应头和响应体HTTP定义了多种请求方法,最常见的是GET和POST。其他常见的方法有PUT、DELETE、HEAD等,用于不同的操作和目的HTTP协议由请求和响应组成,它们都由报文(message)组成。报文包括报文头和报文体。


目录

一.http协议 

二.http请求数据格式 

请求方式

三.web开发中的http请求与响应

接收http请求

同一响应格式

四.使用第三方工具发送http请求(apifox、postman、yapi)


一.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请求的格式:

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请求。

下方是其他响应的实例,在响应体中则展示了许多参数的信息,可以包含一个简单的html,也可以返回一段json数据

http/1.1 200 ok
date: wed, 02 aug 2024 12:00:00 gmt
server: apache/2.4.41 (unix)
content-length: 123
content-type: text/html; charset=utf-8

<html>
<head>
    <title>example page</title>
</head>
<body>
    <h1>hello, world!</h1>
    <p>this is an example of an http response.</p>
</body>
</html>
  • 状态行:http/1.1 200 ok 表示http版本是1.1,状态码是200,表示请求成功。
  • 响应头部:包含日期、服务器类型、内容长度和内容类型等信息。
  • 空行:头部和响应体之间的空行。
  • 响应体:实际返回的数据,这里是一个简单的html页面。
http/1.1 200 ok
date: wed, 02 aug 2024 12:00:00 gmt
server: apache/2.4.41 (unix)
content-length: 78
content-type: application/json; charset=utf-8

{
    "status": "success",
    "data": {
        "id": 123,
        "name": "example user",
        "email": "user@example.com"
    }
}
  • 状态行:http/1.1 200 ok 表示http请求成功。
  • 响应头部:包含日期、服务器类型、内容长度、内容类型等信息。content-type 头部表明响应体是json格式。
  • 空行:头部和响应体之间的分隔。
  • 响应体:返回的json数据,包含状态、数据对象等信息。在实际应用中,这个json对象可以包含任何服务器想要返回的数据结构。

请求方式

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

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

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

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


三.web开发中的http请求与响应

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

以下方代码举例,在传统的servlet编程中,我们需要在申明一个httpservletrequest对象,然后通过这个对象去拿到前端传给我们的数据,最后返回给前端一个“ok”的字符串。

    public string getnameage(httpservletrequest request) {
        //获取请求参数
        string name = request.getparameter("name");
        string agestr = request.getparameter("age");

        int age = integer.parseint(agestr);

        //... ...
        
        return "ok";
    }

接收http请求

但这样的方式是非常低效的,我们可以通过使用spring框架来帮助我们更高效的实现功能和需求,如下代码,使用springboot的话在代码量上只管的就可以感受到快捷和轻便,通过简单的注解,就可以进行数据的获取,@requestmapping表示请求的路径,@restcontroller表示该类可以接收用户的请求,并且可以响应结果

//springboot方式
@restcontroller
public class requestcontroller {
    
    //简单类型参数
    @requestmapping("/getnameage")
    public string getnameage(string name,integer age) {
        //... ...
        return "ok";
    }

请求响应的参数类型

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

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请求(apifox、postman、yapi)

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

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

大体界面是这样的

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

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

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

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

点击这里的运行

然后点击发送

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

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




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

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com