精华内容
下载资源
问答
  • http请求头header请求体body、请求行介绍

    万次阅读 多人点赞 2019-06-09 09:47:54
    HttpServletRequest对象代表客户端的请求,当...http请求包含请求行/状态行、请求头请求体。 request如果是post才有请求体,get则没有请求体,直接跟在?后面,用&隔开。 getHeader(String name)获取单个请求...

    HttpServletRequest对象代表客户端的请求,当客户端通过http协议请求访问

    服务器的时候,http请求头的所有信息都封装在这个对象中,通过这个对象,可以获取客户端请求的所有信息。http请求包含请求行/状态行、请求头、请求体。

    request如果是post才有请求体,get则没有请求体,直接跟在?后面,用&隔开。
    getHeader(String name)获取单个请求头name对应的value
    getHeaders(String name)获取多个请求头对应的一组value,因此返回的是枚举类型的数据
    getHeaderNames()获取请求头的所有name值,返回的数据也是一个枚举类型数据,将枚举中的元素遍历出来,根据name取到value,即是请求头的所有信息。

    请求头header一般用来存放一些cookie,token信息;

    请求体body一般用来存储post的参数和参数数据;

    我们用postman测试下

    Params

    school:XiaMen

    Header

    userName:chen

    body

    {"class":"test"}

    package com.example.demo;

    import java.io.BufferedReader;
    import java.text.MessageFormat;
    import java.util.Enumeration;
    import java.util.Iterator;
    import java.util.Map;
    import java.util.Map.Entry;
    import java.util.Set;

    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;

    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;

    @RestController
    public class IndexController {

        @RequestMapping("/hello")
        public String hello(HttpServletRequest request,HttpServletResponse response){
            
            /**
             * HttpServletRequest对象代表客户端的请求,当客户端通过http协议请求访问
             * 服务器的时候,http请求头的所有信息都封装在这个对象中,通过这个对象,可以获取
             * 客户端请求的所有信息.
             * http请求包含请求行/状态行、请求头、请求体
             */
            //客户端请求uri
            String uri = request.getRequestURI();
            //客户端请求行中的参数部分
            String queryString = request.getQueryString();
            //返回url的额外路径信息
            String pathInfo = request.getPathInfo();
            //客户端ip
            String ip = request.getRemoteAddr();
            //客户端完整主机名
            String host = request.getRemoteHost();
            //客户端端口
            int port = request.getRemotePort();
            //获取web服务器的主机和端口,主机名
            String webHost = request.getLocalAddr();
            int webPort = request.getLocalPort();
            String webName = request.getLocalName();
            //获取请求头信息
            Enumeration<String> headers = request.getHeaderNames();
            System.out.println("请求头信息");
            while(headers.hasMoreElements()){
                String headName = (String)headers.nextElement();
                String headValue = request.getHeader(headName);
                System.out.println(headName+":"+headValue);
            }
            System.out.println("请求参数");
            //request如果是post才有请求体,get则没有请求体,直接跟在?后面,用&隔开
            /**
             * getHeader(String name)获取单个请求头name对应的value
             * getHeaders(String name)获取多个请求头对应的一组value,因此返回的是枚举类型的数据
             * getHeaderNames()获取请求头的所有name值,返回的数据也是一个枚举类型数据,将枚举中的元素遍历出来,根据name取到value,即是请求头的所有信息
             */
            //获取客户端请求参数
            //request对象封装的参数是以Map的形式存储的
            Map<String, String[]> paramMap = request.getParameterMap();
            for(Map.Entry<String, String[]> entry :paramMap.entrySet()){
                String paramName = entry.getKey();
                String paramValue = "";
                String[] paramValueArr = entry.getValue();
                for (int i = 0; paramValueArr!=null && i < paramValueArr.length; i++) {
                    if (i == paramValueArr.length-1) {
                        paramValue+=paramValueArr[i];
                    }else {
                        paramValue+=paramValueArr[i]+",";
                    }
                }
                System.out.println(MessageFormat.format("{0}={1}", paramName,paramValue));
            }
            //请求体
            try {
                System.out.println("请求体");
                charReader(request);
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return "hello world";
        }
        
        void charReader(HttpServletRequest request) throws Exception{
            BufferedReader br = request.getReader();
            String str, wholeStr = "";
            while((str = br.readLine()) != null){
               wholeStr += str;
            }
            System.out.println(wholeStr);
        }
    }
    输出结果

    ==============================================

    请求头信息
    username:chen
    cache-control:no-cache
    postman-token:58cf0ebc-5448-4460-95db-8610bec65927
    content-type:text/plain
    user-agent:PostmanRuntime/7.4.0
    accept:*/*
    host:localhost:8080
    accept-encoding:gzip, deflate
    content-length:16
    connection:keep-alive
    请求参数
    school=XiaMen
    请求体
    {"class":"test"}
     

    往请求头header里设置参数和参数value,可以使用HttpClient访问rest接口,往请求头里添加token验证信息

    CloseableHttpClient client = HttpClients.createDefault();
            HttpGet get = new HttpGet("http://localhost:8080/index");
            try {
                get.setHeader("token", "jdlj939399lKDN");
                CloseableHttpResponse response2 = client.execute(get);
                HttpEntity entity = response2.getEntity();
            } catch (ClientProtocolException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

     

    展开全文
  • SpringMVC/SpringBoot2中使用@RequestHeader获取请求头 springMVC/SpringBoot中提供了@RequestHeader注解用来获取请求头。 一、使用@RequestHeader获取请求头 (一)获取某一个请求头 例如,获取accept-language...

    SpringMVC/SpringBoot2中使用@RequestHeader获取请求头

    springMVC/SpringBoot中提供了@RequestHeader注解用来获取请求头。

    一、使用@RequestHeader获取请求头

    (一)获取某一个请求头

    例如,获取accept-language请求头:

    @GetMapping("/getLanguage")
    public Result test(@RequestHeader("accept-language") String language) {
        // ......
        
        return new Result(true, 600, language);
    }
    

    使用postman,没有设置accept-language请求头时,响应:

    {
        "timestamp": "2019-12-3T20:43:58.971+0000",
        "status": 400,
        "error": "Bad Request",
        "message": "Missing request header 'accept-language' for method parameter of type String",
        "path": "/getLanguage"
    }
    
    

    添加了accept-language请求头后,响应:

    {
        "flag": true,
        "code": 600,
        "message": "en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7"
    } 
    

    (二)获取数值型请求头

    @GetMapping("/num")
    public Result getNumber(@RequestHeader("my-number") int myNumber) {
        return new Result(true, HttpStatus.OK.value(), String.valueOf(myNumber));
    }
    

    使用postman设置my-number请求头值为1,响应:

    {
        "flag": true,
        "code": 200,
        "message": "1"
    }
    

    (三)一次性获取所有请求头

    1、使用Map接收所有请求头

    @GetMapping("/getHeaders")
    public Result listAllHeaders(@RequestHeader Map<String, String> headers) {
        headers.forEach((key, value) -> {
            // 日志中输出所有请求头
            logger.info(String.format("Header '%s' = %s", key, value));
        });
        return new Result(true, HttpStatus.OK.value(), "");
    }
    
    

    使用postman请求该地址,控制台打印:

    2019-12-03 21:10:35,993 INFO  [http-nio-10000-exec-9] com.chushiyan.test.controller.HttpHeaderController: Header 'user-agent' = PostmanRuntime/7.20.1
    2019-12-03 21:10:35,994 INFO  [http-nio-10000-exec-9] com.chushiyan.test.controller.HttpHeaderController: Header 'accept' = */*
    2019-12-03 21:10:35,994 INFO  [http-nio-10000-exec-9] com.chushiyan.test.controller.HttpHeaderController: Header 'cache-control' = no-cache
    2019-12-03 21:10:35,995 INFO  [http-nio-10000-exec-9] com.chushiyan.test.controller.HttpHeaderController: Header 'postman-token' = 47dce6dd-c082-47b0-8867-720e45205aa1
    2019-12-03 21:10:35,995 INFO  [http-nio-10000-exec-9] com.chushiyan.test.controller.HttpHeaderController: Header 'host' = localhost:10000
    2019-12-03 21:10:35,995 INFO  [http-nio-10000-exec-9] com.chushiyan.test.controller.HttpHeaderController: Header 'accept-encoding' = gzip, deflate
    2019-12-03 21:10:35,996 INFO  [http-nio-10000-exec-9] com.chushiyan.test.controller.HttpHeaderController: Header 'connection' = keep-alive
    

    2、使用MultiValueMap接收所有请求头

    一个请求头存在多个值的时候,可以使用MultiValueMap接收所有请求头

    @GetMapping("/getHeaders2")
    public Result multiValue(@RequestHeader MultiValueMap<String, String> headers) {
        headers.forEach((key, value) -> {
            logger.info(String.format(
                    "Header '%s' = %s", key, value.stream().collect(Collectors.joining("/"))));
        });
        return new Result(true, HttpStatus.OK.value(), "");
    }
    
    

    3、使用HttpHeaders接收所用请求头

    @GetMapping("/getBaseUrl")
    public Result getBaseUrl(@RequestHeader HttpHeaders headers) {
        // 获取到了所有的请求头,这里只是使用Host请求头
        InetSocketAddress host = headers.getHost();
        String url = "http://" + host.getHostName() + ":" + host.getPort();
        return new Result(true, HttpStatus.OK.value(),url);
    }
    
    

    使用postman请求该地址,得到的响应:

    {
        "flag": true,
        "code": 200,
        "message": "http://localhost:10000"
    }
    

    二、@RequestHeader注解详解

    @RequestHeader源码如下:

    package org.springframework.web.bind.annotation;
    
    import java.lang.annotation.Documented;
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    import org.springframework.core.annotation.AliasFor;
    
    /**
     * Annotation which indicates that a method parameter should be bound to a web request header.
     *
     * <p>Supported for annotated handler methods in Spring MVC and Spring WebFlux.
     *
     * <p>If the method parameter is {@link java.util.Map Map&lt;String, String&gt;},
     * {@link org.springframework.util.MultiValueMap MultiValueMap&lt;String, String&gt;},
     * or {@link org.springframework.http.HttpHeaders HttpHeaders} then the map is
     * populated with all header names and values.
     *
     * @author Juergen Hoeller
     * @author Sam Brannen
     * @since 3.0
     * @see RequestMapping
     * @see RequestParam
     * @see CookieValue
     */
    @Target(ElementType.PARAMETER)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    public @interface RequestHeader {
    
       /**
        * Alias for {@link #name}.
        */
       @AliasFor("name")
       String value() default "";
    
       /**
        * The name of the request header to bind to.
        * @since 4.2
        */
       @AliasFor("value")
       String name() default "";
    
       /**
        * Whether the header is required.
        * <p>Defaults to {@code true}, leading to an exception being thrown
        * if the header is missing in the request. Switch this to
        * {@code false} if you prefer a {@code null} value if the header is
        * not present in the request.
        * <p>Alternatively, provide a {@link #defaultValue}, which implicitly
        * sets this flag to {@code false}.
        */
       boolean required() default true;
    
       /**
        * The default value to use as a fallback.
        * <p>Supplying a default value implicitly sets {@link #required} to
        * {@code false}.
        */
       String defaultValue() default ValueConstants.DEFAULT_NONE;
    
    }
    

    (一)name、value属性

    public Result test(@RequestHeader(name="accept-language") String language)
    public Result test(@RequestHeader(value="accept-language") String language)
    

    上面这两行代码效果相同。当然都可以省略为:(因为value是可以省略写的)

    public Result test(@RequestHeader("accept-language") String language)
    

    因为从源码中,可以看出name/value互为别名:

       @AliasFor("name")
       String value() default "";
    
       @AliasFor("value")
       String name() default "";
    

    @AliasFor注解:

    1. @AliasFor在同一个注解中成对使用,表示两个属性互为别名。比如上面的,value和name就是互为别名。
    2. @AliasFor标签有一些使用限制,比如要求互为别名的属性的属性值类型、默认值都是相同的。
    3. 互为别名的注解必须成对出现,比如value属性添加了@AliasFor(“name”),那么name属性就必须添加@AliasFor(“value”)。

    (二)required属性

    @GetMapping("/getHeader3")
    public Result evaluateNonRequiredHeader(
            @RequestHeader(value = "chushiyan", required = false) String header) {
    
        return new Result(true,HttpStatus.OK.value(),"");
    }
    

    如果没有添加required = false,当请求头中没有这个chushiyan请求头时就会报错。

    (三)defaultValue属性

    可以使用defaultValue属性指定默认值

    @GetMapping("/getHeader3")
    public Result evaluateNonRequiredHeader(
            @RequestHeader(value = "chushiyan", defaultValue = "hello") String header) {
    
        return new Result(true,HttpStatus.OK.value(),"");
    }
    
    展开全文
  • 爬虫:设置Request Header请求头

    千次阅读 2020-03-04 09:45:51
    Request Header请求头)是在http协议中封装的内容,在在很多网站中,会对请求头中的信息有所要求,或者是因为用作验证来反爬虫,或者是获得浏览器的信息以提供针对性的反馈等等,当缺少这些请求头信息时,有些网站...

    原文地址

    分类目录——爬虫

    Request Header(请求头)是在http协议中封装的内容,在在很多网站中,会对请求头中的信息有所要求,或者是因为用作验证来反爬虫,或者是获得浏览器的信息以提供针对性的反馈等等,当缺少这些请求头信息时,有些网站可能会对请求不予反馈,或者返回错误信息。

    这就需要在通过代码访问的时候追加这些信息

    下面以一个例子来说明

    以 https://dig.chouti.com/ 这个网站为例,在浏览器中访问这个网站,在网页中右击 =》查看源代码

    1583059701982

    在通过代码访问时,当只传入url=‘https://dig.chouti.com/’时,是无法获取网络的反馈的

    r1 = requests.get(
        url='https://dig.chouti.com/',
    )
    print(r1.text)
    # 在这里只提供其中几行
    # <html xmlns="http://www.w3.org/1999/xhtml"><head>
    # <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    # <title>网站防火墙</title>
    # <style>
    

    显然,只通过这个开头就可以发现这并不是我想要的网页,我的访问请求被它拒绝了

    这是因为缺少请求头,是什么样的请求头呢。

    在网页中可以通过F12 、 Ctrl+Shift+I 、 网页上右击 =》检查 (我用的谷歌浏览器)三种方式打开网页检查工具,进入Network选项卡下

    1583060230765

    首次进入下方应该是空白的,如果有内容,为了方便观察新请求,点击左上角部分的clear清空一下,然后刷新一下网页,这里就更新出很多请求与相应包,点击其中一个name

    1583060615526

    有变就会弹出改包的信息其中包括Request Method(请求方式)、Response Headers(相应头,这是服务器封装了反馈过来的)、Request Headers(请求头,这就是你请求这个网页时封装在请求包里发向服务器的,不过这些都是浏览器在后台做的事,我们是不会看到的),如果请求方式为post,可能还会有formdata之类的请求体,此处先不提

    这里主要说的是Request Headers(请求头)

    1583061026801

    可以看到请求头包含了很多信息,但也并非所有的信息都是必须的,还有就是请求不同的网站,封装的请求头属性也是不尽相同的,还有些属性的属性值是动态的,可能来自Response Headers,可能是猫在网页中

    这个网站对于User-Agent这个属性是必需的,下面就演示如何将请求头信息封装进request请求代码中

    import requests
    from bs4 import BeautifulSoup
    
    # 有些网站会做限制,需要获得浏览器的一些信息,无这些信息将不会响应访问
    r1 = requests.get(
        url='https://dig.chouti.com/',
        # 通过headers属性以字典形式传递请求头信息
        headers={
            'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.100 Safari/537.36',
            # 这里还可以以字典形式给出别的请求头属性
        }
    )
    
    soup = BeautifulSoup(r1.text,'html.parser')
    
    # 标签对象
    content_body = soup.find(name='div', attrs={'class':'link-con'})
    # print(content_list)
    # [标签对象,标签对象]
    title_list = content_body.find_all(name='div',attrs={'class':'link-detail'})
    for title in title_list:
        a = title.find(name='a',attrs={'class':'link-title link-statistics'})
        print(a.text)   # 获得a便签中的标题文字
    # 这里只给出几个以供示例
    # 三个男朋友,该如何取舍?
    # 设计师自制概念视频:如果用苹果风格来设计 Windows 10(YouTube Avdan)
    # 日本bauhutte公司设计的gaming bed“肥宅快乐床”,可以躺一辈子了
    

    不同的网站根据开发者的设定对请求头有不同的需求,有时通过尝试不同的请求头属性可以解决一些通过代码无法访问的网站,但是应该明白防爬虫的机制远不止请求头一项

    展开全文
  • 使用@RequestParam绑定请求参数值 在处理方法入参处使用@RequestParam可以把请求参数传递给请求方法 value:参数名 required:是否必须。...使用@RequestHeader绑定请求头的属性值 演示程序步骤:...

    使用@RequestParam绑定请求参数值

    • 在处理方法入参处使用@RequestParam可以把请求参数传递给请求方法
      • value:参数名
      • required:是否必须。默认为true,表示请求参数中必须包含对应的参数,若不存在,将抛出异常
        在这里插入图片描述
        在这里插入图片描述
        在这里插入图片描述
        在这里插入图片描述

    存在一个情况:如果请求的时候没有带其中一个参数将会无法访问

    解决方法:
    在这里插入图片描述

    使用@RequestHeader绑定请求头的属性值

    演示程序步骤:

    1.首先直接打开 Chrome:http://localhost:8080/springmvc-1/index.jsp -> 开发者工具->F5 -> NetWork

    在这里插入图片描述

    2.新增产生联系的标签

    在这里插入图片描述

    3.写好这个方法
    在这里插入图片描述

    4.更新资源,启动服务器,点击这个a标签

    在这里插入图片描述

    成功打印出相应的值。

    展开全文
  • Header:请求头参数详解

    千次阅读 2019-11-05 17:10:10
    Header 解释 示例 Accept 指定客户端能够接收的内容类型 Accept: text/plain, text/html,application/json Accept-Charset 浏览器可以接受的字符编码集。 Accept-Charset: iso-8859-5 Accept-Encoding 指定...
  • @RequestHeader 绑定请求头数据

    千次阅读 2015-06-02 10:13:19
    @RequestHeader 用于将请求信息区数据映射到功能处理方法的参数上。 @RequestMapping(value="/header") public String test( @RequestHeader("User-Agent") String userAgent, @Request...
  • HTML——Header:请求头参数详解

    万次阅读 2018-11-03 23:38:06
    Header 解释 示例 Accept 指定客户端能够接收的内容类型 Accept: text/plain, text/html,application/json Accept-Charset 浏览器可以接受的字符编码集。 Accept-Charset: iso-8859-5 ...
  • HTTP 请求头 Header

    万次阅读 2013-12-02 15:20:47
    HTTP 请求头 Header HTTP请求头概述 (HttpServletRequest) HTTP客户程序(例如浏览器),向服务器发送请求的时候必须指明请求类型(一般是GET或者POST或者HEAD)。   如有必要,客户程序还可以选择发送其他...
  • HTTP Request Header 请求头

    千次阅读 2019-06-28 16:41:42
    Header 解释 示例 Accept 指定客户端能够接收的内容类型 Accept: text/plain, text/html Accept-Charset 浏览器可以接受的字符编码集 Accept-Charset: iso-8859-5 Accept-Encoding 指定...
  • [img=https://img-bbs.csdn.net/upload/202006/21/1592744030_638292.png][/img] 新建的一个mvc项目,这样请求是好的,我后端没有加任何验证,可是如果在请求头里面加上token的话,就会报错[img=...
  • ajax请求携带cookie、自定义header总结: 错误: 1.ajax请求时是不会自动带上...2.ajax同域请求下,ajax添加自定义请求头(或原装)header,前端、后台不需要增加任何配置, 并且不会因为增加自定义请求头header...
  • jquery header头请求

    千次阅读 2019-06-12 17:30:00
    <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>测试</title> </head> &l...
  • 爬虫中的Header请求头

    千次阅读 2018-12-04 16:37:53
    很多网站再申请访问的时候没有请求头访问会不成功,或者返回乱码,最简单的解决方式就是伪装成浏览器进行访问,这就需要添加一个请求头来伪装浏览器行为 ** Header ** 请求头可以自己来写,其实很简单 打开任意...
  • axios在header请求头加入自定义信息 _this.$axios.post("/api/noticeInfo/notReadNum",data,{ headers:{ 'userid':sessionStorage.getItem("userId") } }) .then(function (res){ console.log("未读消息为:",res...
  • java获取http requestheader请求头大小

    千次阅读 2018-08-29 13:53:59
    Enumeration headerNames = request.getHeaderNames(); int length = 0; while (null != headerNames && headerNames.hasMoreElements()){ String key = (String)...这样就可以获取到Header中所有内容的大小了 
  • 今天小编就为大家分享一篇java swagger ui 添加header请求头参数的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • 解决——并发请求丢失header请求头

    千次阅读 2020-08-10 19:51:50
    前段时间在工作的过程中发现并发调用的情况下,部分请求会丢失请求头的部分信息,故在此做下记录 自定义Runnable 注意RequestAttributes这个字段,是解决问题的关键所在 @Slf4j public class TaskRunnable ...
  • http协议的header头请求和返回值

    千次阅读 2018-02-22 10:15:22
  • AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]... //调出请求头  manager.requestSerializer = [AFJSONRequestSerializer serializer];  //将token封装入请求头  [manager.requestSeriali...
  • HTTP Header 请求头参数

    千次阅读 2018-05-03 11:03:46
    Header 解释示例Accept指定客户端能够接收的内容类型Accept: text/plain, text/html,application/jsonAccept-Charset浏览器可以接受的字符编码集。Accept-Charset: iso-8859-5Accept-Encoding指定浏览器可以支持的...
  • 设置一个名为 headers 的参数 参考代码: // attempt to make an XMLHttpRequest to ...// jQuery 1.6.1 and Chrome dev 13.0.767 function makeRequest() { alert("inside makeRequest()"); var settings = { ...
  • HTTP GET添加Header请求头

    万次阅读 2020-02-20 16:18:23
    * 人脸识别-GET 请求(增加Header请求头) */ public class QdfsFaceToGetHttpHeader { public static void main(String[] args) { String url = "http://123.127.2.222:22111/recognizeRecords/top"; String ...
  • HTTP Request Header 请求头理解

    万次阅读 2018-07-11 09:42:59
    Header 解释 示例 Accept 指定客户端能够接收的内容类型 Accept: text/plain, text/html Accept-Charset 浏览器可以接受的字符编码集 Accept-Charset: iso-8859-5 Ac...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 476,765
精华内容 190,706
关键字:

header和请求头