• tomcat中http协议的get请求与post请求 是如何携带参数的


    HTTP协议简介

    http(Hypertext transfer protocol)超文本传输协议,通过浏览器和服务器进行数据交互,进行超文本(文本、图片、视频等)传输的规定。也就是说,http协议规定了超文本传输所要遵守的规则。但HTTP协议的本质是一段在网络环境中传输的文本,这段文本包含特定的格式。这些格式包括请求行,请求头,请求体等等。

    在http请求中比较常用的请求方法是get请求与post请求。

    在java web中:

    如果是get请求,参数需要拼接在URL的查询字符串中才能被服务器端接收。

    如果是post请求,在请求体与URL中的查询字符串中携带的参数都可以被服务器端接收。

    在发送get请求时,客户端向服务器端传递的参数一般是通过URL中的查询字符(querystring)串携带的,在请求体中的参数服务器端是接收不到的。在发送post请求时 ,查询字符串请求体中的参数都可以被接收到,我们写一个Servlet来验证一下tomcat是如何获取get与post请求中的参数的。

    get请求实验

    servlet代码:

    package com.haojie.servlet;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    public class LoginServlet extends HttpServlet {
    
        @Override
        protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            String queryString = req.getQueryString();
            System.out.println("queryString="+queryString);
    
            System.out.println("username="+req.getParameter("username"));
            System.out.println("password="+req.getParameter("password"));
            System.out.println("age="+req.getParameter("age"));
            System.out.println("address="+req.getParameter("address"));
        }
    
    
    }
    

    postman发送get请求

    如上图所示,用postman发送一个get请求,在查询字符串中传递username与password这两个参数,在请求体中携带age与address这两个参数

    servlet中 接收get请求参数结果

    运行结果如上图所示,在servlet中没有获取到请求体中传递的参数

    通过socket接收get请求

    我们通过自己写的socket程序来接收postman发送的http请求,看看打印的http协议是怎么样的。

    package com.haojie.socket;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.InetAddress;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    
    public class HttpListener {
    
        public static void main(String[] args) throws IOException {
    
            ServerSocket serverSocket = null;
            int port = 8080;
            try {
                serverSocket = new ServerSocket(port, 1, InetAddress.getByName("127.0.0.1"));
            } catch (IOException e) {
                e.printStackTrace();
                System.exit(1);
            }
    
    
            Socket clntSock = serverSocket.accept();
            InputStream input = clntSock.getInputStream();
            OutputStream output= clntSock.getOutputStream();
            StringBuffer request = new StringBuffer(2048);
            int i;
            byte[] buffer = new byte[2048];
            try {
                i = input.read(buffer);
            } catch (IOException e) {
                e.printStackTrace();
                i = -1;
            }
            for (int j = 0; j < i; j++) {
                request.append((char) buffer[j]);
            }
            // 打印http协议内容
            System.out.println(request);
            // file not found
            String errorMessage = "HTTP/1.1 200 success
    " +
                    "Content-Type: text/html
    " +
                    "Content-Length: 23
    " +
                    "
    " +
                    "<h1>success</h1>";
            output.write(errorMessage.getBytes());
    
            clntSock.close();
    
    
    
    
        }
    
    }
    
    
    
    

    运行结果如下:

    从上图中我们可以看到,postman发送的http get请求,这个请求中的请求体与查询参数传递的值传递到了服务器端。由此可以知道,http 协议的get请求的请求体也可以携带参数,只是tomcat在遇到get请求时没有从请求体中取参数。

     

    post请求实验

    代码:

    package com.haojie.servlet;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    public class LoginServlet extends HttpServlet {
    
        @Override
        protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            String queryString = req.getQueryString();
            System.out.println("queryString="+queryString);
    
            System.out.println("username="+req.getParameter("username"));
            System.out.println("password="+req.getParameter("password"));
            System.out.println("age="+req.getParameter("age"));
            System.out.println("address="+req.getParameter("address"));
        }
    
    
    }
    

    postman发送post请求

    如上图所示,通过postman发送post请求,在查询字符串与请求体中都传参

    接收post请求结果

    可以看到,在servlet中,通过查询参数与请求体中传递的参数都可以接收到。

    通过socket接收post请求

    代码:

    package com.haojie.socket;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.InetAddress;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    
    public class HttpListener {
    
        public static void main(String[] args) throws IOException {
    
            ServerSocket serverSocket = null;
            int port = 8080;
            try {
                serverSocket = new ServerSocket(port, 1, InetAddress.getByName("127.0.0.1"));
            } catch (IOException e) {
                e.printStackTrace();
                System.exit(1);
            }
    
    
            Socket clntSock = serverSocket.accept();
            InputStream input = clntSock.getInputStream();
            OutputStream output= clntSock.getOutputStream();
            StringBuffer request = new StringBuffer(2048);
            int i;
            byte[] buffer = new byte[2048];
            try {
                i = input.read(buffer);
            } catch (IOException e) {
                e.printStackTrace();
                i = -1;
            }
            for (int j = 0; j < i; j++) {
                request.append((char) buffer[j]);
            }
            // 打印http协议内容
            System.out.println(request);
            // file not found
            String errorMessage = "HTTP/1.1 200 success
    " +
                    "Content-Type: text/html
    " +
                    "Content-Length: 23
    " +
                    "
    " +
                    "<h1>success</h1>";
            output.write(errorMessage.getBytes());
    
            clntSock.close();
    
    
    
    
        }
    
    }
    
    
    
    

    socket接收post请求结果图:

    总结

    在http协议中,get请求与post请求都可以在URL与请求体中携带参数,如果是tomcat来接收http协议,tomcat在遇到get请求时,不会去请求体中获取请求参数,因此在tomcat环境中,不能在get请求的请求体中传递参数,而在post请求时,URL与请求体都可以传递参数。

  • 相关阅读:
    多线程与多进程(4)
    多线程与多进程(2)
    多线程与多进程(1)
    Python爬虫学习(二) ——————爬取前程无忧招聘信息并写入excel
    python学习之爬虫(一) ——————爬取网易云歌词
    str=str.replaceAll("[^a-zA-Z]+", ""); 与 str=str.replaceAll("^[a-zA-Z]+", ""); ^写在里面和写在外面有什么不同,为什么
    java中<T> T和T的区别?
    redis命令
    Linux压缩当前目录下的所有文件-解压
    正则
  • 原文地址:https://www.cnblogs.com/cplinux/p/15412827.html
Copyright © 2020-2023  润新知