HTTP请求与响应

一个很是完整的请求和响应demo

前端

发送报文主体、写入cookie(自动随带)、发送自定义的头部信息javascript

<body>
<div>
    <button id="btn">发送</button>
</div>
<script src="../js/lib/jquery-3.2.1.js"></script>
<script>
    document.cookie = "cookieKey=cookieValue";
    //ajax技术核心:XMLHttpRequest
    // 在不从新加载页面的状况下更新网页
    // 在页面已加载后从服务器请求数据
    // 在页面已加载后从服务器接收数据
    // 在后台向服务器发送数据
    $('#btn').click(function () {
        $.ajax({
            url: "postTest.do",
            type: "POST",
            dataType: "text",
            headers: {"aa":"this is my headerData"},
            contentType:"application/text;charset=UTF-8",
            data:"this is client request data",
            success: function(data,status,xmlhttp) {
                alert(data);
                alert(status);
                alert(xmlhttp.status);
                //响应实体的类型由 responseType 来指定, 能够
                alert(xmlhttp.responseText);
                //打印全部的头部信息
                alert(xmlhttp.getAllResponseHeaders());
                //按照key-value的形式取出响应的头部信息
                alert(xmlhttp.getResponseHeader('Content-Type'));
                alert('token='+xmlhttp.getResponseHeader('token'));
            },
            error: function() {
                alert("请求出错!");
            }
        });

    });

</script>
</body>

java后台

接收有:解析头部信息、主体信息、主体信息。并也返回这些信息。html

@RequestMapping(value="postTest.do",method= RequestMethod.POST,produces = "application/text;charset=UTF-8;")
    @ResponseBody
    public String postTest(HttpServletRequest request, HttpServletResponse response) throws IOException {
        //接收 cookie////////////////////////////////////////////////
        Cookie[] cookies = request.getCookies();
        System.out.println("Cookie长度:" + cookies.length);           //读取本机共存在多少COOKIE
        if (cookies != null) {
            for (int i = 0; i < cookies.length; i++) {
                if (cookies[i].getName().equals("cookieKey")) {
                    System.out.println("cookie:cookieKey=" + URLDecoder.decode(cookies[i].getValue(),"UTF-8"));
                }
            }
        } else {
            System.out.println("没有任何Cookie");
        }
        //接收 头部信息
        System.out.println("头部信息以下");
        System.out.println("request.getHeader(\"user-agent\") = :"+request.getHeader("user-agent"));
        System.out.println("request.getHeader(\"Referer\") = :"+request.getHeader("Referer"));
        System.out.println("request.getHeader(\"Accept\") = :"+request.getHeader("Accept"));
        System.out.println("request.getHeader(\"Host\"):"+request.getHeader("Host"));
        System.out.println("request.getHeader(\"aa\"):"+request.getHeader("aa"));
        //接收 客户端的基本信息
        System.out.println("请求的基本信息以下");
        System.out.println("request.getRequestURL() = :"+request.getRequestURL());
        System.out.println("request.getRequestURI() = :"+request.getRequestURI());//可用于REST API构建!
        System.out.println("request.getRemoteHost() = :"+request.getRemoteHost());
        System.out.println("request.getRemotePort() = :"+request.getRemotePort());
        System.out.println("request.getLocalAddr() = :"+request.getLocalAddr());
        System.out.println("request.getLocalName() = :"+request.getLocalName());
        System.out.println("request.getMethod() = :"+request.getMethod());
        System.out.println("解析HTTP POST方式的报文主体以下:");
        //接收报文主体数据
        DataInputStream in = new DataInputStream(request.getInputStream());
        int totalBytes = request.getContentLength();
        byte[] b = new byte[totalBytes];
        in.readFully(b);
        in.close();
        String reqContent = new String(b, "UTF-8");
        System.out.println("request.getInputStream()解析的报文主体 = "+reqContent);

        //返回cookie////////////////////////////////////////////////
        //建立一个cookie
        Cookie cookie = new Cookie("key1", "cookieValue1");
        cookie.setPath("/");// 这个要设置
        // cookie.setDomain(".zhangsan.com");//这样设置,能实现两个网站共用
        cookie.setMaxAge(365 * 24 * 60 * 60);// 不设置的话,则cookies不写入硬盘,而是写在内存,只在当前页面有用,以秒为单位,关闭浏览器就没了
        response.addCookie(cookie);         //添加cookie到响应对象中
        //建立第二个cookie
        cookie = new Cookie("key2", "cookieValue2");
        cookie.setPath("/");
        cookie.setMaxAge(365 * 24 * 60 * 60);
        response.addCookie(cookie);         //添加cookie到响应对象中
        //删除一个cookie:添加第三个Cookie 用这个cookie来毁掉以前的那个cookie 达到删除的效果!
        cookie = new Cookie("username","");//这边得用"",不能用null
        cookie.setPath("/");//设置成跟写入cookies同样的
        cookie.setMaxAge(0);
        response.addCookie(cookie);
        //添加到HTTP头部信息:让头部携带token信息!
        response.setHeader("token","bb999888");
        //返回响应报文主体数据!
        return "来自后台的数据!";
    }

结果输出

Cookie长度:5
cookie:cookieKey=cookieValue
头部信息以下
request.getHeader("user-agent") = :Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:60.0) Gecko/20100101 Firefox/60.0
request.getHeader("Referer") = :http://localhost:8080/
request.getHeader("Accept") = :text/plain, */*; q=0.01
request.getHeader("Host"):localhost:8080
request.getHeader("aa"):this is my headerData
请求的基本信息以下
request.getRequestURL() = :http://localhost:8080/postTest.do
request.getRequestURI() = :/postTest.do
request.getRemoteHost() = :0:0:0:0:0:0:0:1
request.getRemotePort() = :50403
request.getLocalAddr() = :0:0:0:0:0:0:0:1
request.getLocalName() = :localhost
request.getMethod() = :POST
解析HTTP POST方式的报文主体以下:
request.getInputStream()解析的报文主体 = this is client request data

 

 

 

1. $.ajax()发送请求带上头部信息前端

$('#btn').click(function () {
        var inVal =  $('#inVal').val();
        $.ajax({
            url: "postTest.do",
            headers:{"appId":"123","appKey":"456"},
            type: "POST",
            dataType: "text",
            contentType:"application/text;charset=UTF-8",
            data:inVal,
            success: function(data) {
                alert(data);
            },
            error: function() {
                alert("请求出错!");
            }
        });

    });

2. 接收头部信息并返回接收的主体信息java

@RequestMapping(value="postTest.do",method= RequestMethod.POST,produces = "application/text;charset=UTF-8;")
    @ResponseBody
    public String postTest2(@RequestBody String data,@RequestHeader("appId") String appId){
        System.out.println("\n\ndata = :"+data);
        System.out.println("\n\nappId = :"+appId);
        return data;
    }

基于$.ajax()提交

1、解析POST请求(内容放在HTTP报文主体中)

$.ajax POST请求

$.ajax({
            url: "postTest.do?",
            type: "POST",
            dataType: "text",
            contentType:"application/text;charset=UTF-8",
            data: {"key1":"val1","key2":"val2"},
            success: function(data) {
                alert(data);
            },
            error: function() {
                alert("请求出错!");
            }
        });

java后台代码:

主要经过request.getInputStream()来接收HTTP报文主体内容!jquery

@RequestMapping(value="postTest.do",method= RequestMethod.POST,produces = "application/text;charset=UTF-8;")
    @ResponseBody
    public String postTest(HttpServletRequest request) throws IOException {
        System.out.println("请求的基本信息以下");
        System.out.println("request.getRequestURL() = :"+request.getRequestURL());
        System.out.println("request.getRequestURI() = :"+request.getRequestURI());//可用于REST API构建!
        System.out.println("request.getRemoteHost() = :"+request.getRemoteHost());
        System.out.println("request.getRemotePort() = :"+request.getRemotePort());
        System.out.println("request.getLocalAddr() = :"+request.getLocalAddr());
        System.out.println("request.getLocalName() = :"+request.getLocalName());
        System.out.println("request.getMethod() = :"+request.getMethod());
        System.out.println("解析HTTP POST方式的报文主体以下:");
        System.out.println("request.getParameter(\"aa\") = :"+request.getParameter("aa"));
        DataInputStream in = new DataInputStream(request.getInputStream());
        int totalBytes = request.getContentLength();
        byte[] b = new byte[totalBytes];
        in.readFully(b);
        in.close();
        String reqContent = new String(b, "UTF-8");
        System.out.println("request.getInputStream()解析的报文主体 = "+reqContent);
        System.out.println("头部信息以下");
        System.out.println("request.getHeader(\"user-agent\") = :"+request.getHeader("user-agent"));
        System.out.println("request.getHeader(\"Referer\") = :"+request.getHeader("Referer"));
        System.out.println("request.getHeader(\"Accept\") = :"+request.getHeader("Accept"));
        System.out.println("request.getHeader(\"Host\"):"+request.getHeader("Host"));
        return "来自后台的数据!";
    }

打印输出以下:

请求的基本信息以下
request.getRequestURL() = :http://localhost:8080/postTest.do
request.getRequestURI() = :/postTest.do
request.getRemoteHost() = :0:0:0:0:0:0:0:1
request.getRemotePort() = :55300
request.getLocalAddr() = :0:0:0:0:0:0:0:1
request.getLocalName() = :localhost
request.getMethod() = :POST
解析HTTP POST方式的报文主体以下:
request.getParameter("aa") = :null
request.getInputStream()解析的报文主体 = key1=val1&key2=val2
头部信息以下
request.getHeader("user-agent") = :Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:60.0) Gecko/20100101 Firefox/60.0
request.getHeader("Referer") = :http://localhost:8080/
request.getHeader("Accept") = :text/plain, */*; q=0.01
request.getHeader("Host"):localhost:8080

2、解析GET请求参数(放在HTTP URL上)

$.ajax GET请求

$.ajax({
            url: "postTest.do?",
            type: "GET",
            dataType: "text",
            contentType:"application/text;charset=UTF-8",
            data: {"key1":"val1","key2":"val2"},
            success: function(data) {
                alert(data);
            },
            error: function() {
                alert("请求出错!");
            }
        });

java后台代码:

主要经过request.getQueryString()来接收HTTP的参数列表(放在URL部分)!web

@RequestMapping(value="postTest.do",method= RequestMethod.GET,produces = "application/text;charset=UTF-8;")
    @ResponseBody
    public String postTest(HttpServletRequest request) throws IOException {
        System.out.println("GET请求的参数数据");
        System.out.println("\nrequest.getQueryString() = :"+request.getQueryString());
        System.out.println("请求的基本信息以下");
        System.out.println("request.getRequestURL() = :"+request.getRequestURL());
        System.out.println("request.getRequestURI() = :"+request.getRequestURI());//可用于REST API构建!
        System.out.println("request.getRemoteHost() = :"+request.getRemoteHost());
        System.out.println("request.getRemotePort() = :"+request.getRemotePort());
        System.out.println("request.getLocalAddr() = :"+request.getLocalAddr());
        System.out.println("request.getLocalName() = :"+request.getLocalName());
        System.out.println("request.getMethod() = :"+request.getMethod());
        System.out.println("头部信息以下");
        System.out.println("request.getHeader(\"user-agent\") = :"+request.getHeader("user-agent"));
        System.out.println("request.getHeader(\"Referer\") = :"+request.getHeader("Referer"));
        System.out.println("request.getHeader(\"Accept\") = :"+request.getHeader("Accept"));
        System.out.println("request.getHeader(\"Host\"):"+request.getHeader("Host"));
        return "来自后台的数据!";
    }

打印输出

GET请求的参数数据

request.getQueryString() = :&key1=val1&key2=val2
请求的基本信息以下
request.getRequestURL() = :http://localhost:8080/postTest.do
request.getRequestURI() = :/postTest.do
request.getRemoteHost() = :0:0:0:0:0:0:0:1
request.getRemotePort() = :56121
request.getLocalAddr() = :0:0:0:0:0:0:0:1
request.getLocalName() = :localhost
request.getMethod() = :GET
头部信息以下
request.getHeader("user-agent") = :Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:60.0) Gecko/20100101 Firefox/60.0
request.getHeader("Referer") = :http://localhost:8080/
request.getHeader("Accept") = :text/plain, */*; q=0.01
request.getHeader("Host"):localhost:8080

基于Form提交的处理

普通表单提交

HTML

<form action="postTest.do" method="GET" accept-charset="UTF-8">
        <p>First name: <input type="text" name="userName" /></p>
        <p>Last name: <input type="text" name="passWord" /></p>
        <input type="submit" value="提交表单" />
    </form>

java后台:

request.getParameter()都可接收POST和GET请求的表单数据,均可以用request.getParameter("passWord"));方法来解析表单数据!ajax

request.getQueryString()不可用于POST请求。spring

@RequestMapping(value="postTest.do",method= RequestMethod.GET,produces = "application/text;charset=UTF-8;")
    @ResponseBody
    public String postTest(HttpServletRequest request) throws IOException {
        System.out.println("POST请求的参数数据");
        String str = "";
        String reqMethod = request.getMethod();
        if(reqMethod.equals("GET"))
            str = request.getQueryString();
        else//POST
            str = request.getParameter("userName");
        String  cs= URLDecoder.decode(str,"utf-8");//将中文转码
        System.out.println("userName = :"+cs);
        System.out.println("passWord = :"+request.getParameter("passWord"));
        System.out.println("请求的基本信息以下");
        System.out.println("request.getRequestURL() = :"+request.getRequestURL());
        System.out.println("request.getRequestURI() = :"+request.getRequestURI());//可用于REST API构建!
        System.out.println("request.getRemoteHost() = :"+request.getRemoteHost());
        System.out.println("request.getRemotePort() = :"+request.getRemotePort());
        System.out.println("request.getLocalAddr() = :"+request.getLocalAddr());
        System.out.println("request.getLocalName() = :"+request.getLocalName());
        System.out.println("request.getMethod() = :"+request.getMethod());
        System.out.println("头部信息以下");
        System.out.println("request.getHeader(\"user-agent\") = :"+request.getHeader("user-agent"));
        System.out.println("request.getHeader(\"Referer\") = :"+request.getHeader("Referer"));
        System.out.println("request.getHeader(\"Accept\") = :"+request.getHeader("Accept"));
        System.out.println("request.getHeader(\"Host\"):"+request.getHeader("Host"));
        return "来自后台的数据!";
    }

打印

POST请求的参数数据
userName = :userName=张三&passWord=123456
passWord = :123456
请求的基本信息以下
request.getRequestURL() = :http://localhost:8080/postTest.do
request.getRequestURI() = :/postTest.do
request.getRemoteHost() = :0:0:0:0:0:0:0:1
request.getRemotePort() = :60414
request.getLocalAddr() = :0:0:0:0:0:0:0:1
request.getLocalName() = :localhost
request.getMethod() = :GET
头部信息以下
request.getHeader("user-agent") = :Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:60.0) Gecko/20100101 Firefox/60.0
request.getHeader("Referer") = :http://localhost:8080/
request.getHeader("Accept") = :text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
request.getHeader("Host"):localhost:8080

上传文件的表单提交:

添加依赖(同时须要两个依赖!)

<!--上传文件-->
    <dependency>
      <groupId>commons-fileupload</groupId>
      <artifactId>commons-fileupload</artifactId>
      <version>1.3.2</version>
    </dependency>
      <dependency>
          <groupId>commons-net</groupId>
          <artifactId>commons-net</artifactId>
          <version>1.4.1</version>
      </dependency>

配置:在bean的配置文件中添加!

<!--上传文件-->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="maxUploadSize" value="1000000"></property>
    </bean>

HTML几个必须

a. enctype="multipart/form-data浏览器

b. 必须为POST请求:method="POST"服务器

<form enctype="multipart/form-data" action="postTest.do" method="POST" accept-charset="UTF-8">
        <input type="file" name="file">
        <input type="submit" value="上传" />
    </form>

java接收:一个必须

必需要MultipartFile类对象来接收!

@RequestMapping(value="postTest.do",method= RequestMethod.POST,produces = "application/text;charset=UTF-8;")
    @ResponseBody
    public String postTest(@RequestParam("file") MultipartFile file) {
        System.out.println("\n\n fileName = :"+file.getOriginalFilename());
        return "来自后台的数据!";
    }

基于$.ajax的接收并解析响应

js

$('#btn').click(function () {
        $.ajax({
            url: "postTest.do",
            type: "POST",
            dataType: "text",
            contentType:"application/text;charset=UTF-8",
            success: function(data,status,xmlhttp) {
                alert(data);
                alert(status);
                alert(xmlhttp.status);
                //响应实体的类型由 responseType 来指定, 能够
                alert(xmlhttp.responseText);
                //打印全部的头部信息
                alert(xmlhttp.getAllResponseHeaders());
                //按照key-value的形式取出响应的头部信息
                alert(xmlhttp.getResponseHeader('Content-Type'));
                alert('token='+xmlhttp.getResponseHeader('token'));
            },
            error: function() {
                alert("请求出错!");
            }
        });

    });

java(并写入token在响应HTTP的头部)

@RequestMapping(value="postTest.do",method= RequestMethod.POST,produces = "application/text;charset=UTF-8;")
    @ResponseBody
    public String postTest(HttpServletRequest request, HttpServletResponse response){
        response.setHeader("token","bb999888");
        return "来自后台的数据!";
    }

带上cookie

@RequestMapping(value="postTest.do",method= RequestMethod.POST,produces = "application/text;charset=UTF-8;")
    @ResponseBody
    public String postTest(HttpServletRequest request, HttpServletResponse response) throws IOException {
        Cookie[] cookies = request.getCookies();
        System.out.println("Cookie长度:" + cookies.length);           //读取本机共存在多少COOKIE
        if (cookies != null) {
            for (int i = 0; i < cookies.length; i++) {
                if (cookies[i].getName().equals("username")) {
                    System.out.println("cookie:username=" + URLDecoder.decode(cookies[i].getValue(),"UTF-8"));
                }
            }
        } else {
            System.out.println("没有任何Cookie");
        }

        //建立一个cookie
        Cookie cookie = new Cookie("key1", "cookieValue1");
        cookie.setPath("/");// 这个要设置
        // cookie.setDomain(".zhangsan.com");//这样设置,能实现两个网站共用
        cookie.setMaxAge(365 * 24 * 60 * 60);// 不设置的话,则cookies不写入硬盘,而是写在内存,只在当前页面有用,以秒为单位,关闭浏览器就没了
        response.addCookie(cookie);         //添加cookie到响应对象中
        //建立第二个cookie
        cookie = new Cookie("key2", "cookieValue2");
        cookie.setPath("/");
        cookie.setMaxAge(365 * 24 * 60 * 60);
        response.addCookie(cookie);         //添加cookie到响应对象中
        //删除一个cookie:添加第三个Cookie 用这个cookie来毁掉以前的那个cookie 达到删除的效果!
        cookie = new Cookie("username","");//这边得用"",不能用null
        cookie.setPath("/");//设置成跟写入cookies同样的
        cookie.setMaxAge(0);
        response.addCookie(cookie);
        return "来自后台的数据!";
    }
相关文章
相关标签/搜索