http请求 订阅
是指从客户端到服务器端的请求消息。包括:消息首行中,对资源的请求方法、资源的标识符及使用的协议。 展开全文
是指从客户端到服务器端的请求消息。包括:消息首行中,对资源的请求方法、资源的标识符及使用的协议。
信息
意    思
指从客户端到服务器端的请求消息
包    括
对资源的请求方法等
分    类
格式
中文名
HTTP请求
外文名
HTTP Request
HTTP请求介绍
从客户端到服务器端的请求消息包括,消息首行中,对资源的请求方法、资源的标识符及使用的协议。考虑到局限性更大的HTTP/0.9的向后兼容问题,有两种合法的HTTP请求格式。
收起全文
精华内容
下载资源
问答
  • Flutter是谷歌的移动UI框架,可以快速在iOS和Android上构建高质量的用户界面。本课程以实例的方式带领大家学习Http请求这个知识点。
  • Java如何发起http请求

    千次阅读 多人点赞 2021-02-22 21:01:06
    Java如何发起http请求前言一、GET与POST1.GET方法2.POST方法实现代码实例演示字符串转json结束 前言 在未来做项目中,一些功能模块可能会采用不同的语言进行编写。这就需要http请求进行模块的调用。那么下面,我将...

    前言

    在未来做项目中,一些功能模块可能会采用不同的语言进行编写。这就需要http请求进行模块的调用。那么下面,我将以Java为例,详细说明如何发起http请求。

    一、GET与POST

    GET和POST是HTTP的两个常用方法。
    GET指从指定的服务器中获取数据
    POST指提交数据给指定的服务器处理

    1.GET方法

    使用GET方法,需要传递的参数被附加在URL地址后面一起发送到服务器。
    例如:http://121.41.111.94/submit?name=zxy&age=21
    特点:

    • GET请求能够被缓存
    • GET请求会保存在浏览器的浏览记录中
    • 以GET请求的URL能够保存为浏览器书签
    • GET请求有长度限制
    • GET请求主要用以获取数据

    2.POST方法

    使用POST方法,需要传递的参数在POST信息中单独存在,和HTTP请求一起发送到服务器。
    例如:
    POST /submit HTTP/1.1
    Host 121.41.111.94
    name=zxy&age=21

    特点:

    • POST请求不能被缓存下来
    • POST请求不会保存在浏览器浏览记录中
    • 以POST请求的URL无法保存为浏览器书签
    • POST请求没有长度限制

    实现代码

    下面将Java发送GET/POST请求封装成HttpRequest类,可以直接使用。HttpRequest类代码如下:

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    import java.net.URL;
    import java.net.URLConnection;
    import java.util.List;
    import java.util.Map;
    
    public class HttpRequest {
        /**
         * 向指定URL发送GET方法的请求
         *
         * @param url
         *            发送请求的URL
         * @param param
         *            请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
         * @return URL 所代表远程资源的响应结果
         */
        public static String sendGet(String url, String param) {
            String result = "";
            BufferedReader in = null;
            try {
                String urlNameString = url + "?" + param;
                URL realUrl = new URL(urlNameString);
                // 打开和URL之间的连接
                URLConnection connection = realUrl.openConnection();
                // 设置通用的请求属性
                connection.setRequestProperty("accept", "*/*");
                connection.setRequestProperty("connection", "Keep-Alive");
                connection.setRequestProperty("user-agent",
                        "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
                // 建立实际的连接
                connection.connect();
                // 获取所有响应头字段
                Map<String, List<String>> map = connection.getHeaderFields();
                // 遍历所有的响应头字段
                for (String key : map.keySet()) {
                    System.out.println(key + "--->" + map.get(key));
                }
                // 定义 BufferedReader输入流来读取URL的响应
                in = new BufferedReader(new InputStreamReader(
                        connection.getInputStream()));
                String line;
                while ((line = in.readLine()) != null) {
                    result += line;
                }
            } catch (Exception e) {
                System.out.println("发送GET请求出现异常!" + e);
                e.printStackTrace();
            }
            // 使用finally块来关闭输入流
            finally {
                try {
                    if (in != null) {
                        in.close();
                    }
                } catch (Exception e2) {
                    e2.printStackTrace();
                }
            }
            return result;
        }
    
        /**
         * 向指定 URL 发送POST方法的请求
         *
         * @param url
         *            发送请求的 URL
         * @param param
         *            请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
         * @return 所代表远程资源的响应结果
         */
        public static String sendPost(String url, String param) {
            PrintWriter out = null;
            BufferedReader in = null;
            String result = "";
            try {
                URL realUrl = new URL(url);
                // 打开和URL之间的连接
                URLConnection conn = realUrl.openConnection();
                // 设置通用的请求属性
                conn.setRequestProperty("accept", "*/*");
                conn.setRequestProperty("connection", "Keep-Alive");
                conn.setRequestProperty("user-agent",
                        "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
                // 发送POST请求必须设置如下两行
                conn.setDoOutput(true);
                conn.setDoInput(true);
                // 获取URLConnection对象对应的输出流
                out = new PrintWriter(conn.getOutputStream());
                // 发送请求参数
                out.print(param);
                // flush输出流的缓冲
                out.flush();
                // 定义BufferedReader输入流来读取URL的响应
                in = new BufferedReader(
                        new InputStreamReader(conn.getInputStream()));
                String line;
                while ((line = in.readLine()) != null) {
                    result += line;
                }
            } catch (Exception e) {
                System.out.println("发送 POST 请求出现异常!"+e);
                e.printStackTrace();
            }
            //使用finally块来关闭输出流、输入流
            finally{
                try{
                    if(out!=null){
                        out.close();
                    }
                    if(in!=null){
                        in.close();
                    }
                }
                catch(IOException ex){
                    ex.printStackTrace();
                }
            }
            return result;
        }
    }
    

    实例演示

    搭建flask框架文章中,我们已经写好了一个功能模块show(). 该功能模块如下:

    #app的路由地址"/show"即为ajax中定义的url地址,采用POST、GET方法均可提交
    @app.route("/show",methods=["GET", "POST"])
    def show():
        #首先获取前端传入的name数据
        if request.method == "POST":
            name = request.form.get("name")
        if request.method == "GET":
            name = request.args.get("name")
        #创建Database类的对象sql,test为需要访问的数据库名字 具体可见Database类的构造函数
        sql = Database("test")
        try:
            #执行sql语句 多说一句,f+字符串的形式,可以在字符串里面以{}的形式加入变量名 结果保存在result数组中
            result = sql.execute(f"SELECT type FROM type WHERE name='{name}'")
        except Exception as e:
            return {'status':"error", 'message': "code error"}
        else:
            if not len(result) == 0:
                #这个result,我觉得也可以把它当成数据表,查询的结果至多一个,result[0][0]返回数组中的第一行第一列
                return {'status':'success','message':result[0][0]}
            else:
                return "rbq"
                
    

    下面 我们利用POST方法发起请求,Java代码如下:

       	 //创建发起http请求对象
           HttpRequest h = new HttpRequest();
           //向121.41.111.94/show发起POST请求,并传入name参数
           String content = h.sendPost("http://121.41.111.94/show","name=张新宇");
           System.out.println(content);         
    

    我们打印出content值,发现就是python中show()返回的json(在Java中,content被识别为String类型,而不是json)
    在这里插入图片描述
    (在转换过程中,不知道出什么问题了,中文显示了unicode编码。但在后面的转json格式后就没有这样的问题了)

    字符串转json

    Java成功发起Http请求后,由于返回值是String类型,而不是原本python函数中的json格式。所以我们需要将字符串类型转为json格式,并通过键值对的形式得出message对应的值
    首先在maven中引入jar包:

    		  <dependency>
              <groupId>com.alibaba</groupId>
              <artifactId>fastjson</artifactId>
              <version>1.2.28</version>
              </dependency>
              
    

    转换代码如下:

    import com.alibaba.fastjson.JSONObject;
    JSONObject jsonObject = JSONObject.parseObject(content);
    System.out.println(jsonObject);
    System.out.println(jsonObject.getString("message"));
    
    

    运行结果:
    在这里插入图片描述

    结束

    以上就是Java发起http请求,从而调用由python编写的功能模块。在使用python编写功能模块时,可以返回json格式的数据。在之后使用Java进行调用时,使用工具进行转换得出需要的数据。

    展开全文
  • Http请求的流程原理以及请求详解

    千次阅读 2019-03-12 16:04:10
    1.Http请求的基本流程 HTTP协议(HyperText Transfer Protocol,超文本传输协议):是一种发布和接收 HTML页面的方法。 HTTPS(Hypertext Transfer Protocol over Secure Socket Layer)简单讲是HTTP的安全版,在...

    1.Http请求的基本流程

    HTTP协议(HyperText Transfer Protocol,超文本传输协议):是一种发布和接收 HTML页面的方法。
    HTTPS(Hypertext Transfer Protocol over Secure Socket Layer)简单讲是HTTP的安全版,在HTTP下加入SSL层。
    SSL(Secure Sockets Layer 安全套接层)主要用于Web的安全传输协议,在传输层对网络连接进行加密,保障在Internet上数据传输的安全。
    HTTP的端口号为80,
    HTTPS的端口号为443;
    浏览器的主要功能是向服务器发出请求,在浏览器窗口中展示您选择的网络资源,HTTP是一套计算机通过网络进行通信的规则。
    HTTP请求是指 : 客户端通过发送 HTTP 请求向服务器请求对资源的访问。 它向服务器传递了一个数据块,也就是请求信息,HTTP 请求由三部分组成:请求行、请求头和请求正文。
    工作原理:
    1.由HTTP客户端发起一个请求,建立一个到服务器指定端口(默认是80端口)的TCP连接。 连接
    2.HTTP服务器则在那个端口监听客户端发送过来的请求。一旦收到请求, 请求
    3.服务器(向客户端)发回一个状态行,比如"HTTP/1.1 200 OK",和(响应的)消息,消息的消息体可能是请求的文件、错误消息、或者其它一些信息。 响应
    4.客户端接收服务器所返回的信息通过浏览器显示在用户的显示屏上,然后客 http工作流程图 http工作流程图 户机与服务器断开
    连接

    HTTP使用TCP而不是UDP的原因在于(打开)一个网页必须传送很多数据,而TCP协议提供传输控制,按顺序组织数据,和错误纠正。

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    访问的具体流程:
    在这里插入图片描述
    2.http请求具体详情解析

    (1).请求行:请求方法URI协议/版本
    请求的第一行是“方法 URL 协议/版本”,并以 回车换行作为结尾。请求行以空格分隔。格式如下:
    GET /index.html HTTP/1.1
    以上代码中“GET”代表请求方法,“//ndex.html”表示URI,“HTTP/1.1代表协议和协议的版本。
    根据HTTP标准,HTTP请求可以使用多种请求方法。

    HTTP 0.9:只有基本的文本 GET 功能。

    HTTP 1.0:完善的请求/响应模型,并将协议补充完整,定义了三种请求方法: GET, POST 和 HEAD方法。

    HTTP 1.1:在 1.0 基础上进行更新,新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。

    HTTP 2.0(未普及):请求/响应首部的定义基本没有改变,只是所有首部键必须全部小写,而且请求行要独立为 :method、:scheme、:host、:path这些键值对。

    根据HTTP标准,HTTP请求可以使用多种请求方法。例如:HTTP1.1支持7种请求方法:GET、POST、HEAD、OPTIONS、PUT、DELETE和TARCE。在Internet应用中,最常用的方法是GET和POST。
    URL完整地指定了要访问的网络资源,通常只要给出相对于服务器的根目录的相对目录即可,因此总是以“/”开头,最后,协议版本声明了通信过程中使用HTTP的版本。

    请求方法

    在 HTTP 协议中,HTTP 请求可以使用多种请求方法,这些方法指明了要以何种方式来访问 Request-URI 所标识的资源。HTTP1.1 支持的请求方法如下表所示:
    在这里插入图片描述
    重点介绍 GET、POST 和 HEAD 三个方法:

    (1)GET

        GET 方法用于获取由 Request-URI 所标识的资源的信息,常见的形式是:
    
        GET Request-URI HTTP/1.1
    
        GET方法是默认的HTTP请求方法,例如当我们通过在浏览器的地址栏中直接输入网址的方式去访问网页的时候,浏览器采用的就是 GET 方法向服务器获取资源。
    
        我们可以使用GET方法来提交表单数据,用GET方法提交的表单数据只经过了简单的编码,同时它将作为URL的一部分向服务器发送,因此,如果使用GET方法来提交表单数据就存在着安全隐患上。例如:
         Http://localhost/login.php?username=aa&password=1234
    
        从上面的URL请求中,很容易就可以辩认出表单提交的内容。(?之后的内容)另外由于GET方法提交的数据是作为URL请求的一部分所以提交的数据量不能太大。这是因为浏览器对url的长度有限制
    
       各种浏览器也会对url的长度有所限制,下面是几种常见浏览器的url长度限制:(单位:字符)
    

    IE : 2803
    Firefox:65536
    Chrome:8182
    Safari:80000
    Opera:190000

    2)POST

          POST方法是GET方法的一个替代方法,它主要是向Web服务器提交表单数据,尤其是大批量的数据。 username=aa&password=1234
    
        POST方法克服了GET方法的一些缺点。通过POST方法提交表单数据时,数据不是作为URL请求的一部分而是作为标准数据传送给Web服务器,这就克服了GET方法中的信息无法保密和数据量太小的缺点。因此,出于安全的考虑以及对用户隐私的尊重,通常表单提交时采用POST方法。
    

    从编程的角度来讲,如果用户通过GET方法提交数据,则数据存放在QUERY_STRING环境变量中,而POST方法提交的数据则可以从标准输入流中获取。

    GET与POST方法有以下区别:

      1、  在客户端,Get方式在通过URL提交数据,数据在URL中可以看到;POST方式,数据放在HTTP包的body中。
    
      2、 GET方式提交的数据大小有限制(因为浏览器对URL的长度有限制),而POST则没有此限制。
    
      3、安全性问题。正如在(1)中提到,使用 Get 的时候,参数会显示在地址栏上,而 Post 不会。所以,如果这些数据是中文数据而且是非敏感数据,那么使用 get;如果用户输入的数据不是中文字符而且包含敏感数据,那么还是使用 post为好。
    
      4.、服务器取值方式不一样。GET方式取值,如php可以使用$_GET来取得变量的值,而POST方式通过$_POST来获取变量的值。
    

    (3)HEAD

     HEAD 方法与 GET 
    

    方法几乎是相同的,它们的区别在于 HEAD 方法只是请求消息报头,而不是完整的内容。对于 HEAD 请求的回应部分来说,它的 HTTP
    头部中包含的信息与通过 GET 请求所得到的信息是相同的。利用这个方法,不必传输整个资源内容,就可以得到 Request-URI
    所标识的资源的信息。这个方法通常被用于测试超链接的有效性,是否可以访问,以及最近是否更新。

    要注意的是,在 HTML 文档中,书写 get 和 post,大小写都可以,但在 HTTP 协议中的 GET 和 POST 只能是大写形式。
    

    2. 请求头

    每个头域由一个域名,冒号(:)和域值三部分组成。域名是大小写无关的,域值前可以添加任何数量的空格符,头域可以被扩展为多行,在每行开始处,使用至少一个空格或制表符。

    HTTP最常见的请求头如下:
    Transport 头域

    Connection:

    作用:表示是否需要持久连接。

    如果服务器看到这里的值为“Keep-Alive”,或者看到请求使用的是HTTP 1.1(HTTP 1.1默认进行持久连接),它就可以利用持久连接的优点,当页面包含多个元素时(例如Applet,图片),显著地减少下载所需要的时间。要实现这一点,服务器需要在应答中发送一个Content-Length头,最简单的实现方法是:先把内容写入 ByteArrayOutputStream,然后在正式写出内容之前计算它的大小;

    例如: Connection: keep-alive 当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的 网页,会继续使用这一条已经建立的连接

    例如: Connection: close 代表一个Request完成后,客户端和服务器之间用于传输HTTP数据的TCP连接会关闭, 当客户端再次发送Request,需要重新建立TCP连接。

    Host(发送请求时,该报头域是必需的)

    Host请求报头域主要用于指定被请求资源的Internet主机和端口号,它通常从HTTP URL中提取出来的。

    eg:http://;localhost/index.html
    浏览器发送的请求消息中,就会包含Host请求报头域,如下:
    Host:localhost

    此处使用缺省端口号80,若指定了端口号8080,则变成:Host:localhost:8080

    Client 头域
    Accept:

    作用:浏览器可以接受的媒体类型(MIME类型),

    例如: Accept: text/html 代表浏览器可以接受服务器回发的类型为 text/html 也就是我们常说的html文档, 如果服务器无法返回text/html类型的数据,服务器应该返回一个406错误(non acceptable)。

    通配符 * 代表任意类型。例如 Accept: / 代表浏览器可以处理所有类型,(一般浏览器发给服务器都是发这个)

    Accept-Encoding:

    作用: 浏览器申明自己接收的编码方法,通常指定压缩方法,是否支持压缩,支持什么压缩方法(gzip,deflate),(注意:这不是只字符编码);

    例如: Accept-Encoding: gzip, deflate。Server能够向支持gzip/deflate的浏览器返回经gzip或者deflate编码的HTML页面。 许多情形下这可以减少5到10倍的下载时间,也节省带宽。

    Accept-Language:

    作用: 浏览器申明自己接收的语言。

    语言跟字符集的区别:中文是语言,中文有多种字符集,比如big5,gb2312,gbk等等;

    例如: Accept-Language:zh-cn 。如果请求消息中没有设置这个报头域,服务器假定客户端对各种语言都可以接受。

    User-Agent:

    作用:告诉HTTP服务器, 客户端使用的操作系统和浏览器的名称和版本.

    我们上网登陆论坛的时候,往往会看到一些欢迎信息,其中列出了你的操作系统的名称和版本,你所使用的浏览器的名称和版本,这往往让很多人感到很神奇,实际上, 服务器应用程序就是从User-Agent这个请求报头域中获取到这些信息User-Agent请求报头域允许客户端将它的操作系统、浏览器和其它属性告诉服务器。

    例如: User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; CIBA; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C; InfoPath.2; .NET4.0E)

    Accept-Charset:

    作用:浏览器申明自己接收的字符集,这就是本文前面介绍的各种字符集和字符编码,如gb2312,utf-8(通常我们说Charset包括了相应的字符编码方案);

    例如:Accept-Charset:iso-8859-1,gb2312.如果在请求消息中没有设置这个域,缺省是任何字符集都可以接受。

    Authorization:授权信息,通常出现在对服务器发送的WWW-Authenticate头的应答中;

    Authorization请求报头域主要用于证明客户端有权查看某个资源。当浏览器访问一个页面时,如果收到服务器的响应代码为401(未授权),可以发送一个包含Authorization请求报头域的请求,要求服务器对其进行验证。

    Cookie/Login 头域

    Cookie:

    作用: 最重要的header, 将cookie的值发送给HTTP 服务器

    Entity头域

    Content-Length

    作用:发送给HTTP服务器数据的长度。即请求消息正文的长度;

    例如: Content-Length: 38

    Content-Type:

    作用:

    例如:Content-Type: application/x-www-form-urlencoded

    Miscellaneous 头域

    Referer:

    作用: 提供了Request的上下文信息的服务器,告诉服务器我是从哪个链接过来的,比如从我主页上链接到一个朋友那里, 他的服务器就能够从HTTP Referer中统计出每天有多少用户点击我主页上的链接访问 他的网站。

    例如: Referer:http://translate.google.cn/?hl=zh-cn&tab=wT

    Cache 头域

    If-Modified-Since:

    作用: 把浏览器端缓存页面的最后修改时间发送到服务器去,服务器会把这个时间与服务器上实际文件的最后修改时间进行对比。如果时间一致,那么返回304,客户端就直接使用本地缓存文件。如果时间不一致,就会返回200和新的文件内容。客户端接到之后,会丢弃旧文件,把新文件缓存起来,并显示在浏览器中。

    例如:If-Modified-Since: Thu, 09 Feb 2012 09:07:57 GMT。

    If-None-Match:

    作用: If-None-Match和ETag一起工作,工作原理是在HTTP Response中添加ETag信息。 当用户再次请求该资源时,将在HTTP Request 中加入If-None-Match信息(ETag的值)。如果服务器验证资源的ETag没有改变(该资源没有更新),将返回一个304状态告诉客户端使用本地缓存文件。否则将返回200状态和新的资源和Etag. 使用这样的机制将提高网站的性能

    例如: If-None-Match: “03f2b33c0bfcc1:0”

    Pragma:

    作用: 防止页面被缓存, 在HTTP/1.1版本中,它和Cache-Control:no-cache作用一模一样

    Pargma只有一个用法, 例如: Pragma: no-cache

    注意: 在HTTP/1.0版本中,只实现了Pragema:no-cache, 没有实现Cache-Control

    Cache-Control:

    作用: 这个是非常重要的规则。 这个用来指定Response-Request遵循的缓存机制。各个指令含义如下

    Cache-Control:Public 可以被任何缓存所缓存()

    Cache-Control:Private 内容只缓存到私有缓存中

    Cache-Control:no-cache 所有内容都不会被缓存

    2. HTTP响应格式

    在接收和解释请求消息后,服务器会返回一个 HTTP 响应消息。与 HTTP 请求类似,HTTP 响应也是由三个部分组成,分别是:状态行、消息报头和响应正文。如:
    在这里插入图片描述
    1、状态行
    状态行由协议版本、数字形式的状态代码,及相应的状态描述组成,各元素之间以空格分隔,结尾时回车换行符,格式如下:

    HTTP-Version Status-Code Reason-Phrase CRLF

    HTTP-Version 表示服务器 HTTP 协议的版本,Status-Code 表示服务器发回的响应代码,Reason-Phrase 表示状态代码的文本描述,CRLF 表示回车换行。例如:

    HTTP/1.1 200 OK (CRLF)

      状态代码与状态描述
    
      状态代码由 3 位数字组成, 表示请求是否被理解或被满足,状态描述给出了关于状态码的简短的文字描述。状态码的第一个数字定义了响应类别,后面两位数字没有具体分类。第一个数字有 5 种取值,如下所示。
    

    1xx:指示信息——表示请求已经接受,继续处理
    2xx:成功——表示请求已经被成功接收、理解、接受。
    3xx:重定向——要完成请求必须进行更进一步的操作
    4xx:客户端错误——请求有语法错误或请求无法实现
    5xx:服务器端错误——服务器未能实现合法的请求。
    常见状态代码、状态描述、说明:
    200 OK //客户端请求成功
    400 Bad Request //客户端请求有语法错误,不能被服务器所理解
    401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
    403 Forbidden //服务器收到请求,但是拒绝提供服务
    404 Not Found //请求资源不存在,eg:输入了错误的URL
    500 Internal Server Error //服务器发生不可预期的错误
    503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常

    2、响应正文
    响应正文就是服务器返回的资源的内容,响应头和正文之间也必须用空行分隔。如:
    在这里插入图片描述
    3 、响应头信息
    HTTP最常见的响应头如下所示:

    Cache头域
    Date:

    作用:生成消息的具体时间和日期,即当前的GMT时间。

    例如: Date: Sun, 17 Mar 2013 08:12:54 GMT

    Expires:

    作用: 浏览器会在指定过期时间内使用本地缓存,指明应该在什么时候认为文档已经过期,从而不再缓存它。

    例如: Expires: Thu, 19 Nov 1981 08:52:00 GMT

    Vary

    作用:

    例如: Vary: Accept-Encoding

    Cookie/Login 头域
    P3P

    作用: 用于跨域设置Cookie, 这样可以解决iframe跨域访问cookie的问题

    例如: P3P: CP=CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR

    Set-Cookie

    作用: 非常重要的header, 用于把cookie 发送到客户端浏览器, 每一个写入cookie都会生成一个Set-Cookie.

    例如: Set-Cookie: PHPSESSID=c0huq7pdkmm5gg6osoe3mgjmm3; path=/

    Entity实体头域:
    实体内容的属性,包括实体信息类型,长度,压缩方法,最后一次修改时间,数据有效性等。
    ETag:

    作用: 和If-None-Match 配合使用。 (实例请看上节中If-None-Match的实例)

    例如: ETag: “03f2b33c0bfcc1:0”

    Last-Modified:

    作用: 用于指示资源的最后修改日期和时间。(实例请看上节的If-Modified-Since的实例)

    例如: Last-Modified: Wed, 21 Dec 2011 09:09:10 GMT

    Content-Type:

    作用:WEB服务器告诉浏览器自己响应的对象的类型和字符集,

    例如:

        Content-Type: text/html; charset=utf-8
    

    Content-Type:text/html;charset=GB2312

    Content-Type: image/jpeg

    Content-Length:

    指明实体正文的长度,以字节方式存储的十进制数字来表示。在数据下行的过程中,Content-Length的方式要预先在服务器中缓存所有数据,然后所有数据再一股脑儿地发给客户端。

    例如: Content-Length: 19847

    Content-Encoding:

    作用:文档的编码(Encode)方法。一般是压缩方式。

    WEB服务器表明自己使用了什么压缩方法(gzip,deflate)压缩响应中的对象。利用gzip压缩文档能够显著地减少HTML文档的下载时间。

    例如:Content-Encoding:gzip

    Content-Language:

    作用: WEB服务器告诉浏览器自己响应的对象的语言者

    例如: Content-Language:da

    Miscellaneous 头域
    Server:

    作用:指明HTTP服务器的软件信息

    例如:Apache/2.2.8 (Win32) PHP/5.2.5

    X-Powered-By:

    作用:表示网站是用什么技术开发的

    例如: X-Powered-By: PHP/5.2.5

    Transport头域
    Connection:

    例如: Connection: keep-alive 当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接

    例如: Connection: close 代表一个Request完成后,客户端和服务器之间用于传输HTTP数据的TCP连接会关闭, 当客户端再次发送Request,需要重新建立TCP连接。

    Location头域
    Location:

    作用: 用于重定向一个新的位置, 包含新的URL地址

    实例请看304状态实例

    无状态是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。从另一方面讲,打开一个服务器上的网页和你之前打开这个服务器上的网页之间没有任何联系。

    HTTP是一个无状态的面向连接的协议,无状态不代表HTTP不能保持TCP连接,更不能代表HTTP使用的是UDP协议(无连接)。

    从HTTP/1.1起,默认都开启了Keep-Alive,保持连接特性,简单地说,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。

    Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。

    3. 浏览器缓存

       浏览器缓存:包括页面html缓存和图片js,css等资源的缓存。如下图,浏览器缓存是基于把页面信息保存到用户本地电脑硬盘里。
    

    1、缓存的优点:

     1)服务器响应更快:因为请求从缓存服务器(离客户端更近)而不是源服务器被相应,这个过程耗时更少,让服务器看上去响应更快。
    
     2)减少网络带宽消耗:当副本被重用时会减低客户端的带宽消耗;客户可以节省带宽费用,控制带宽的需求的增长并更易于管理。
    

    1、缓存工作原理
    页面缓存状态是由http header决定的,一个浏览器请求信息,一个是服务器响应信息。主要包括Pragma: no-cache、Cache-Control、 Expires、 Last-Modified、If-Modified-Since。其中Pragma: no-cache由HTTP/1.0规定,Cache-Control由HTTP/1.1规定。

       工作原理图:
    

    从图中我们可以看到原理主要分三步:

    第一次请求:浏览器通过http的header报头,附带Expires,Cache-Control,Last-Modified/Etag向服务器请求,此时服务器记录第一次请求的Last-Modified/Etag
    再次请求:当浏览器再次请求的时候,请求头附带Expires,Cache-Control,If-Modified-Since/Etag向服务器请求
    服务器根据第一次记录的Last-Modified/Etag和再次请求的If-Modified-Since/Etag做对比,判断是否需要更新,服务器通过这两个头判断本地资源未发生变化,客 户端不需要重新下载,返回304响应。常见流程如下图所示:

    与缓存相关的HTTP扩展消息头

    Expires:设置页面过期时间,格林威治时间GMT
    

    Cache-Control:更细致的控制缓存的内容

    Last-Modified:请求对象最后一次的修改时间 用来判断缓存是否过期 通常由文件的时间信息产生

    ETag:响应中资源的校验值,在服务器上某个时段是唯一标识的。ETag是一个可以 与Web资源关联的记号(token),和Last-Modified功能才不多,也是一个标识符,一般和Last-Modified一起使用,加强服务器判断的准确度。
    
    **Date:服务器的时间**
    
    If-Modified-Since:客户端存取的该资源最后一次修改的时间,用来和服务器端的Last-Modified做比较
    
    If-None-Match:客户端存取的该资源的检验值,同ETag。
    

    Cache-Control的主要参数
    Cache-Control: private/public Public 响应会被缓存,并且在多用户间共享。 Private 响应只能够作为私有的缓存,不能再用户间共享。
    Cache-Control: no-cache:不进行缓存
    Cache-Control: max-age=x:缓存时间 以秒为单位
    Cache-Control: must-revalidate:如果页面是过期的 则去服务器进行获取。

    2、关于图片,css,js,flash的缓存
    这个主要通过服务器的配置来实现这个技术,如果使用apache服务器的话,可以使用mod_expires模块来实现:

    编译mod_expires模块:

    Cd /root/httpd-2.2.3/modules/metadata

    /usr/local/apache/bin/apxs -i -a -c mod_expires.c //编译

    编辑httpd.conf配置:添加下面内容

    ExpiresActive on

    ExpiresDefault “access plus 1 month”

    ExpiresByType text/html “access plus 1 months”

    ExpiresByType text/css “access plus 1 months”

    ExpiresByType image/gif “access plus 1 months”

    ExpiresByType image/jpeg “access plus 1 months”

    ExpiresByType image/jpg “access plus 1 months”

    ExpiresByType image/png “access plus 1 months”

    EXpiresByType application/x-shockwave-flash “access plus 1 months”

    EXpiresByType application/x-javascript “access plus 1 months”

    #ExpiresByType video/x-flv “access plus 1 months”

    解释:第一句–开启服务

    第二句–默认时间是一个月

    展开全文
  • SpringBoot发送Http请求-RestTemplate

    万次阅读 多人点赞 2020-05-14 12:05:41
    SpringBoot发送Http请求 [提前声明] 文章由作者:张耀峰 结合自己生产中的使用经验整理,最终形成简单易懂的文章 写作不易,转载请注明,谢谢! 大数据代码案例地址: https://github.com/Mydreamandreality/sparkResearch...

    SpringBoot发送Http请求

    [提前声明]
    文章由作者:张耀峰 结合自己生产中的使用经验整理,最终形成简单易懂的文章
    写作不易,转载请注明,谢谢!
    大数据代码案例地址: https://github.com/Mydreamandreality/sparkResearch


    前言

    之前我写过一篇关于SpringBoot发送Http请求的文章、当时使用的是Apache,Http.client
    文章地址:图解springboot后端发送HttpGet和HttpPost请求
    但是使用这个工具发送请求很繁琐、代码看起来也很复杂、而且大部分都是冗余的代码、而Spring给我们提供了一个发送Http请求的工具、所以我觉得有必要安利一下

    RestTemplate

    首先看下spring官方对RestTemplate的解释

    在这里插入图片描述

    RestTemplate是Spring用于同步client端的核心类,简化了与http服务的通信,并满足RestFul原则,程序代码可以给它提供URL,并提取结果。默认情况下,RestTemplate默认依赖jdk的HTTP连接工具。当然你也可以 通过setRequestFactory属性切换到不同的HTTP源,比如Apache HttpComponents、Netty和OkHttp

    如何使用

    经过简单了解后、我们不多bb、直接上代码、通过代码来说话

    • 1、pom配置

    先声明下我的SpringBoot版本:<version>2.1.13.RELEASE</version>
    org.springframework.web中已经默认集成了RestTemplate

    引用apache的httclient (不是用RestTemplate吗?为什么又引用了apache的client、别急 稍后解释

            <dependency>
                <groupId>org.apache.httpcomponents</groupId>
                <artifactId>httpclient</artifactId>
                <version>4.5.6</version>
            </dependency>
    
    • 2、RestTemplate配置

    在Spring的官方文档中可以了解到、RestTemplate 采用同步方式执行 HTTP 请求的类,底层使用 JDK 原生 HttpURLConnection API ,或者 HttpComponents等其他 HTTP 客户端请求类库。还有一处强调的就是 RestTemplate 提供模板化的方法让开发者能更简单地发送 HTTP 请求

    既然如此、那么我们底层依然使用apache的client给我们提供的http请求服务能力、上层的应用开发使用RestTemplate的模板

    ClientHttpRequestFactory 接口有4个实现类,分别是:

    • AbstractClientHttpRequestFactoryWrapper 用来装配其他request factory的抽象类。
    • CommonsClientHttpRequestFactory 允许用户配置带有认证和http连接池的httpclient,已废弃,推荐用HttpComponentsClientHttpRequestFactory。
    • HttpComponentsClientHttpRequestFactory 同2.
    • SimpleClientHttpRequestFactory 接口的一个简单实现,可配置proxy,connectTimeout,readTimeout等参数。

    我们使用的是HttpComponentsClientHttpRequestFactory来配置

    • 配置application.yml

    首先我们自定义一些配置参数、后面会用到

    http_pool:
      max_total: 200
      default_max_per_route: 100
      connect_timeout: 5000
      connection_request_timeout: 1000
      socket_timeout: 65000
      validate_after_inactivity: 2000
    
    • 新建ApplicationValues.java

    这个是读取配置中的参数方法

    import lombok.Getter;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.stereotype.Component;
    
    /**
     * @author 孤
     * @version v1.0
     * @Developers 张耀烽
     * @serviceProvider 四叶草安全(SeClover)
     * @description 获取Application配置数据
     * @date
     */
    @Getter
    @Component
    public class ApplicationValues {
    
        @Value("${http_pool.max_total}")
        private int maxTotal;
    
        @Value("${http_pool.default_max_per_route}")
        private int maxPerRoute;
    
        @Value("${http_pool.connect_timeout}")
        private int connTimeOut;
    
        @Value("${http_pool.connection_request_timeout}")
        private int connReqTimeOut;
    
        @Value("${http_pool.socket_timeout}")
        private int socketTimeout;
    
        @Value("${http_pool.validate_after_inactivity}")
        private int inactivity;
    }
    
    • 新建RestTemplateConfig.java

    这个是配置我们的底层http客户端(这里我们使用apache的client

    如何配置:

    Spring提供了HttpComponentsClientHttpRequestFactory可以通过该方法来配置我们的http客户端

    import com.clover.api.consts.ApplicationValues;
    import org.apache.http.client.HttpClient;
    import org.apache.http.client.config.RequestConfig;
    import org.apache.http.config.Registry;
    import org.apache.http.config.RegistryBuilder;
    import org.apache.http.conn.socket.ConnectionSocketFactory;
    import org.apache.http.conn.socket.PlainConnectionSocketFactory;
    import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
    import org.apache.http.impl.client.HttpClientBuilder;
    import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.http.client.ClientHttpRequestFactory;
    import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
    import org.springframework.web.client.RestTemplate;
    
    /**
     * @author 孤
     * @version v1.0
     * @Developers 张耀烽
     * @serviceProvider 四叶草安全(SeClover)
     * @description http工厂配置
     * @date
     */
    @Configuration
    public class RestTemplateConfig {
    
        @Autowired
        private ApplicationValues appValues;
    
        @Bean
        public RestTemplate restTemplate() {
            return new RestTemplate(httpRequestFactory());
        }
    
        @Bean
        public ClientHttpRequestFactory httpRequestFactory() {
            return new HttpComponentsClientHttpRequestFactory(httpClient());
        }
    
        @Bean
        public HttpClient httpClient() {
            Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create()
                    .register("http", PlainConnectionSocketFactory.getSocketFactory())
                    .register("https", SSLConnectionSocketFactory.getSocketFactory())
                    .build();
            PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(registry);
            connectionManager.setMaxTotal(appValues.getMaxTotal());
            connectionManager.setDefaultMaxPerRoute(appValues.getMaxPerRoute());
            connectionManager.setValidateAfterInactivity(appValues.getInactivity());
            RequestConfig requestConfig = RequestConfig.custom()
                    //服务器返回数据(response)的时间,超过抛出read timeout
                    .setSocketTimeout(appValues.getSocketTimeout())
                    //连接上服务器(握手成功)的时间,超出抛出connect timeout
                    .setConnectTimeout(appValues.getConnTimeOut())
                    //从连接池中获取连接的超时时间,超时间未拿到可用连接,会抛出org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection from pool
                    .setConnectionRequestTimeout(appValues.getConnReqTimeOut())
                    .build();
            return HttpClientBuilder.create()
                    .setDefaultRequestConfig(requestConfig)
                    .setConnectionManager(connectionManager)
                    .build();
        }
    }
    
    • 发送请求

    RestTemplate对于不同的请求方式提供了不同的函数、我把官方的图贴一下、下面我会把常用的跟大家说一下

    在这里插入图片描述

    发送Post请求、请求参数为json

    一般的post请求都是从body中传递json参数、比如是这样的

    {
        "name":"张耀烽",
        "sex":"男"
    }
    
    • 首先我们构造我们的json请求参数
    • 其次发送请求

    请求发送成功后、会返回 ResponseEntity对象、spring把response的所有结果集都封装在了这个对象中、我们可以按需使用、此处我只获取了请求成功后返回的body

        /**
         * 生成post请求的JSON请求参数
         * 请求示例:
         * {
         * "id":1,
         * "name":"张耀烽"
         * }
         *
         * @return
         */
        public HttpEntity<Map<String, String>> generatePostJson(Map<String, String> jsonMap) {
    
            //如果需要其它的请求头信息、都可以在这里追加
            HttpHeaders httpHeaders = new HttpHeaders();
    
            MediaType type = MediaType.parseMediaType("application/json;charset=UTF-8");
    
            httpHeaders.setContentType(type);
    
            HttpEntity<Map<String, String>> httpEntity = new HttpEntity<>(jsonMap, httpHeaders);
    
            return httpEntity;
        }
        
        
          /**
         * post请求、请求参数为json
         *
         * @return
         */
        public String sendPost() {
            String uri = "http://127.0.0.1:80";
    
            Map<String, String> jsonMap = new HashMap<>(6);
            jsonMap.put("name", "张耀烽");
            jsonMap.put("sex", "男");
    
            ResponseEntity<String> apiResponse = restTemplate.postForEntity
                    (
                            uri,
                            generatePostJson(jsonMap),
                            String.class
                    );
            return apiResponse.getBody();
        }
    

    发送get请求、请求参数为uri参数

    get的请求我们一般都是通过uri的方式来进行传参,比如:

    http://127.0.0.1:80/?name=张耀烽&sex=男

    • 首先构造我们的get请求参数
    • 发送get请求、获取结果
     /**
         * 生成get参数请求url
         * 示例:https://0.0.0.0:80/api?u=u&o=o
         * 示例:https://0.0.0.0:80/api
         *
         * @param protocol 请求协议 示例: http 或者 https
         * @param uri      请求的uri 示例: 0.0.0.0:80
         * @param params   请求参数
         * @return
         */
        public String generateRequestParameters(String protocol, String uri, Map<String, String> params) {
            StringBuilder sb = new StringBuilder(protocol).append("://").append(uri);
            if (ToolUtil.isNotEmpty(params)) {
                sb.append("?");
                for (Map.Entry map : params.entrySet()) {
                    sb.append(map.getKey())
                            .append("=")
                            .append(map.getValue())
                            .append("&");
                }
                uri = sb.substring(0, sb.length() - 1);
                return uri;
            }
            return sb.toString();
        }
    
        /**
         * get请求、请求参数为?拼接形式的
         * <p>
         * 最终请求的URI如下:
         * <p>
         * http://127.0.0.1:80/?name=张耀烽&sex=男
         *
         * @return
         */
        public String sendGet() {
            Map<String, String> uriMap = new HashMap<>(6);
            uriMap.put("name", "张耀烽");
            uriMap.put("sex", "男");
    
            ResponseEntity responseEntity = restTemplate.getForEntity
                    (
                            generateRequestParameters("http", "127.0.0.1:80", uriMap),
                            String.class
                    );
            return (String) responseEntity.getBody();
        }
    

    总结

    到此我们两种常用的请求就已经掌握了、其它的方法你们需要用的时候去看就可以了、都是一些重载的方法、大同小异。

    完整代码:

    import com.clover.api.utils.tools.ToolUtil;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.http.HttpEntity;
    import org.springframework.http.HttpHeaders;
    import org.springframework.http.MediaType;
    import org.springframework.http.ResponseEntity;
    import org.springframework.stereotype.Component;
    import org.springframework.web.client.RestTemplate;
    
    import java.util.HashMap;
    import java.util.Map;
    
    /**
     * @author 孤
     * @version v1.0
     * @Developers 张耀烽
     * @serviceProvider 四叶草安全(SeClover)
     * @description 请简易描述定义
     * @date 2020/5/14
     */
    @Component
    public class RestMock<k, v> {
    
        @Autowired
        private RestTemplate restTemplate;
    
        /**
         * 生成post请求的JSON请求参数
         * 请求示例:
         * {
         * "id":1,
         * "name":"张耀烽"
         * }
         *
         * @return
         */
        public HttpEntity<Map<String, String>> generatePostJson(Map<String, String> jsonMap) {
    
            //如果需要其它的请求头信息、都可以在这里追加
            HttpHeaders httpHeaders = new HttpHeaders();
    
            MediaType type = MediaType.parseMediaType("application/json;charset=UTF-8");
    
            httpHeaders.setContentType(type);
    
            HttpEntity<Map<String, String>> httpEntity = new HttpEntity<>(jsonMap, httpHeaders);
    
            return httpEntity;
        }
    
    
        /**
         * 生成get参数请求url
         * 示例:https://0.0.0.0:80/api?u=u&o=o
         * 示例:https://0.0.0.0:80/api
         *
         * @param protocol 请求协议 示例: http 或者 https
         * @param uri      请求的uri 示例: 0.0.0.0:80
         * @param params   请求参数
         * @return
         */
        public String generateRequestParameters(String protocol, String uri, Map<String, String> params) {
            StringBuilder sb = new StringBuilder(protocol).append("://").append(uri);
            if (ToolUtil.isNotEmpty(params)) {
                sb.append("?");
                for (Map.Entry map : params.entrySet()) {
                    sb.append(map.getKey())
                            .append("=")
                            .append(map.getValue())
                            .append("&");
                }
                uri = sb.substring(0, sb.length() - 1);
                return uri;
            }
            return sb.toString();
        }
    
        /**
         * get请求、请求参数为?拼接形式的
         * <p>
         * 最终请求的URI如下:
         * <p>
         * http://127.0.0.1:80/?name=张耀烽&sex=男
         *
         * @return
         */
        public String sendGet() {
            Map<String, String> uriMap = new HashMap<>(6);
            uriMap.put("name", "张耀烽");
            uriMap.put("sex", "男");
    
            ResponseEntity responseEntity = restTemplate.getForEntity
                    (
                            generateRequestParameters("http", "127.0.0.1:80", uriMap),
                            String.class
                    );
            return (String) responseEntity.getBody();
        }
    
        /**
         * post请求、请求参数为json
         *
         * @return
         */
        public String sendPost() {
            String uri = "http://127.0.0.1:80";
    
            Map<String, String> jsonMap = new HashMap<>(6);
            jsonMap.put("name", "张耀烽");
            jsonMap.put("sex", "男");
    
            ResponseEntity<String> apiResponse = restTemplate.postForEntity
                    (
                            uri,
                            generatePostJson(jsonMap),
                            String.class
                    );
            return apiResponse.getBody();
        }
    
    }
    
    

    更多完整代码可以去参考我的个人开源项目easy_boot、项目地址easy_boot开源项目

    展开全文
  • HTTP请求的完全过程

    万次阅读 多人点赞 2019-05-27 11:22:45
    HTTP请求的完全过程 1.1 浏览器根据域名解析IP地址 浏览器根据访问的域名找到其IP地址。DNS查找过程如下: 浏览器缓存:首先搜索浏览器自身的DNS缓存(缓存的时间比较短,大概只有1分钟,且只能容纳1000条缓存)...

     HTTP请求的完全过程

    1.1 浏览器根据域名解析IP地址

           浏览器根据访问的域名找到其IP地址。DNS查找过程如下:

    1. 浏览器缓存:首先搜索浏览器自身的DNS缓存(缓存的时间比较短,大概只有1分钟,且只能容纳1000条缓存),看自身的缓存中是否是有域名对应的条目,而且没有过期,如果有且没有过期则解析到此结束。
    2. 系统缓存:如果浏览器自身的缓存里面没有找到对应的条目,那么浏览器会搜索操作系统自身的DNS缓存,如果找到且没有过期则停止搜索解析到此结束。
    3. 路由器缓存:如果系统缓存也没有找到,则会向路由器发送查询请求。
    4. ISP(互联网服务提供商) DNS缓存:如果在路由缓存也没找到,最后要查的就是ISP缓存DNS的服务器。

    1.2 浏览器与WEB服务器建立一个TCP连接

           TCP的3次握手。

    1.3 浏览器给WEB服务器发送一个HTTP请求

           一个HTTP请求报文由请求行(request line)、请求头部(headers)、空行(blank line)和请求数据(request body)4个部分组成。

    1.3.1 请求行

           请求行分为三个部分:请求方法、请求地址URL和HTTP协议版本,它们之间用空格分割。例如,GET /index.html HTTP/1.1。

    1.请求方法

           HTTP/1.1 定义的请求方法有8种:GET(完整请求一个资源)、POST(提交表单)、PUT(上传文件)、DELETE(删除)、PATCH、HEAD(仅请求响应首部)、OPTIONS(返回请求的资源所支持的方法)、TRACE(追求一个资源请求中间所经过的代理)。最常的两种GET和POST,如果是RESTful接口的话一般会用到GET、POST、DELETE、PUT。

    (1)GET

           当客户端要从服务器中读取文档时,当点击网页上的链接或者通过在浏览器的地址栏输入网址来浏览网页的,使用的都是GET方式。GET方法要求服务器将URL定位的资源放在响应报文的数据部分,会送给客户端。使用GET方法时,请求参数和对应的值附加在URL后面,利用一个问号‘?’代表URL的结尾与请求参数的开始,传递参数长度受限制。例如,/index.jsp?id=100&op=bind。通过GET方式传递的数据直接放在地址中,所以GET方式的请求一般不包含“请求内容”部分,请求数据以地址的形式表现在请求行。地址中‘?’之后的部分就是通过GET发送的请求数据,各个数据之间用‘&’符号隔开。显然这种方式不适合传送私密数据。另外,由于不同的浏览器对地址的字符限制也有所不同,一半最多只能识别1024个字符,所以如果需要传送大量数据的时候,也不适合使用GET方式。如果数据是英文字母/数字,原样发送;如果是空格,转换为+;如果是中文/其他字符,则直接把字符串用BASE64加密,得出:%E4%BD%A0%E5%A5%BD,其中%XX中的XX为该符号以16进制表示的ASCII。

    (2)POST

           允许客户端给服务器提供信息较多。POST方法将请求参数封装在HTTP请求数据中,以名称/值的形式出现,可以传输大量数据,这样POST方式对传送的数据大小没有限制,而且也不会显示在URL中。POST方式请求行中不包含数据字符串,这些数据保存在“请求内容”部分,各数据之间也是使用‘&’符号隔开。POST方式大多用于页面的表单中。因为POST也能完成GET的功能,因此多数人在设计表单的时候一律都使用POST方式,其实这是一个误区。GET方式也有自己的特点和优势,我们应该根据不同的情况来选择是使用GET还是使用POST。

    2.URL

           URL:统一资源定位符,是一种资源位置的抽象唯一识别方法。

           组成:<协议>://<主机>:<端口>/<路径>

           端口和路径有事可以省略(HTTP默认端口号是80)

    3.协议版本

           协议版本的格式为:HTTP/主版本号.次版本号,常用的有HTTP/1.0和HTTP/1.1

    1.3.2 请求头部

           请求头部为请求报文添加了一些附加信息,由“名/值”对组成,每行一对,名和值之间使用冒号分隔。

           请求头部的最后会有一个空行,表示请求头部结束,接下来为请求数据。

    1.3.3 请求数据

           请求数据不在GET方法中使用,而在POST方法中使用。POST方法适用于需要客户填写表单的场合。与请求数据相关的最长使用的请求头部是Cntent-Type和Content-Length。下面是一个POST方法的请求报文:

    POST  /index.php HTTP/1.1    请求行

    Host: localhost

    User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:10.0.2) Gecko/20100101 Firefox/10.0.2  请求头

    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8

    Accept-Language: zh-cn,zh;q=0.5

    Accept-Encoding: gzip, deflate

    Connection: keep-alive

    Referer: http://localhost/

    Content-Length:25

    Content-Type:application/x-www-form-urlencoded

      空行

    username=aa&password=1234  请求数据

    1.4 服务器端响应HTTP请求,浏览器得到HTML代码

           HTTP响应报文由状态行(status line)、相应头部(headers)、空行(blank line)和响应数据(response body)4个部分组成。

    1.4.1 状态行

           状态行由3部分组成,分别为:协议版本、状态码、状态码扫描。其中协议版本与请求报文一致,状态码描述是对状态码的简单描述。

    1.4.2 响应头部

    1.4.3 响应数据

           用于存放需要返回给客户端的数据信息。

    HTTP/1.1 200 OK  状态行

    Date: Sun, 17 Mar 2013 08:12:54 GMT  响应头部

    Server: Apache/2.2.8 (Win32) PHP/5.2.5

    X-Powered-By: PHP/5.2.5

    Set-Cookie: PHPSESSID=c0huq7pdkmm5gg6osoe3mgjmm3; path=/

    Expires: Thu, 19 Nov 1981 08:52:00 GMT

    Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0

    Pragma: no-cache

    Content-Length: 4393

    Keep-Alive: timeout=5, max=100

    Connection: Keep-Alive

    Content-Type: text/html; charset=utf-8

      空行

     

    <html>  响应数据

    <head>

    <title>HTTP响应示例<title>

    </head>

    <body>

    Hello HTTP!

    </body>

    </html>

    1.5 浏览器解析HTML代码,并请求HTML代码中的资源

           浏览器拿到HTML文件后,开始解析HTML代码,遇到静态资源时,就向服务器端去请求下载。

    1.6 关闭TCP连接,浏览器对页面进行渲染呈现给用户

           浏览器利用自己内部的工作机制,把请求到的静态资源和HTML代码进行渲染,呈现给用户。

    展开全文
  • http请求头header、请求体body、请求行介绍

    万次阅读 多人点赞 2019-06-09 09:47:54
    服务器的时候,http请求头的所有信息都封装在这个对象中,通过这个对象,可以获取客户端请求的所有信息。http请求包含请求行/状态行、请求头、请求体。 request如果是post才有请求体,get则没有请求体,直接跟在?...
  • RESTClient HTTP请求模拟器

    千次下载 热门讨论 2014-11-14 00:03:38
    RESTClient-全能HTTP请求模拟器-HTTP请求测试工具
  • axios 是如何封装 HTTP 请求

    万次阅读 2019-11-28 17:21:42
    一个功能齐全的 HTTP 请求库可以大大降低我们的开发成本,提高开发效率。 axios 就是这样一个 HTTP 请求库,近年来非常热门。目前,它在 GitHub 上拥有超过 40,000 的 Star,许多权威人士都推荐使用它。 因此,我们...
  • HTTP请求行、请求头、请求体详解

    万次阅读 多人点赞 2018-11-02 11:36:24
    HTTP请求报文解剖  HTTP请求报文由3部分组成(请求行+请求头+请求体):  下面是一个实际的请求报文:  ①是请求方法,GET和POST是最常见的HTTP方法,除此以外还包括DELETE、HEAD、OPTIONS、PUT、TRACE。不过,...
  • HTTP协议不对URI的长度作事先的限制,服务器必须能够处理任何他们提供资源的URI,并且应该能够处理无限长度的URIs,这种无效长度的URL可能会在客户端以基于GET方式的请求时产生。如果服务器不能处理太长的URI的时候...
  • http请求走私(HTTP Request Smuggling)

    万次阅读 2019-10-13 08:46:33
    HTTP请求理论上是独立的实体,但利用http请求走私技术可以突破理论限制,远程攻击者在未经身份验证的情况下,轻松攻击目标网络基础设施。 事故实例 事故名称:Tomcat请求漏洞(Request Smuggling) CVE编码:...
  • 本文涉及两种请求方式,即 get 和 post 。通过java后台设置请求头部 可以根据需求修改或者添加请求头信息。 修改请求头代码 根据不同的请求方式,在main方法中选择调用不同的方法(get/post ) package ...
  • HTTP请求详解含POST,GET实例

    万次阅读 多人点赞 2018-05-05 19:30:34
    前言单纯的copy代码没有用,本篇从http请求的基本原理开始为大家讲解,后边有实例,希望大家一步一步看完,这样无论编写什么请求我们都可以得心应手。HTTP的组成http消息由客户端到服务端的请求以及服务端到客户端的...
  • http协议简析及C++实现HTTP请求

    万次阅读 2018-04-07 21:12:39
    http是超文本传输协议,无状态协议(不同...整个http过程由请求和响应构成,a通常承载与TCP协议上。HTTP完整流程包括四部分:1.客户机与服务器建立连接;2.客户机发送请求给服务器;3.服务器接收到客户端的请求,发...
  • 浏览器发送http请求过程分析

    千次阅读 2019-05-21 11:14:52
    3.建立TCP连接后发起http请求--> 4.服务器响应http请求,浏览器得到html代码--> 5.浏览器解析html代码,并请求html代码中的资源(如js、css、图片等)--> 6.浏览器对页面进行渲染呈现给用户. 下面以...
  • 一个完整的HTTP请求过程详细

    万次阅读 多人点赞 2018-05-29 14:41:54
    一个完整的HTTP请求过程 整个流程 域名解析 —&gt; 与服务器建立连接 —&gt; 发起HTTP请求 —&gt; 服务器响应HTTP请求,浏览器得到html代码 —&gt; 浏览器解析html代码,并请求html代码中的资源...
  • http请求状态码

    千次阅读 2018-07-20 14:56:23
    Http状态码(响应码)用来表明HTTP请求是否已经成功完成.HTTP响应类型一共分五大类:消息响应,成功响应,重定向,客户端错误,服务器端错误. 下表列出了所有Http状态码,以及他们各自所代表的含义. Http状态码 #状态码 ...
  • 发送Get请求,但是请求参数要放在请求body内,所以经过多方查证后整理出来以下代码。 2.POM依赖 <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>...
  • Java使用hutool工具类发送http请求

    万次阅读 2021-05-08 15:18:32
    Java使用hutool工具类发送网络请求 引入jar包 pom.xml添加以下hutool依赖 <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>4.1.2...
  • HTTP请求方式和报文解析

    千次阅读 2018-09-01 17:54:25
    一、概述 ... HTTP请求方式和报文解析 Cookie 和 Session的理解与使用 HTTP Cache缓存机制 封装网络请求 TCP 和 Socket 二、HTTP请求方式 HTTP提供了七种请求方式:GET、POST、DELETE、PUT、H...
  • 一道经典的面试题是从URL在浏览器被输入到页面展现的过程中发生了什么?大多数回答都是请求响应之后DOM是怎么被构建、被绘制...现代浏览器在与服务器建立了一个TCP连接后,是否会在一个HTTP请求完成之后断开?什么情...
  • HTTP请求方式中8种请求方法(简单介绍)

    万次阅读 多人点赞 2018-08-10 13:51:00
    HTTP请求方式中8种请求方法(简单介绍) 简单介绍 HTTP是超文本传输协议,其定义了客户端与服务器端之间文本传输的规范。HTTP默认使用80端口,这个端口指的是服务端的端口,而客户端使用的端口是...
  • http请求 302解决方法

    千次阅读 2020-08-30 15:16:46
    http请求 302解决方法
  • 异步HTTP请求

    千次阅读 2019-04-15 17:45:52
    故,在多用户同时进行导出时,会占满服务器连接,导致新请求阻塞,项目卡死.跟B系统开发反馈会得知,该视图已经优化多次,继续优化空间不大.同时,数据实时性要求较高,无法添加redis缓存.所以提出解决方案如下: 1.为该请求...
  • HTTP请求报文(请求行、请求头、请求体)

    万次阅读 多人点赞 2017-07-07 15:09:43
    HTTP请求报文 HTTP请求报文由3部分组成(请求行+请求头+请求体): 请求行: ①是请求方法,GET和POST是最常见的HTTP方法,除此以外还包括DELETE、HEAD、OPTIONS、PUT、TRACE。 ②为请求对应的URL地址,它和...
  • http请求参数有中文请求报错

    千次阅读 2020-06-09 09:50:21
    请求会拦截参数带有中文及特殊符号的url 需要使用encodeURIComponent来将中文及特殊符号转换为对应的码才能发送
  • 一、HTTP请求报文 HTTP请求报文由3部分组成(请求行+请求头+请求体): 请求行: ①是请求方法,GET和POST是最常见的HTTP方法,除此以外还包括DELETE、HEAD、OPTIONS、PUT、TRACE。 ②为请求对应的URL地址,它和...
  • HTTP请求在线测试工具

    千次阅读 2019-11-26 11:11:39
    参考地址:https://www.tianapi.com/gethttp/47
  • CURL模拟http请求

    万次阅读 2019-01-13 20:05:19
     使用windows的cmd串口进行curl命令模拟http请求时,在springboot上接收的中文参数以及响应回cmd窗口的中文字符会乱码,因为windows系统本身的编码是gbk而springboot默认支持的是utf-8。charset只是指定使用utf-8...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,508,299
精华内容 1,003,319
关键字:

http请求

友情链接: Student_Manage.zip