• 一起探讨下POST、GET请求


        以下的讨论都是基于java和Spring MVC,主要记录自己的一些练习心得。

        做web网站开发HTTP请求必不可少,一直在使用写好的Utils没有考虑过如何以及为什么,现在闲下来想着捋一捋java的Http客户端。

        实际上http的method不止POST、GET,还包括PUT、DELETE等。但在我们项目中POST、GET能做所有的事,也就没有完全按照HTTP的规定去做。

        先聊聊GET请求。GET会在URL后面会带上参数,例如 http://localhost:8080/testGet?name=bob&age=7。在后台通过@RequestParam String name来获取,也可以通过HttpServerletRequest的getParameter("name")来获取参数。

         接着POST请求。POST需要将参数写入请求体中,链接后面也不必带上参数。这里有些有意思的地方,就是content-type。如果将content-type设置为application/x-www-form-urlencoded,那么你可以将post参数拼接成 name=bob&age=7,然后写入请求体中,后台的获取方式也和GET一样。(如下)

                HttpURLConnection httpURLConnection = (HttpURLConnection) urlConnection;
                httpURLConnection.setRequestMethod(requestMethod);
                httpURLConnection.setConnectTimeout(DEFAULT_CONNECT_TIME_OUT);
                httpURLConnection.setReadTimeout(DEFAULT_READ_TIME_OUT);
                httpURLConnection.setRequestProperty("Accept-Charset", charset);
                httpURLConnection.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
    
                String postData = parseMap2PostData(param, false);
                if (POST.equals(requestMethod)) {
                    httpURLConnection.setDoOutput(true);//控制是否能往output些如数据
    
                    outputStream = httpURLConnection.getOutputStream();
                    outputStreamWriter = new OutputStreamWriter(outputStream);
                    outputStreamWriter.write("name=bob&age=7");
                    outputStreamWriter.flush();
                }
    
                if (httpURLConnection.getResponseCode() != 200) {
                    throw new HttpException("HTTP Request is not success, Response code is " + httpURLConnection.getResponseCode());
                }
    

       但是如果你想传递json格式的参数{"name":"bob",age=7}就需要将Content-type设置为application/json,如果设置为json类型后台就不能通过@RequestParam形式来获取了,需要用到@RequestBody 来注入到一个对象,或者你不想用注解直接读取request.getInputstream()的参数也是可以的。下面一个发送json例子

                HttpURLConnection httpURLConnection = (HttpURLConnection) urlConnection;
                httpURLConnection.setRequestMethod(POST);
                httpURLConnection.setConnectTimeout(DEFAULT_CONNECT_TIME_OUT);
                httpURLConnection.setReadTimeout(DEFAULT_READ_TIME_OUT);
                httpURLConnection.setRequestProperty("Accept-Charset", charset);
                httpURLConnection.setRequestProperty("Content-Type", "application/json");
    
                httpURLConnection.setDoOutput(true);//控制是否能往output些如数据
    
                outputStream = httpURLConnection.getOutputStream();
                outputStreamWriter = new OutputStreamWriter(outputStream);
                outputStreamWriter.write("{"name":""bob, "age":1}");
                outputStreamWriter.flush();

        我的理解POST和GET用法就没有其他的了,下面聊聊自己的一些尝试。

        1.GET和POST的Content-type=application/x-www-form-urlencoded 不同。

         关于相同上面也说了,后台获取一致。不同的是GET方式request.getQueryString()是能得到"name=bob&age=7"但是POST方式为空,进一步说明POST和GET数据传输还是不一样的,网上查资料有人说“GET的参数是在请求头部,POST是在请求体中”。我的理解,请求分为请求行、请求头部和请求体。我监听了header没有这个,那这里说的头部应该是请求行也就是url中。POST不用多说肯定是写到了请求体中。

        2.如果GET请求在请求体上也加上和url 一样的参数会怎么样。POST在链接后面加上?name=jerry&age=8又会怎么样?

         这个问题其实是我在别的地方看到的提问,就做了下实验。就是把POST请求改造下,在url后加上get 参数,把post换成get。通过request.getParameterMap()得到name=jerry,age=8,请求体中bob和age没有获取到。但是我把get换成post,同样request.getParameterMap()得到的确实 name是一个数据[jerry, bob]。说明两个获取参数的方式都执行了,并且叠加了,并且queryString()也拿到了url中的参数。

         最后,我的小实验算是结束了,有什么问题欢迎指正讨论。实验用的是 HttpURLConnection,很多项目用的是Apache的HttpClient,它里面加入了线程池的概念,对于性能上会更好。当然还有OKHttp这个我就不了解了,后续分享关于不同的client的Utils吧

  • 相关阅读:
    【转】浅析Linux中的零拷贝技术
    我们使用 Kafka 生产者在发消息的时候我们关注什么(Python 客户端 1.01 broker)
    【转】Python 访问 HDFS
    HIVE 乱码以及 HUE SQL 语句兼容性的记录(遇到应该会一直更新)
    Kafka 深入核心参数配置
    【转】Hive 修改 table、column
    Redash(开源轻量级商业智能) 生产环境部署及实践 (without docker)
    【转】Linux开机启动管理---systemd使用
    Pyspark 最近使用的一些有趣姿势的梳理
    使用jquery操作select(获取选中option的值等)
  • 原文地址:https://www.cnblogs.com/wangxiangstudy/p/11574886.html
Copyright © 2020-2023  润新知