精华内容
下载资源
问答
  • vue中axios跨域请求

    万次阅读 2019-06-22 13:22:31
    vue中axios跨域请求 1.axios 是 第三方库 使用方法: 使用 npm: $ npm install axios 使用 bower: $ bower install axios 使用 cdn: <script src="https://unpkg.com/axios/dist/axios.min.js"></...

    vue中axios跨域请求

    1.axios 是 第三方库
    使用方法:

    • 使用 npm:
        $ npm install axios
    
    • 使用 bower:
    $ bower install axios
    
    • 使用 cdn:
    <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
    

    axios get 请求示例

    HTML代码
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Document</title>
        <script src="https://cdn.bootcss.com/axios/0.19.0-beta.1/axios.min.js"></script>
        <script src="https://cdn.bootcss.com/vue/2.6.10/vue.js"></script>
    </head>
    <body>
        <div id="app">
            <button @click="getData">get-mock-data</button>
            <button @click="get_api_data"> get-api-data </button>
        </div>
        
    </body>
    </html>
    

    js代码

    <script>
              console.log( axios )
            // 当我们引入axios cdn后会全局暴露出一个axios对象
            new Vue ({
                el:"#app",
                methods:{
                    
                      getData(){
                        // var p = axios({
                        //     url:'./data/name.json'
                        // });
                        // console.log(p);//axios是一个promise对象
    
                        axios({
                            url:"./data/name.json",
                            method:'get',//method默认是get请求
                        }).then(function(res){
                            console.log(res)
                            // axios会对我们请求来的结果进行再一次的封装( 让安全性提高 )
                        }).catch(err=>{
                            console.log(err)
                        })
    
                    },
    

    请求结果 : axios会对我们请求来的结果进行再一次的封装( 让安全性提高 )
    在这里插入图片描述

     //get在线跨域请求
                   get_api_data(){
                      axios({
                          url:'https://请求地址',//在线跨域请求
                          method:"GET",//默认是get请求
                          headers:{//设置请求头
                              'X-Client-Info':' {"a":"3000","ch":"1002","v":"5.0.4","e":"15611234619393093477584"}',
                              'X-Host': 'mall.film-ticket.film.list',
                          },
                          params:{//?search后面的值写在params中
                              cityId: 330100,
                              pageNum: 1,
                              pageSize: 10,
                              type: 1,
                              k: 3969168,
                          }
                      }).then(function(val){
                          console.log(val) // axios会对我们请求来的结果进行再一次的封装( 让安全性提高 )
                      }).catch(function(err){
                          console.log(err)
                      })
                  },
              }
          })
      </script>
    

    get跨域请求中params:中的值对应hearders中Query String Parameters
    在这里插入图片描述
    在这里插入图片描述
    get方法总结:

    A: 无参数
            axios.get(url).then(res=>console.log(res).catch(error=>conosle.log(error))
     B: 有参数
            axios({
                url: 'http://xxx',
                method: 'get' //默认就是get,这个可以省略,
                params: {
                    key: value
                }
            })
    

    axios post 请求示例

    html代码
     <button  @click="postData"> post-data </button>
     
     js代码
           postData(){
                        let params = new URLSearchParams()//得到params对象,用来接收请求参数
                        // params.append( key, value )  key是参数名,value是参数值
                        //传递参数值
                         params.append( 'a', 2 )
                         params.append( 'b', 2 )
    
                        axios({
                            url:'http//localhost/php',
                            method:'post',
                            headers:{//请求头设置为表单提交的请求头
                                'Content-Type':"application/x-www-form-urlencoded"
                            },
                            data:params,
                        }).then( function (val) {
                            console.log(res)
                        }).catch( function (error) { 
                            console.log(error)
                        })
                    }
                }
                官方文档中axios post请求案例有点问题,请求会出现跨域问题;
    			以上示例为解决官方文档存在问题的写法;
    

    post方法总结

    //对于post请求可以统一设置一个请求头,后面所有post请求就可以不用单独设置请求头了
    axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
    
     // 具体语法
     let params = new URLSearchParams()//得到params对象,用来接收请求参数
    
    // params.append(key,value) //请求参数写成键值对key就是参数名,value就是参数值
    
    params.append('a',1)
    params.append('b',2)
    
    axios({
        url: 'http://localhost/post.php',
        method: 'post',
        data: params,//将请求参数写入data;
          headers: {  //单个请求设置请求头
           'Content-Type': "application/x-www-form-urlencoded"
        }
    })
    .then(res => {
        console.log( res )
    })
    .catch( error => {
        if( error ){
        throw error
    }
    })
    
    展开全文
  • Python爬虫基础-01-带有请求参数的爬虫

    万次阅读 多人点赞 2018-06-06 19:06:23
    在上一篇文章Python爬虫入门中,Python爬虫程序爬取了指定网页的信息,爬虫发出的请求是一个固定的URL和部分请求信息,并没有请求参数,但是爬虫工作过程中发出的请求一般都需要加上请求参数,以完成对指定内容的...

    在上一篇文章Python爬虫入门中,Python爬虫程序爬取了指定网页的信息,爬虫发出的请求是一个固定的URL和部分请求信息,并没有请求参数,但是爬虫工作过程中发出的请求一般都需要加上请求参数,以完成对指定内容的爬取

    HTTP请求分为POST请求和GET请求,在Python爬虫中,这两种请求因其结构不同,所以添加请求参数的方式也不同,下面将分别介绍使用POST请求和GET请求的Python爬虫

    GET请求

    使用GET请求的Python爬虫比较简单,由于GET请求的请求参数包含在URL地址中,所以只需要先确定请求参数,然后将请求参数拼接到URL中即可,即 URL + 请求参数(字符串拼接)

    使用GET请求的Python爬虫案例

    首先,一个使用GET请求访问网页的例子。如下图所示,使用百度,以“爬虫”为关键字进行查询,可以看到,地址栏的URL为:https://www.baidu.com/s?word=爬虫。我们可以使用这个URL地址利用爬虫爬取该网页
    这里写图片描述
    我们写一个可以使用和上面一样的GET请求的Python爬虫程序,需要用到urlllib2包

    # coding=utf-8
    
    import urllib2
    
    url = "http://www.baidu.com/s"
    word = {"wd":"爬虫"}
    # url首个分隔符是 ?
    newurl = url + "?" + word     
    
    # 添加User-Agent,完善请求信息
    headers={ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"}
    
    request = urllib2.Request(newurl, headers=headers)
    
    response = urllib2.urlopen(request)
    
    print response.read()

    程序写好后,直接运行会报错,这是因为请求参数需要进行编码转换,在使用浏览器访问时,这个转换是浏览器自动完成的。但是在Python爬虫程序中,这一步就需要程序员自己来完成了。编码转换需要使用urllib包

    # coding=utf-8
    
    import urllib      #负责url编码处理
    import urllib2
    
    url = "http://www.baidu.com/s"
    word = {"wd":"爬虫"}
    # 将请求参数转换成url编码格式(字符串)
    word = urllib.urlencode(word) 
    # url首个分隔符是 ?
    newurl = url + "?" + word     
    
    # 添加User-Agent,完善请求信息
    headers={ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"}
    
    request = urllib2.Request(newurl, headers=headers)
    
    response = urllib2.urlopen(request)
    
    print response.read()

    运行程序,控制台打印的信息如下,爬取成功
    这里写图片描述

    使用GET请求的Python爬虫的应用

    在使用Python爬虫爬取一个有分页的网站时,各个页面的URL非常接近,唯一的不同就是页码数字不同,这是使用GET请求能非常简单方便的将该网站的各个页面爬取下来
    这里写图片描述
    如下图,Python吧的第一页的URL地址:http://tieba.baidu.com/f?kw=python&ie=utf-8&pn=0
    第二页的URL地址:http://tieba.baidu.com/f?kw=python&ie=utf-8&pn=50
    第三页的URL地址:http://tieba.baidu.com/f?kw=python&ie=utf-8&pn=100
    可以看出URL中只有pn参数在变化,它控制着到底访问该吧的那一页,发现了这个规律后,就可以通过一个循环,切换URL地址中的参数从而将整个贴吧中所有页面的内容都爬取下来
    这里写图片描述

    # coding=utf-8
    
    import urllib     
    import urllib2
    
    url = "http://tieba.baidu.com/f?kw=python&ie=utf-8&pn="
    
    i = 0
    while i<1000:
        i = i +50
    
        newurl = url + i   
    
        # 添加User-Agent,完善请求信息
        headers={ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"}
    
        request = urllib2.Request(newurl, headers=headers)
    
        response = urllib2.urlopen(request)
    
        print response.read()
    

    POST请求

    GET请求的请求参数是直接包含在URL中了,而POST请求的请求参数则不会出现在URL中,而是要经过单独的封装处理。所以,如果爬虫需要使用POST请求,就不能直接通过 URL + 请求参数 字符串拼接这种简单粗暴的方式了

    使用POST请求的Python爬虫案例

    访问百度贴吧的请求是GET类型的,而访问有道翻译的请求则是POST类型的。如下图所示,输入我在学习,点击翻译,地址栏中的URL没有变化,说明点击翻译后发送的请求是POST类型的,即无法再URL中看到参数
    这里写图片描述
    下面就是使用POST请求的Python爬虫程序,通过一个formdata 字典作为参数,当调用urllib2.Request类时,使用三个参数,即urllib2.Request(url, data = data, headers = headers),Python爬虫发送POST请求,使用两个参数urllib2.Request(newurl, headers=headers),Python爬虫发送GET请求

    # coding=utf-8
    
    import urllib
    import urllib2
    
    # POST请求的目标URL
    url = "http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=null"
    
    # 添加User-Agent,完善请求信息
    headers={ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"}
    
    formdata = {
        "type":"AUTO",
        "i":"i love python",
        "doctype":"json",
        "xmlVersion":"1.8",
        "keyfrom":"fanyi.web",
        "ue":"UTF-8",
        "action":"FY_BY_ENTER",
        "typoResult":"true"
    }
    
    data = urllib.urlencode(formdata)
    
    request = urllib2.Request(url, data = data, headers = headers)
    response = urllib2.urlopen(request)
    print response.read()
    展开全文
  • HttpServletRequest对象概述 ...由于HTTP请求消息分为请求行、请求消息头和请求消息体三部分,因此,在HttpServletRequest接口中定义了获取请求行、请求头和请求消息体的相关方法。 我们在创建Servlet时会覆盖serv...

    HttpServletRequest对象概述

    在Servlet API中,定义了一个HttpServletRequest接口,它继承自ServletReauest接口,专门用来封装HTTP请求消息。由于HTTP请求消息分为请求行、请求消息头和请求消息体三部分,因此,在HttpServletRequest接口中定义了获取请求行、请求头和请求消息体的相关方法。

    我们在创建Servlet时会覆盖service()方法,或doGet()/doPost(),这些方法都有两个参数,一个为代表请求的request和代表响应response。
    service方法中的request的类型是ServletRequest,而doGet/doPost方法的request的类型是HttpServletRequest,HttpServletRequest是ServletRequest的子接口,功能和方法更加强大,今天我们学习HttpServletRequest。

    request的运行流程

    在这里插入图片描述

    通过抓包工具抓取HTTP请求

    在这里插入图片描述

    通过request获得请求行信息

    当访问Servlet时,会在请求消息的请求行中,包含请求方法、请求资源名、请求路径等信息,为了获取这些信息,在HTTPServletRequest接口中,定义了一系列用于获取请求行的方法,如下表:

    方法声明功能描述
    String g e t M e t h o d \color{red}{getMethod} getMethod该方法用于获取HTTP请求消息中的请求方式(如GET、POST等)
    String getReauestURI()该方法用于获取请求行中资源名称部分,即位于URL的主机和端口之后、参数部分之前的部分
    String getQueryString()该方法用于获取请求行中的参数部分,也就是资源路径后面问号以后的所有内容
    String getProtocol()该方法用于获取请求行中的协议名和版本,例如,HTTP/1.0 或 HTTP/1.1
    String g e t C o n t e x t P a t h ( ) \color{red}{getContextPath()} getContextPath()该方法用于获取请求URL中属于WEB应用程序的路径,这个路径以"/"开头,表示相对于整个WEB站点的根目录,路几个结尾不含“/”。如果请求URL属于web站点的根目录,那么返回结果为空字符串“”
    String getServletPath()该方法用于获取Servlet的名称或Servlet所映射的路径
    String g e t R e m o t e A d d r ( ) \color{red}{getRemoteAddr()} getRemoteAddr()该方法用于获取请求客户端的IP地址,其格式类似于"192.168.0.1"
    String getRemoteHost()该方法用于获取请求客户端的完整主机名,其格式类似于"pc1.xxxx.cn"。需要注意的是,如果无法解析出客户机的完整主机名,该方法会返回客户端的IP地址
    int getRemotePort()该方法用于获取请求客户端网络连接的端口号
    String getLocalAddr()该方法用于获取Web服务器上接收当前请求网络连接的IP地址
    String getLocalName()该方法用于获取Web服务器上接收当前网络连接IP所对应的主机名
    int getLocalPort()该方法用于获取Web服务器上接收当前网络连接的端口号
    String getServerName()该方法用于获取当前请求所指向的主机名,即HTTP请求消息中HOST头字段所对应的主机名部分
    int getServerPort()该方法用于获取当前请求所连接的服务器端口号,即如果HTTP请求消息中HOST头字段所对应的端口号部分
    String getScheme()该方法用于获取请求的协议名,例如http、https或ftp
    StringBuffer getRequestURL()该方法用于获取客户端发出请求时的完整URL,包括协议、服务器名、端口号、资源路径等信息,但不包括后面的查询参数部分。注意,getRequestRUL()方法返回的时StringBuffer类型,而不是String类型。

    示例:

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            response.setContentType("text/html;charset=utf-8");
            PrintWriter out = response.getWriter();
            //获取请求行的相关信息
            out.println("getMethod:" + request.getMethod() + "<br/>");
            out.println("getQueryString:" + request.getQueryString() + "<br/>");
            out.println("getProtocol:" + request.getProtocol() + "<br/>");
            out.println("getContextPath" + request.getContextPath() + "<br/>");
            out.println("getPathInfo:" + request.getPathInfo() + "<br/>");
            out.println("getPathTranslated:" + request.getPathTranslated() + "<br/>");
            out.println("getServletPath:" + request.getServletPath() + "<br/>");
            out.println("getRemoteAddr:" + request.getRemoteAddr() + "<br/>");
            out.println("getRemoteHost:" + request.getRemoteHost() + "<br/>");
            out.println("getRemotePort:" + request.getRemotePort() + "<br/>");
            out.println("getLocalAddr:" + request.getLocalAddr() + "<br/>");
            out.println("getLocalName:" + request.getLocalName() + "<br/>");
            out.println("getLocalPort:" + request.getLocalPort() + "<br/>");
            out.println("getServerName:" + request.getServerName() + "<br/>");
            out.println("getServerPort:" + request.getServerPort() + "<br/>");
            out.println("getScheme:" + request.getScheme() + "<br/>");
            out.println("getRequestURL:" + request.getRequestURL() + "<br/>");
        }
    

    通过浏览器访问,页面显示:
    在这里插入图片描述

    通过request获得请求头

    当请求Servlet时,需要通过请求头向服务器传递附加信息,例如,客户端可以接收的数据类型,压缩方式,语言等。为此,在HttpServletRequest接口中,定义了一系列用于获取HTTP请求头字段的方法,如下表:

    方法声明功能描述
    String getHeader(String name)该方法用于获取一个指定头字段的值,如果请求消息中没有包含指定的头字段,getHeader()方法返回null;如果请求消息中包含有多个指定名称的头字段,getHeader()方法返回其中第一个头字段的值
    Enumeration getHeaders(String name)该方法返回一个Enumeration集合对象,该集合对象由请求消息中出现的某个指定名称的所有头字段值组成。在多数情况下,一个头字段名在请求消息中只出现一次,但有时候可能会出现多次
    Enumeration getheaderNames()该方法用于获取一个包含所有请求头字段的Enumeration对象
    int getIntHeader(String name)该方法用于获取指定名称的头字段,并且将其值转换为int类型。需要注意的是,如果指定名称的头字段不存在,返回值为-1;如果获取到的头字段的值不能转为int类型,将发生NumberFormatException异常
    Long getDateHeader(String name)该方法用于获取指定头字段的值,并将其按GMT时间格式转换成一个代表日期/时间的长整数,这个长整数是自1970年1月1日0点0分0秒算起的以毫秒为单位的时间值
    String getContentType()该方法用于获取Content-Type头字段的值,结果为String类型
    int getContentLength()该方法用于获取Content-Length头字段的值,结果为int类型
    String getCharacterEncoding()该方法用于返回请求消息的实体部分的字符集编码,通常是从Content-Type头字段中进行提取,结果为String类型

    示例:

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            response.setContentType("text/html;charset=utf-8");
            PrintWriter out = response.getWriter();
            //获取请求头信息
            Enumeration headerNames = request.getHeaderNames();
            //使用循环遍历请求头,并通过getHeader()方法获取一个指定名称的头字段
            while (headerNames.hasMoreElements()){
                String headerName = (String) headerNames.nextElement();
                out.println(headerName + " : " + request.getHeader(headerName) + "<br/>");
            }
        }
    

    通过浏览器访问,页面显示:
    在这里插入图片描述

    通过request获得请求体(请求参数)

    在实际开发中,经常需要获取用户提交的表单数据,例如,用户名,密码、电子邮件等,为了方便获取表单中的请求参数,在HttpServletRequest接口总,定义了一些列获取请求参数的方法,如下表所示:

    方法声明功能描述
    String getParameter(String name)该方法用于获取某个指定名称的参数值,如果请求消息中没有包含指定名称的参数,getParameter()方法返回null;如果指定名称的参数存在但没有设置值,则返回一个空串;如果请求消息中包含有多个该指定名称的参数,getParameter()方法返回第一个出现的参数值
    String[] getParameterValues(String name)HTTP请求消息中可以有多个相同名称的参数(通常由一个包含有多个同名的字段元素的FORM表单生成),如果要获得HTTP请求消息中的同一个参数名所对应的所有参数值,那么就应该使用getParameterValues()方法,该方法用于返回一个String类型的数组
    Enumeration getParameterNames()该方法用于返回一个包含请求消息中所有参数名的Enumeration对象,在此基础上,可以对请求消息中的所有参数进行遍历处理
    Map getParameterMap()个体Parameter Map()方法用于将请求消息中的所有参数名和值装入进一个Map对象中返回

    示例:
    创建一个带有表单的jsp页面:

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>表单</title>
    </head>
    <body>
        <form action="/JavaEEDemo/request" method="post">
            用户名:<input type="text" name="username"><br/>&nbsp;&nbsp;码:<input type="password" name="password"><br/>&nbsp;&nbsp;好:
            <input type="checkbox" name="hobby" value="sing">唱歌
            <input type="checkbox" name="hobby" value="dance">跳舞
            <input type="checkbox" name="hobby" value="football">足球
            <input type="submit" value="提交">
    
        </form>
    </body>
    </html>
    

    编写Servlet的doPost方法:

    	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            String username = request.getParameter("username");
            String password = request.getParameter("password");
            System.out.println("用户名:" + username);
            System.out.println("密码:" + password);
    
            //获取参数名为hobby的值
            String[] hobbys = request.getParameterValues("hobby");
            System.out.println("爱好:");
            for (int i = 0; i < hobbys.length; i++) {
                System.out.println(hobbys[i] + ", ");
            }
        }
    

    通过浏览器访问jsp页面:
    在这里插入图片描述
    点击提交后,控制条输出:

    用户名:zhangsan
    密码:123456
    爱好:
    sing, 
    dance, 
    football, 
    
    展开全文
  • HTTP请求行、请求头、请求体详解

    万次阅读 多人点赞 2018-11-02 11:36:24
    下面是一个实际的请求报文:  ①是请求方法,GET和POST是最常见的HTTP方法,除此以外还包括DELETE、HEAD、OPTIONS、PUT、TRACE。不过,当前的大多数浏览器只支持GET和POST,Spring 3.0提供了一个...

     

    HTTP请求报文解剖 

    HTTP请求报文由3部分组成(请求行+请求头+请求体): 

     

    下面是一个实际的请求报文: 

     

    ①是请求方法,GET和POST是最常见的HTTP方法,除此以外还包括DELETE、HEAD、OPTIONS、PUT、TRACE。不过,当前的大多数浏览器只支持GET和POST,Spring 3.0提供了一个HiddenHttpMethodFilter,允许你通过“_method”的表单参数指定这些特殊的HTTP方法(实际上还是通过POST提交表单)。服务端配置了HiddenHttpMethodFilter后,Spring会根据_method参数指定的值模拟出相应的HTTP方法,这样,就可以使用这些HTTP方法对处理方法进行映射了。 

    ②为请求对应的URL地址,它和报文头的Host属性组成完整的请求URL,③是协议名称及版本号。 

    ④是HTTP的报文头,报文头包含若干个属性,格式为“属性名:属性值”,服务端据此获取客户端的信息。 

    ⑤是报文体,它将一个页面表单中的组件值通过param1=value1&param2=value2的键值对形式编码成一个格式化串,它承载多个请求参数的数据。不但报文体可以传递请求参数,请求URL也可以通过类似于“/chapter15/user.html? param1=value1&param2=value2”的方式传递请求参数。 

    对照上面的请求报文,我们把它进一步分解,你可以看到一幅更详细的结构图: 

     

     

    引用

    HttpWatch是强大的网页数据分析工具,安装后将集成到Internet Explorer工具栏中。它不用代理服务器或一些复杂的网络监控工具,就能抓取请求及响应的完整信息,包括Cookies、消息头、查询参数、响应报文等,是Web应用开发人员的必备工具。



    HTTP请求报文头属性 

    报文头属性是什么东西呢?我们不妨以一个小故事来说明吧。 
     

    引用

    快到中午了,张三丰不想去食堂吃饭,于是打电话叫外卖:老板,我要一份[鱼香肉丝],要12:30之前给我送过来哦,我在江湖湖公司研发部,叫张三丰。



    这里,你要[鱼香肉丝]相当于HTTP报文体,而“12:30之前送过来”,你叫“张三丰”等信息就相当于HTTP的报文头。它们是一些附属信息,帮忙你和饭店老板顺利完成这次交易。 

    请求HTTP报文和响应HTTP报文都拥有若干个报文关属性,它们是为协助客户端及服务端交易的一些附属信息。 


    常见的HTTP请求报文头属性 

    Accept 

    请求报文可通过一个“Accept”报文头属性告诉服务端 客户端接受什么类型的响应。 

    如下报文头相当于告诉服务端,俺客户端能够接受的响应类型仅为纯文本数据啊,你丫别发其它什么图片啊,视频啊过来,那样我会歇菜的~~~: 
     

    Java代码  收藏代码

    1. Accept:text/plain  



    Accept属性的值可以为一个或多个MIME类型的值,关于MIME类型,大家请参考:http://en.wikipedia.org/wiki/MIME_type 

    Cookie 

    客户端的Cookie就是通过这个报文头属性传给服务端的哦!如下所示: 

    Java代码  收藏代码

    1. Cookie: $Version=1; Skin=new;jsessionid=5F4771183629C9834F8382E23BE13C4C  


    服务端是怎么知道客户端的多个请求是隶属于一个Session呢?注意到后台的那个jsessionid=5F4771183629C9834F8382E23BE13C4C木有?原来就是通过HTTP请求报文头的Cookie属性的jsessionid的值关联起来的!(当然也可以通过重写URL的方式将会话ID附带在每个URL的后面哦)。 


    Referer 

    表示这个请求是从哪个URL过来的,假如你通过google搜索出一个商家的广告页面,你对这个广告页面感兴趣,鼠标一点发送一个请求报文到商家的网站,这个请求报文的Referer报文头属性值就是http://www.google.com。 

    引用


    唐僧到了西天. 
    如来问:侬是不是从东土大唐来啊? 
    唐僧:厉害!你咋知道的! 
    如来:呵呵,我偷看了你的Referer... 



    很多貌似神奇的网页监控软件(如著名的 我要啦),只要在你的网页上放上一段JavaScript,就可以帮你监控流量,全国访问客户的分布情况等报表和图表,其原理就是通过这个Referer及其它一些HTTP报文头工作的。 

    Cache-Control 

    对缓存进行控制,如一个请求希望响应返回的内容在客户端要被缓存一年,或不希望被缓存就可以通过这个报文头达到目的。 

    如以下设置,相当于让服务端将对应请求返回的响应内容不要在客户端缓存: 

    Java代码  收藏代码

    1. Cache-Control: no-cache  



    其它请求报文头属性 

    参见:http://en.wikipedia.org/wiki/List_of_HTTP_header_fields 

    如何访问请求报文头 

    由于请求报文头是客户端发过来的,服务端当然只能读取了,以下是HttpServletRequest一些用于读取请求报文头的API: 
     

    Java代码  收藏代码

    1. //获取请求报文中的属性名称  
    2. java.util.Enumeration<java.lang.String>   getHeaderNames();  
    3.   
    4. //获取指定名称的报文头属性的值  
    5. java.lang.String getHeader(java.lang.String name)   



    由于一些请求报文头属性“太著名”了,因此HttpServletRequest为它们提供了VIP的API: 
     

    Java代码  收藏代码

    1. //获取报文头中的Cookie(读取Cookie的报文头属性)  
    2.  Cookie[]   getCookies() ;  
    3.   
    4. //获取客户端本地化信息(读取 Accept-Language 的报文头属性)  
    5. java.util.Locale    getLocale()   
    6.   
    7. //获取请求报文体的长度(读取Content-Length的报文头属性)  
    8. int getContentLength();  



    HttpServletRequest可以通过 

    Java代码  收藏代码

    1. HttpSession getSession()   


    获取请求所关联的HttpSession,其内部的机理是通过读取请求报文头中Cookie属性的JSESSIONID的值,在服务端的一个会话Map中,根据这个JSESSIONID获取对应的HttpSession的对象。(这样,你就不会觉得HttpSession很神秘了吧,你自己也可以做一个类似的会话管理  ) 

    HTTP响应报文解剖 

    响应报文结构 

    HTTP的响应报文也由三部分组成(响应行+响应头+响应体): 

     

    以下是一个实际的HTTP响应报文: 

     

    ①报文协议及版本; 
    ②状态码及状态描述; 
    ③响应报文头,也是由多个属性组成; 
    ④响应报文体,即我们真正要的“干货”。 

    响应状态码 

    和请求报文相比,响应报文多了一个“响应状态码”,它以“清晰明确”的语言告诉客户端本次请求的处理结果。 

    HTTP的响应状态码由5段组成: 
     

    • 1xx 消息,一般是告诉客户端,请求已经收到了,正在处理,别急...
    • 2xx 处理成功,一般表示:请求收悉、我明白你要的、请求已受理、已经处理完成等信息.
    • 3xx 重定向到其它地方。它让客户端再发起一个请求以完成整个处理。
    • 4xx 处理发生错误,责任在客户端,如客户端的请求一个不存在的资源,客户端未被授权,禁止访问等。
    • 5xx 处理发生错误,责任在服务端,如服务端抛出异常,路由出错,HTTP版本不支持等。



    以下是几个常见的状态码: 

    200 OK 

    你最希望看到的,即处理成功! 

    303 See Other 

    我把你redirect到其它的页面,目标的URL通过响应报文头的Location告诉你。 

    引用

    悟空:师傅给个桃吧,走了一天了 
    唐僧:我哪有桃啊!去王母娘娘那找吧



    304 Not Modified 

    告诉客户端,你请求的这个资源至你上次取得后,并没有更改,你直接用你本地的缓存吧,我很忙哦,你能不能少来烦我啊! 

    404 Not Found 

    你最不希望看到的,即找不到页面。如你在google上找到一个页面,点击这个链接返回404,表示这个页面已经被网站删除了,google那边的记录只是美好的回忆。 

    500 Internal Server Error 

    看到这个错误,你就应该查查服务端的日志了,肯定抛出了一堆异常,别睡了,起来改BUG去吧! 


    其它的状态码参见:http://en.wikipedia.org/wiki/List_of_HTTP_status_codes 


    有些响应码,Web应用服务器会自动给生成。你可以通过HttpServletResponse的API设置状态码: 
     

    Java代码  收藏代码

    1. //设置状态码,状态码在HttpServletResponse中通过一系列的常量预定义了,如SC_ACCEPTED,SC_OK  
    2. void    setStatus(int sc)   



    常见的HTTP响应报文头属性 

    Cache-Control 

    响应输出到客户端后,服务端通过该报文头属告诉客户端如何控制响应内容的缓存。 

    下面,的设置让客户端对响应内容缓存3600秒,也即在3600秒内,如果客户再次访问该资源,直接从客户端的缓存中返回内容给客户,不要再从服务端获取(当然,这个功能是靠客户端实现的,服务端只是通过这个属性提示客户端“应该这么做”,做不做,还是决定于客户端,如果是自己宣称支持HTTP的客户端,则就应该这样实现)。 
     

    Java代码  收藏代码

    1. Cache-Control: max-age=3600  



    ETag 

    一个代表响应服务端资源(如页面)版本的报文头属性,如果某个服务端资源发生变化了,这个ETag就会相应发生变化。它是Cache-Control的有益补充,可以让客户端“更智能”地处理什么时候要从服务端取资源,什么时候可以直接从缓存中返回响应。 

    关于ETag的说明,你可以参见:http://en.wikipedia.org/wiki/HTTP_ETag。 
    Spring 3.0还专门为此提供了一个org.springframework.web.filter.ShallowEtagHeaderFilter(实现原理很简单,对JSP输出的内容MD5,这样内容有变化ETag就相应变化了),用于生成响应的ETag,因为这东东确实可以帮助减少请求和响应的交互。 

    下面是一个ETag: 

    Java代码  收藏代码

    1. ETag: "737060cd8c284d8af7ad3082f209582d"  



    Location 

    我们在JSP中让页面Redirect到一个某个A页面中,其实是让客户端再发一个请求到A页面,这个需要Redirect到的A页面的URL,其实就是通过响应报文头的Location属性告知客户端的,如下的报文头属性,将使客户端redirect到iteye的首页中: 
     

    Java代码  收藏代码

    1. Location: http://www.iteye.com  



    Set-Cookie 

    服务端可以设置客户端的Cookie,其原理就是通过这个响应报文头属性实现的: 
     

    Java代码  收藏代码

    1. Set-Cookie: UserID=JohnDoe; Max-Age=3600; Version=1  




    其它HTTP响应报文头属性 

    更多其它的HTTP响应头报文,参见:http://en.wikipedia.org/wiki/List_of_HTTP_header_fields 


    如何写HTTP请求报文头 

    在服务端可以通过HttpServletResponse的API写响应报文头的属性: 
     

    Java代码  收藏代码

    1. //添加一个响应报文头属性  
    2. void    setHeader(String name, String value)   



    象Cookie,Location这些响应都是有福之人,HttpServletResponse为它们都提供了VIP版的API: 

    Java代码  收藏代码

    1. //添加Cookie报文头属性  
    2. void addCookie(Cookie cookie)   
    3.   
    4. //不但会设置Location的响应报文头,还会生成303的状态码呢,两者天仙配呢  
    5. void    sendRedirect(String location)   

     

    HTTP简介

    HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。。
    HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。

    HTTP工作原理

    HTTP三点注意事项:

    • HTTP是无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
    • HTTP是媒体独立的:这意味着,只要客户端和服务器知道如何处理的数据内容,任何类型的数据都可以通过HTTP发送。客户端以及服务器指定使用适合的MIME-type内容类型。
    • HTTP是无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

     

    HTTP消息结构

    HTTP请求消息

    一个HTTP请求报文由请求行(request line)、请求头(header)、空行和请求数据4个部分组成,下图给出了请求报文的一般格式。

     

    1.请求行

    请求行由请求方法字段、URL字段和HTTP协议版本字段3个字段组成,它们用空格分隔。例如,GET /index.html HTTP/1.1。

    根据HTTP标准,HTTP请求可以使用多种请求方法。
    HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法。
    HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。

     

    而常见的有如下几种:

    1).GET

    最常见的一种请求方式,当客户端要从服务器中读取文档时,当点击网页上的链接或者通过在浏览器的地址栏输入网址来浏览网页的,使用的都是GET方式。GET方法要求服务器将URL定位的资源放在响应报文的数据部分,回送给客户端。使用GET方法时,请求参数和对应的值附加在URL后面,利用一个问号(“?”)代表URL的结尾与请求参数的开始,传递参数长度受限制。例如,/index.jsp?id=100&op=bind,这样通过GET方式传递的数据直接表示在地址中,所以我们可以把请求结果以链接的形式发送给好友。以用google搜索domety为例,Request格式如下:

    [html] view plain copy

    1. GET /search?hl=zh-CN&source=hp&q=domety&aq=f&oq= HTTP/1.1    
    2. Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint,   
    3. application/msword, application/x-silverlight, application/x-shockwave-flash, */*    
    4. Referer: <a href=“http://www.google.cn/”>http://www.google.cn/</a>    
    5. Accept-Language: zh-cn    
    6. Accept-Encoding: gzip, deflate    
    7. User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; TheWorld)    
    8. Host: <a href=“http://www.google.cn”>www.google.cn</a>    
    9. Connection: Keep-Alive    
    10. Cookie: PREF=ID=80a06da87be9ae3c:U=f7167333e2c3b714:NW=1:TM=1261551909:LM=1261551917:S=ybYcq2wpfefs4V9g;   
    11. NID=31=ojj8d-IygaEtSxLgaJmqSjVhCspkviJrB6omjamNrSm8lZhKy_yMfO2M4QMRKcH1g0iQv9u-2hfBW7bUFwVh7pGaRUb0RnHcJU37y-  
    12. FxlRugatx63JLv7CWMD6UB_O_r   
    GET /search?hl=zh-CN&source=hp&q=domety&aq=f&oq= HTTP/1.1  
    Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, 
    application/msword, application/x-silverlight, application/x-shockwave-flash, */*  
    Referer: <a href="http://www.google.cn/">http://www.google.cn/</a>  
    Accept-Language: zh-cn  
    Accept-Encoding: gzip, deflate  
    User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; TheWorld)  
    Host: <a href="http://www.google.cn">www.google.cn</a>  
    Connection: Keep-Alive  
    Cookie: PREF=ID=80a06da87be9ae3c:U=f7167333e2c3b714:NW=1:TM=1261551909:LM=1261551917:S=ybYcq2wpfefs4V9g; 
    NID=31=ojj8d-IygaEtSxLgaJmqSjVhCspkviJrB6omjamNrSm8lZhKy_yMfO2M4QMRKcH1g0iQv9u-2hfBW7bUFwVh7pGaRUb0RnHcJU37y-
    FxlRugatx63JLv7CWMD6UB_O_r 
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    可以看到,GET方式的请求一般不包含”请求内容”部分,请求数据以地址的形式表现在请求行。地址链接如下:

    [html] view plain copy

    1. <a href=“http://www.google.cn/search?hl=zh-CN&source=hp&q=domety&aq=f&oq=”>http://www.google.cn/search?hl=zh-CN&source=hp  
    2. &q=domety&aq=f&oq=</a>  
    <a href="http://www.google.cn/search?hl=zh-CN&source=hp&q=domety&aq=f&oq=">http://www.google.cn/search?hl=zh-CN&source=hp
    &q=domety&aq=f&oq=</a>
    • 1

    地址中”?”之后的部分就是通过GET发送的请求数据,我们可以在地址栏中清楚的看到,各个数据之间用”&”符号隔开。显然,这种方式不适合传送私密数据。另外,由于不同的浏览器对地址的字符限制也有所不同,一般最多只能识别1024个字符,所以如果需要传送大量数据的时候,也不适合使用GET方式。

    2).POST

    对于上面提到的不适合使用GET方式的情况,可以考虑使用POST方式,因为使用POST方法可以允许客户端给服务器提供信息较多。POST方法将请求参数封装在HTTP请求数据中,以名称/值的形式出现,可以传输大量数据,这样POST方式对传送的数据大小没有限制,而且也不会显示在URL中。还以上面的搜索domety为例,如果使用POST方式的话,格式如下:

    [html] view plain copy

    1. POST /search HTTP/1.1    
    2. Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint,   
    3. application/msword, application/x-silverlight, application/x-shockwave-flash, */*    
    4. Referer: <a href=“http://www.google.cn/”>http://www.google.cn/</a>    
    5. Accept-Language: zh-cn    
    6. Accept-Encoding: gzip, deflate    
    7. User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; TheWorld)    
    8. Host: <a href=“http://www.google.cn”>www.google.cn</a>    
    9. Connection: Keep-Alive    
    10. Cookie: PREF=ID=80a06da87be9ae3c:U=f7167333e2c3b714:NW=1:TM=1261551909:LM=1261551917:S=ybYcq2wpfefs4V9g;   
    11. NID=31=ojj8d-IygaEtSxLgaJmqSjVhCspkviJrB6omjamNrSm8lZhKy_yMfO2M4QMRKcH1g0iQv9u-2hfBW7bUFwVh7pGaRUb0RnHcJU37y-  
    12. FxlRugatx63JLv7CWMD6UB_O_r    
    13.   
    14. hl=zh-CN&source=hp&q=domety  
    POST /search HTTP/1.1  
    Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, 
    application/msword, application/x-silverlight, application/x-shockwave-flash, */*  
    Referer: <a href="http://www.google.cn/">http://www.google.cn/</a>  
    Accept-Language: zh-cn  
    Accept-Encoding: gzip, deflate  
    User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; TheWorld)  
    Host: <a href="http://www.google.cn">www.google.cn</a>  
    Connection: Keep-Alive  
    Cookie: PREF=ID=80a06da87be9ae3c:U=f7167333e2c3b714:NW=1:TM=1261551909:LM=1261551917:S=ybYcq2wpfefs4V9g; 
    NID=31=ojj8d-IygaEtSxLgaJmqSjVhCspkviJrB6omjamNrSm8lZhKy_yMfO2M4QMRKcH1g0iQv9u-2hfBW7bUFwVh7pGaRUb0RnHcJU37y-
    FxlRugatx63JLv7CWMD6UB_O_r  
    
    hl=zh-CN&source=hp&q=domety
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    可以看到,POST方式请求行中不包含数据字符串,这些数据保存在”请求内容”部分,各数据之间也是使用”&”符号隔开。POST方式大多用于页面的表单中。因为POST也能完成GET的功能,因此多数人在设计表单的时候一律都使用POST方式,其实这是一个误区。GET方式也有自己的特点和优势,我们应该根据不同的情况来选择是使用GET还是使用POST。

    3).HEAD

    HEAD就像GET,只不过服务端接受到HEAD请求后只返回响应头,而不会发送响应内容。当我们只需要查看某个页面的状态的时候,使用HEAD是非常高效的,因为在传输的过程中省去了页面内容。

    2.请求头

    请求头部由关键字/值对组成,每行一对,关键字和值用英文冒号“:”分隔。请求头部通知服务器有关于客户端请求的信息,典型的请求头有:

    • User-Agent:产生请求的浏览器类型。
    • Accept:客户端可识别的内容类型列表。
    • Host:请求的主机名,允许多个域名同处一个IP地址,即虚拟主机。

     

    3.空行

    最后一个请求头之后是一个空行,发送回车符和换行符,通知服务器以下不再有请求头。

     

     

    4.请求数据

    请求数据不在GET方法中使用,而是在POST方法中使用。POST方法适用于需要客户填写表单的场合。与请求数据相关的最常使用的请求头是Content-Type和Content-Length。

    实例

    1).GET

    //请求首行

    GET /hello/index.jsp HTTP/1.1

    //请求头信息,因为GET请求没有正文

    Host: localhost

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

    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

    Accept-Charset: GB2312,utf-8;q=0.7,*;q=0.7

    Connection: keep-alive

    Cookie: JSESSIONID=369766FDF6220F7803433C0B2DE36D98

    //空行

    //因为GET没有正文,所以下面为空

     


    2).POST

    // 请求首行

    POST /hello/index.jsp HTTP/1.1

    //请求头信息

    Host: localhost

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

    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

    Accept-Charset: GB2312,utf-8;q=0.7,*;q=0.7

    Connection: keep-alive

    Referer: http://localhost/hello/index.jsp

    Cookie: JSESSIONID=369766FDF6220F7803433C0B2DE36D98

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

    Content-Length: 14 

    // 这里是空行

    //POST有请求正文

    username=hello

     

    HTTP响应消息

    HTTP响应也由三个部分组成,分别是:状态行、响应头、空行、响应正文。
    正如你所见,在响应中唯一真正的区别在于第一行中用状态信息代替了请求信息。状态行(status line)通过提供一个状态码来说明所请求的资源情况。

    状态行格式如下:

    [html] view plain copy

    1. HTTP-Version    Status-Code    Reason-Phrase    CRLF  
    HTTP-Version    Status-Code    Reason-Phrase    CRLF

    其中,HTTP-Version表示服务器HTTP协议的版本;
    Status-Code表示服务器发回的响应状态代码;
    Reason-Phrase表示状态代码的文本描述。

     

    HTTP状态码

    当浏览者访问一个网页时,浏览者的浏览器会向网页所在服务器发出请求。当浏览器接收并显示网页前,此网页所在的服务器会返回一个包含HTTP状态码的信息头(server header)用以响应浏览器的请求。
    HTTP状态码的英文为HTTP Status Code。状态代码由三位数字组成,第一个数字定义了响应的类别,且有五种可能取值。

    • 1xx:指示信息–表示请求已接收,继续处理。
    • 2xx:成功–表示请求已被成功接收、理解、接受。
    • 3xx:重定向–要完成请求必须进行更进一步的操作。
    • 4xx:客户端错误–请求有语法错误或请求无法实现。
    • 5xx:服务器端错误–服务器未能实现合法的请求。


    常见状态代码、状态描述的说明如下。

    • 200 OK:客户端请求成功。
    • 400 Bad Request:客户端请求有语法错误,不能被服务器所理解。
    • 401 Unauthorized:请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用。
    • 403 Forbidden:服务器收到请求,但是拒绝提供服务。
    • 404 Not Found:请求资源不存在,举个例子:输入了错误的URL。
    • 500 Internal Server Error:服务器发生不可预期的错误。
    • 503 Server Unavailable:服务器当前不能处理客户端的请求,一段时间后可能恢复正常,举个例子:HTTP/1.1 200 OK(CRLF)。

     

    HTTP响应头

     

    HTTP content-Type

    Content-Type,内容类型,一般是指网页中存在的Content-Type,用于定义网络文件的类型和网页的编码,决定浏览器将以什么形式、什么编码读取这个文件,这就是经常看到一些Asp网页点击的结果却是下载到的一个文件或一张图片的原因。

    HTTP content-type 对照表

     

     

     

    关于HTTP请求GET和POST的区别

     

    1.GET提交,请求的数据会附在URL之后(就是把数据放置在HTTP协议头<request-line>中),以?分割URL和传输数据,多个参数用&连接;例如:login.action?name=hyddd&password=idontknow&verify=%E4%BD%A0 %E5%A5%BD。如果数据是英文字母/数字,原样发送,如果是空格,转换为+,如果是中文/其他字符,则直接把字符串用BASE64加密,得出如: %E4%BD%A0%E5%A5%BD,其中%XX中的XX为该符号以16进制表示的ASCII。

      POST提交:把提交的数据放置在是HTTP包的包体<request-body>中。上文示例中红色字体标明的就是实际的传输数据

      因此,GET提交的数据会在地址栏中显示出来,而POST提交,地址栏不会改变

    2.传输数据的大小:

       首先声明,HTTP协议没有对传输的数据大小进行限制,HTTP协议规范也没有对URL长度进行限制。 而在实际开发中存在的限制主要有:

       GET:特定浏览器和服务器对URL长度有限制,例如IE对URL长度的限制是2083字节(2K+35)。对于其他浏览器,如Netscape、FireFox等,理论上没有长度限制,其限制取决于操作系统的支持。

       因此对于GET提交时,传输数据就会受到URL长度的限制。

       POST:由于不是通过URL传值,理论上数据不受限。但实际各个WEB服务器会规定对post提交数据大小进行限制,Apache、IIS6都有各自的配置。

    3.安全性:

        POST的安全性要比GET的安全性高。注意:这里所说的安全性和上面GET提到的“安全”不是同个概念。上面“安全”的含义仅仅是不作数据修改,而这里安全的含义是真正的Security的含义,比如:通过GET提交数据,用户名和密码将明文出现在URL上,因为(1)登录页面有可能被浏览器缓存, (2)其他人查看浏览器的历史纪录,那么别人就可以拿到你的账号和密码了,

     

    后记:HTTP 协议中共定义了八种方法或者叫“动作”来表明对 Request-URI 指定的资源的不同操作方式,具体介绍如下:

    •  OPTIONS:返回服务器针对特定资源所支持的HTTP请求方法。也可以利用向Web服务器发送'*'的请求来测试服务器的功能性。
    •  HEAD:向服务器索要与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以在不必传输整个响应内容的情况下,就可以获取包含在响应消息头中的元信息。
    •  GET:向特定的资源发出请求。
    •  POST:向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的创建和/或已有资源的修改。
    •  PUT:向指定资源位置上传其最新内容。
    •  DELETE:请求服务器删除 Request-URI 所标识的资源。
    •  TRACE:回显服务器收到的请求,主要用于测试或诊断。
    •  CONNECT:HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。

    虽然 HTTP 的请求方式有 8 种,但是我们在实际应用中常用的也就是 get 和 post,其他请求方式也都可以通过这两种方式间接的来实现。

    HTTP状态码

    当浏览者访问一个网页时,浏览者的浏览器会向网页所在服务器发出请求。当浏览器接收并显示网页前,此网页所在的服务器会返回一个包含HTTP状态码的信息头(server header)用以响应浏览器的请求。

    HTTP状态码的英文为HTTP Status Code。

    下面是常见的HTTP状态码:

    • 200 - 请求成功
    • 301 - 资源(网页等)被永久转移到其它URL
    • 404 - 请求的资源(网页等)不存在
    • 500 - 内部服务器错误

    HTTP状态码分类

    HTTP状态码由三个十进制数字组成,第一个十进制数字定义了状态码的类型,后两个数字没有分类的作用。HTTP状态码共分为5种类型:

    HTTP状态码分类
    分类分类描述
    1**信息,服务器收到请求,需要请求者继续执行操作
    2**成功,操作被成功接收并处理
    3**重定向,需要进一步的操作以完成请求
    4**客户端错误,请求包含语法错误或无法完成请求
    5**服务器错误,服务器在处理请求的过程中发生了错误

    HTTP状态码列表:

    HTTP状态码列表
    状态码状态码英文名称中文描述
    100Continue继续。客户端应继续其请求
    101Switching Protocols切换协议。服务器根据客户端的请求切换协议。只能切换到更高级的协议,例如,切换到HTTP的新版本协议
     
    200OK请求成功。一般用于GET与POST请求
    201Created已创建。成功请求并创建了新的资源
    202Accepted已接受。已经接受请求,但未处理完成
    203Non-Authoritative Information非授权信息。请求成功。但返回的meta信息不在原始的服务器,而是一个副本
    204No Content无内容。服务器成功处理,但未返回内容。在未更新网页的情况下,可确保浏览器继续显示当前文档
    205Reset Content重置内容。服务器处理成功,用户终端(例如:浏览器)应重置文档视图。可通过此返回码清除浏览器的表单域
    206Partial Content部分内容。服务器成功处理了部分GET请求
     
    300Multiple Choices多种选择。请求的资源可包括多个位置,相应可返回一个资源特征与地址的列表用于用户终端(例如:浏览器)选择
    301Moved Permanently永久移动。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替
    302Found临时移动。与301类似。但资源只是临时被移动。客户端应继续使用原有URI
    303See Other查看其它地址。与301类似。使用GET和POST请求查看
    304Not Modified未修改。所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。客户端通常会缓存访问过的资源,通过提供一个头信息指出客户端希望只返回在指定日期之后修改的资源
    305Use Proxy使用代理。所请求的资源必须通过代理访问
    306Unused已经被废弃的HTTP状态码
    307Temporary Redirect临时重定向。与302类似。使用GET请求重定向
     
    400Bad Request客户端请求的语法错误,服务器无法理解
    401Unauthorized请求要求用户的身份认证
    402Payment Required保留,将来使用
    403Forbidden服务器理解请求客户端的请求,但是拒绝执行此请求
    404Not Found服务器无法根据客户端的请求找到资源(网页)。通过此代码,网站设计人员可设置"您所请求的资源无法找到"的个性页面
    405Method Not Allowed客户端请求中的方法被禁止
    406Not Acceptable服务器无法根据客户端请求的内容特性完成请求
    407Proxy Authentication Required请求要求代理的身份认证,与401类似,但请求者应当使用代理进行授权
    408Request Time-out服务器等待客户端发送的请求时间过长,超时
    409Conflict服务器完成客户端的PUT请求是可能返回此代码,服务器处理请求时发生了冲突
    410Gone客户端请求的资源已经不存在。410不同于404,如果资源以前有现在被永久删除了可使用410代码,网站设计人员可通过301代码指定资源的新位置
    411Length Required服务器无法处理客户端发送的不带Content-Length的请求信息
    412Precondition Failed客户端请求信息的先决条件错误
    413Request Entity Too Large由于请求的实体过大,服务器无法处理,因此拒绝请求。为防止客户端的连续请求,服务器可能会关闭连接。如果只是服务器暂时无法处理,则会包含一个Retry-After的响应信息
    414Request-URI Too Large请求的URI过长(URI通常为网址),服务器无法处理
    415Unsupported Media Type服务器无法处理请求附带的媒体格式
    416Requested range not satisfiable客户端请求的范围无效
    417Expectation Failed服务器无法满足Expect的请求头信息
     
    500Internal Server Error服务器内部错误,无法完成请求
    501Not Implemented服务器不支持请求的功能,无法完成请求
    502Bad Gateway充当网关或代理的服务器,从远端服务器接收到了一个无效的请求
    503Service Unavailable由于超载或系统维护,服务器暂时的无法处理客户端的请求。延时的长度可包含在服务器的Retry-After头信息中
    504Gateway Time-out充当网关或代理的服务器,未及时从远端服务器获取请求
    505HTTP Version not supported服务器不支持请求的HTTP协议的版本,无法完成处理

    HTTP content-type

    Content-Type,内容类型,一般是指网页中存在的Content-Type,用于定义网络文件的类型和网页的编码,决定浏览器将以什么形式、什么编码读取这个文件,这就是经常看到一些Asp网页点击的结果却是下载到的一个文件或一张图片的原因。

    转自:HTTP 教程http://blog.csdn.net/zhangliang_571/article/details/23508953

     

     

     

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

    万次阅读 多人点赞 2020-05-14 12:05:41
    SpringBoot发送Http请求 [提前声明] 文章由作者:张耀峰 结合自己生产中的使用经验整理,最终形成简单易懂的文章 写作不易,转载请注明,谢谢! ... 前言 之前我写过一篇关于SpringBoot发送Http...但是使用这个工具发送请求
  • http请求头header、请求体body、请求行介绍

    万次阅读 多人点赞 2019-06-09 09:47:54
    HttpServletRequest对象代表客户端的请求,当客户端通过http协议请求访问 ...request如果是post才有请求体,get则没有请求体,直接跟在?后面,用&隔开。 getHeader(String name)获取单个请求...
  • Nginx+Tomcat搭建负载均衡,实现网站请求的分发

    千次下载 热门讨论 2015-11-11 17:45:29
    使用Nginx+Tomcat搭建负载均衡,实现网站请求的分发
  • 本文涉及两种请求方式,即 get 和 post 。通过java后台设置请求头部 可以根据需求修改或者添加请求头信息。 修改请求头代码 根据不同的请求方式,在main方法中选择调用不同的方法(get/post ) package ...
  • options请求

    万次阅读 2018-12-18 17:27:37
    在当前项目中,前端通过POST方式访问后端的REST接口时,发现两条请求记录,一条请求的Request Method为Options,另一条请求的Reuest Method为Post。想要解决这个疑惑还得从以下3个概念说起。 Http Options Method ...
  • Flutter Http网络请求详解

    千次阅读 2019-03-10 23:57:29
    Http的请求方式简介1.1 GET请求方式1.2 POST请求方式1.3 HEAD请求方式1.4 PUT请求方式1.5 DELETE请求方式1.6 OPTIONS请求方式1.7 TRACE请求方式1.8 CONNECT请求方式2. Flutter Http网络请求实现的区别和特点 Http...
  • get请求和post请求的详细区别

    万次阅读 多人点赞 2019-06-06 16:29:40
    GET和POST是HTTP请求的...你可能自己写过无数个GET和POST请求,或者已经看过很多权威网站总结出的他们的区别,你非常清楚知道什么时候该用什么。 当你在面试中被问到这个问题,你的内心充满了自信和喜悦。 你轻...
  • ajax请求携带cookie、自定义header总结: 错误: 1.ajax请求时是不会自动带上cookie的,要是想让他带上的话,必须设置withCredential为true。 正确: 1.ajax同域请求下,ajax会自动带上同源的cookie; 2.ajax同域...
  • HTTP协议不对URI的长度作事先的限制,服务器必须能够处理任何他们提供资源的URI,并且应该能够处理无限长度的URIs,这种无效长度的URL可能会在客户端以基于GET方式的请求时产生。如果服务器不能处理太长的URI的时候...
  • 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 的 ...
  • Web跨域请求及其解决方案

    万次阅读 多人点赞 2019-07-08 13:34:17
    目录 一、理论概述 1. 什么是跨域请求(Cross-domain Request) 2. 浏览器的同源策略(Same-origin Policy) ...(2)CORS非简单请求(也称预检请求) HTTP 响应首部字段 Access-Control-Allow-Or...
  • HTTP请求的完全过程

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

    万次阅读 2020-07-01 20:31:07
    前言: 前几天有同学在postman中发送get请求时,把请求参数放入了请求体中。然后后端使用了@RequestBody来接收请求参数,它确实是可以这样用的!postman测试API的响应也是正常的。但是前端使用get方式传递参数,却报...
  • java发送https请求的例子

    热门讨论 2013-10-31 16:18:51
    java发送https请求的例子
  • 本篇文章将对项目中如何封装axios常用的请求方法进行介绍,其中包括最容易出问题的post请求的解释,包括一些请求格式和参数格式不一致问题的解决; 通用配置 这些配置是在axios官方文档中没有列出来的,主要是post...
  • 不仅仅是fetch,只要你满足以下几种情况,都会去发起一个 Preflighted requests,也就是options请求,参见上面链接。 It uses methods other than GET, HEAD or POST. Also, if POST is used to send request data ...
  • http请求测试工具

    千次下载 热门讨论 2013-10-08 15:40:42
    本工具可以用于http协议的测试。可以模拟ajax的POST或者GET模式提交数据。支持自定义cookie。也可以用于客户端通信,前提是http协议的。免积分分享给大家。
  • HTTP-请求头与请求

    万次阅读 2018-03-29 10:56:36
    本文从属于笔者的HTTP 理解与实践系列文章,对于HTTP的学习主要包含HTTP 基础、HTTP 请求头与请求体、HTTP 响应头与状态码、HTTP 缓存这四个部分,而对于HTTP相关的扩展与引申,我们还需要了解HTTPS 理解与实践 、...
  • axios中取消请求及阻止重复请求的方法

    万次阅读 多人点赞 2019-06-26 11:10:55
    在实际项目中,我们可能需要对请求进行“防抖”处理。这里主要是为了阻止用户在某些情况下短时间内重复点击某个按钮,导致前端向后端重复发送多次请求。这里我列举两种比较常见的实际情况: PC端 - 用户双击搜索...
  • 静态请求和动态请求

    千次阅读 2020-05-27 15:16:46
    静态请求 简单的来说就是html页面的请求。 具体的请求历程: 用户访问一个.html的文件 服务器端接收到请求,该请求到达服务器的内核空间,因为tcp/ip协议工作在内核空间;到达内核空间后,发现访问的是80端口的套...
  • 什么是同步请求和异步请求

    千次阅读 2020-07-20 08:32:37
    一、同步、异步请求 浏览器发送请求给服务器,其有同步请求和异步请求两种方式。 1同步请求 什么叫同步请求呢? 就是在发送一个请求之后,需要等待服务器响应返回,才能够发送下一个请求。 之前学的请求是通过浏览器...
  • HTTP简单请求和非简单请求1

    千次阅读 2018-12-04 20:11:00
    简单请求和非简单请求1 1、浏览器发送跨域请求,如何判断?  浏览器在发送跨域请求的时候,会先判断下是简单请求还是非简单请求,如果是简单请求,就先执行服务端程序,然后浏览器才会判断是否跨域 2、简单请求 ...
  • 简述HTML中post与get请求的区别

    万次阅读 多人点赞 2019-05-23 20:04:22
    简述ajax中post与get请求的区别,以及请求报文欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个...
  • Tornado请求分析request, 获取请求参数

    万次阅读 2019-01-06 22:37:30
    请求分析request WEB请求的那些事 这节中,我们来根据客户请求报文中的请求行(Request line) ,请求头部(Request Header),请求主体(Request body)的信息,来描述服务端如何处理。 请求行的格式:&amp;lt;...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,375,046
精华内容 1,750,018
关键字:

怎么请求