一起探讨下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吧
一起探讨下POST、GET请求的更多相关文章
- ie浏览器下,get请求缓存问题
1 使用get请求数据 1)Java代码 $.getJSON("sortShow!sortShow?time="+new Date().getTime(),function(){} ...
- 程序员节应该写博客之.NET下使用HTTP请求的正确姿势
程序员节应该写博客之.NET下使用HTTP请求的正确姿势 一.前言 去年9月份的时候我看到过外国朋友关于.NET Framework下HttpClient缺陷的分析后对HttpClient有了一定的了 ...
- .NET下使用HTTP请求的正确姿势
来源:Lewis.Zou cnblogs.com/modestmt/p/7724821.html 一.前言 去年9月份的时候我看到过外国朋友关于.NET Framework下HttpClient缺陷的 ...
- LB+nginx+tomcat7集群模式下的https请求重定向(redirect)后变成http的解决方案
0. 环境信息 Linux:Linux i-8emt1zr1 2.6.32-573.el6.x86_64 #1 SMP Wed Jul 1 18:23:37 EDT 2015 x86_64 x86_6 ...
- angular js 在ie11 下的get请求缓存问题的解决办法
使用angularjs 1.x开发的应用在ie11 下回碰到各种怪异的情况:一般表现在:卡,慢,丑. 还有另外一种情况,就是:get请求被缓存,导致页面数据没有刷新.今天我们就来解决这个问题. 几行代 ...
- spring 4.x下让http请求返回json串
当前很多应用已经开始将响应返回为json串,所以基于springframework框架开发的服务端程序,让响应返回json字符串成为了一种常用手段. 这里介绍一下如何在spring-MVC框架下方便快 ...
- c# .net core 下的网络请求
本文章是在VS2017的环境下,.net core 1.1版本以上. 在这期间,由于.net core 并不基于IIS,我们的过去的网络请求代码在.net core框架下,有可能会出现不兼容,报错的现 ...
- 在Owin Self-Hosing下实现每个请求中共享上下文(数据)
问题 这几天在做公司的外部WebApi网关,由于使用了OAuth2.0,所以不得不使用Owin来部署网关. 而涉及到请求上下文的问题,为了使业务层能获取到请求头的信息,又不与网关耦合,决定把请求信息写 ...
- webapi下的web请求
先看webapi提供的服务: [HttpPost] public ResultBaseModel SiteList(SiteModel param) { ResultBaseModel resultM ...
随机推荐
- 剑指offer---4、序列化二叉树
剑指offer---4.序列化二叉树 一.总结 一句话总结: 1. 对于序列化:使用前序遍历,递归的将二叉树的值转化为字符,并且在每次二叉树的结点不为空时,在转化val所得的字符之后添加一个' , ' ...
- ACM中java的使用 (转)
ACM中java的使用 这里指的java速成,只限于java语法,包括输入输出,运算处理,字符串和高精度的处理,进制之间的转换等,能解决OJ上的一些高精度题目. 1. 输入: 格式为:Scanner ...
- iview+vue 使用中遇到的问题(分页)
1.分页默认页数 当页面只有一个功能需要分页组件时,引用iview分页组件当然没问题.当一个页面中有多个需要分页组件的时候,便容易出现问题.例如:在项目中有多个不同的表格需要分页功能,几个表格共用一个 ...
- USACO 6.3 章节 你对搜索和剪枝一无所知QAQ
emmm........很久很久以前 把6.2过了 所以emmmmmm 直接跳过 ,从6.1到6.3吧 Fence Rails 题目大意 N<=50个数A1,A2... 1023个数,每个数数值 ...
- “希希敬敬对”队软件工程第九次作业-beta冲刺第四次随笔
“希希敬敬对”队软件工程第九次作业-beta冲刺第四次随笔 队名: “希希敬敬对” 龙江腾(队长) 201810775001 杨希 201810812008 何敬 ...
- 开发环境绑定host vue 返回 invalid host header
事情:使用域名绑定host为本机电脑ip,vue返回 invalid host header 原因:新版的webpack-dev-server出于安全考虑,默认检查hostname,如果hostnam ...
- Unity接入AbMob踩坑记
之前是配置好的环境,不知道怎么突然就不正常了. 一直弹出下面的报错: Error running CocoaPods. Please ensure you have at least version ...
- java并发编程之美-阅读记录3
java并发包中的ThreadLocalRandom类,jdk1.7增加的随机数生成器 Random类的缺点:是多个线程使用同一个原子性的种子变量,导致对原子变量的更新产生竞争,降低了效率(该类是线程 ...
- 背包九讲(Orz)
P01: 01背包问题 题目 有\(N\)件物品和一个容量为\(V\)的背包.第\(i\)件物品的费用是\(c[i]\),价值是\(w[i]\).求解将哪些物品装入背包可使这些物品的费用总和不超过背包 ...
- setbuf, setbuffer, setlinebuf, setvbuf - 流缓冲操作
SYNOPSIS 总览 #include <stdio.h> void setbuf(FILE *stream, char *buf); void setbuffer(FILE *stre ...