http请求get与post请求的几种实现
[说明]:非原创,前两种post请求需要依赖Apache开源框架来实现;最后一种get/post请求则不需要依赖第三方框架
普通表单调用(post请求)
/**
* 普通表单调用
* 根据参数url,处理post请求,获取远程返回的response,然后返回相对应的ActionResult
*
*/
public ActionResult post(String url, Map<String,String> params){
/**
1.创建httpClient对象
2.创建HttpPost对象
3.设置post请求的实体内容
4.通过HttpPost对象执行post请求,获得response
5.获得response的实体内容(json格式),将实体内容转换成字符串(实际上是json格式的字符串),最后将json字符串转换成ActionResult对象
*/
DefaultHttpClient httpClient = new DefaultHttpClient(); HttpPost post = new HttpPost(url); List<NameValuePair> nvps = new ArrayList<NameValuePair>(); for(Map.Entry<String,String> entry : params.entrySet()){ nvps.add(new BasicNameValuePair(entry.getKey(),entry.getValue())); }
try{ post.setEntity(new UrlEncodedFormEntity(nvps,charsetName)); HttpResponse response = httpClient.execute(post); HttpEntity entity = response.getEntity(); return JsonUtils.fromString(EntityUtils.toString(entity,"utf-8"),ActionResult.class); }catch(Exception e){ e.printStackTrace(); return null; }finally{
try{ httpClient.getConnetionManager.shutdown(); }catch(Exception e){
e.printStackTrace();
}
}
}
带文件上传的表单
/**
*带文件上传的表单
*
*/
public ActionResult postWithFile(String url, Map<String,Object> params){
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpPost post = new HttpPost(url);
MultipartEntity reqEntity = new MultipartEntity();
try{
for(Map.Entry<String, Object> entry : params.entrySet()){
String key = entry.getKey();
Object value = entry.getValue();
if(value instanceof File){
File file = (File)value;
FileBody fileBody = new FileBody(file);
reqEntity.addPart(key,fileBody);
}else{
StringBody stringBody = new StringBody(String.valueOf(value),Charset.forName("utf-8"));
reqEntity.addPart(key, stringBody);
}
}
post.setEntity(reqEntity);
HttpResponse response = httpClient.execute(post);
HttpEntity entity = response.getEntity();
return JsonUtils.fromString(EntityUtils.toString(entity,"utf-8"),
ActionResult.class);
}catch(Exception e){
e.printStackTrace();
return null;
}finally{
try{
httpClient.getConnetionManager.shutdown();
}catch(Exception e){
e.printStackTrace();
}
}
}
不依赖第三发jar包实现,处理get请求以及普通post请求的方法
/**
*不依赖第三发jar包实现,处理get请求以及普通post请求的方法
*
*/
public String getOrPost(String type, String url, String encoding, String contentType, String params, HttpServletRequest request){
/**
* 1.确定编码和contentType
2.确定url:如果传入url不包含http,则应当重新组装url
3.确定请求参数(GET请求)
4.创建URLConnection对象
5.设置URLConnection对象的属性(请求方式/是否使用缓存/本次连接是否自动处理重定向/UA/Accept/)
如果是post请求,则必须设置DoInput,DoOutput,Content-Type
post请求不能使用缓存(设置http请求头属性)
6.创建真实连接
7.如果是post请求,则设置http请求正文
8.获取远程返回的InputStream,读取InputStream,返回结果
9.关闭流,断开连接
*
*/
encoding = encoding==null ? "utf-8" : encoding; contentType = contentType==null ? "application/x-www-form-urlencoded" : contentType; if(!url.startsWith("http://") && !url.startsWith("https://") && request!=null){
url = getBasePath(request)+url;
} if("GET".equals(type) && notEmtpy(params)){
if(!url.contains("?")){
url+="?"+params;
}else{
url+="&"+params;
}
} HttpURLConnection conn = (HttpURLConnection)new URL(url).openConnection(); //设置请求头
conn.setRequestMethod(type);
conn.setUseCaches(false);
conn.setInstanceFollowRedirects(true);
conn.setRequestProperty("user-agent",
"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31");
conn.setRequestProperty("accept","*/*"); if("POST".equals(type)){
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setRequestProperty("Content-Type",contentType);
} //实际上只是建立了一个与服务器的TCP连接,并没有发送http请求;
//只有在执行conn.getInputStream()时,才真正发送http请求
conn.connect(); //设置请求正文(POST请求)
if("POST".equals(type)){
OutputStreamWriter out = new OutputStreamWriter(conn.getOutputStream(),encoding);
out.write(params);
out.flush();
out.close();
} //获取数据
BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(),Charset.forName(encoding)));
String str;
StringBuffer sb = new StringBuffer("");
while((str = br.readLine())!= null){
sb.append(str);
}
br.close();
conn.disconnect();
return sb.toString(); }
http请求get与post请求的几种实现的更多相关文章
- IIS请求筛选模块被配置为拒绝超过请求内容长度的请求
HTTP错误404.13 - Not Found 请求筛选模块被配置为拒绝超过请求内容长度的请求,原因是Web服务器上的请求筛选被配置为拒绝该请求,因为内容长度超过配置的值(IIS 7 默认文件上传大 ...
- Android okHttp网络请求之Get/Post请求
前言: 之前项目中一直使用的Xutils开源框架,从xutils 2.1.5版本使用到最近的xutils 3.0,使用起来也是蛮方便的,只不过最近想着完善一下app中使用的开源框架,由于Xutils里 ...
- 普通B/S架构模式同步请求与AJAX异步请求区别(个人理解)
在上次面试的时候有被问到过AJAX同步与异步之间的概念问题,之前没有涉及到异步与同步的知识,所以特意脑补了一下,不是很全面... 同步请求流程:提交请求(POST/GET表单相似的提交操作)---服务 ...
- x-requested-with 请求头 区分ajax请求还是普通请求(转)
在服务器端判断request来自Ajax请求(异步)还是传统请求(同步): 两种请求在请求的Header不同,Ajax 异步请求比传统的同步请求多了一个头参数 1.传统同步请求参数 accept t ...
- HTTP错误404.13 - Not Found 请求筛选模块被配置为拒绝超过请求内容长度的请求
http://www.cnblogs.com/JKqingxinfeng/archive/2012/10/29/2744663.html HTTP错误404.13 - Not Found 请求筛选模块 ...
- zzy:请求静态资源和请求动态资源, src再次请求服务器资源
[总结可以发起请求的阶段:请求动态资源:通过web.xml匹配action然后,自定义Servlet处理该action1)form表单提交请求的时候,用action设定,该页面发起请求的Servlet ...
- HTTP协议---HTTP请求中的常用请求字段和HTTP的响应状态码及响应头
http://blog.csdn.net/qxs965266509/article/details/8082810 用于HTTP请求中的常用请求头字段 Accept:用于高速服务器,客户机支持的数据类 ...
- HTTP 笔记与总结(2 )HTTP 协议的(请求行的)请求方法 及 (响应行的)状态码
(请求行的)请求方法 包括: GET,POST,HEAD,PUT,TRACE,DELETE,OPTIONS 注意:这些请求方法虽然是 HTTP 协议规定的,但是 Web Server 未必允许或支持这 ...
- WebApi接口传参不再困惑(4):传参详解 一、get请求 二、post请求 三、put请求 四、delete请求 五、总结
前言:还记得刚使用WebApi那会儿,被它的传参机制折腾了好久,查阅了半天资料.如今,使用WebApi也有段时间了,今天就记录下API接口传参的一些方式方法,算是一个笔记,也希望能帮初学者少走弯路.本 ...
随机推荐
- 搭建consul 集群
1. 准备工作 a) 启动三台虚拟机 s1:10.1.7.141 s2:10.1.7.139 s3:10.1.7.138 b) 每台机器上在 /home新建文件夹 mkdir ...
- 悲剧啊!Mysql的上古BUG!!!
导读 这是MySQL8.0修复的上古bug之一,在2003年由Percona的CEO(当时应该还没Percona吧)提出的bug#199,光看这bug号就扑面而来一股上古时代的沧桑气息. 问题的本质在 ...
- dell md3200i mdss (企业管理) 安装的那点事儿
首先获取安装包,解压后如图: 我是在windows 机上安装,所以执行windows 文件夹下的可执行程序: 双击红箭头文件,进行安装,步骤截图如下: 出现最后这个界面,就说明安装成功,直接重启系统就 ...
- 算法练习_图的连通性问题(JAVA)
一.问题 1.问题描述: 有n个点(1...n),输入整数对(8,9),表示8,9点之间存在相互的连接关系. 动态连通性问题--编写一段程序过滤掉所以无意义的整数对,即为在不破坏图连通性的前提下,以最 ...
- POJ2777
http://poj.org/problem?id=2777 前几天看到一个大神说,要搞,就搞专题或者套题,我觉得现在这么菜的我,还是搞搞专题吧. 一道比较裸也比较基础的线段树的题目. 题意:就是有一 ...
- 2015 史考特(Scottrade)开户指南 + 招商银行香港一卡通汇款【图文教程】
最近刚开始炒美股.总的来说分为两步:一是开户,即选一个美股券商开设股票交易账户:二是汇款注资,把人民币换成美元转账到股票交易账户上.上述第一点其实相对简单,美股券商大多都对美国以外的外国人开放申请,且 ...
- Android知识点总结[转]
- curses.h的安装和使用
gcc test.c -o test 用以上命令编译包含curses.h头文件的程序时会出现各种引用未定义的错误,并且已经安装了 kernel-devel ncurese-devel ncurese- ...
- JS获取浏览器窗口大小 获取屏幕,浏览器,网页高度宽度
网页可见区域宽:document.body.clientWidth 网页可见区域高:document.body.clientHeight 网页可见区域宽:document.body.offsetWid ...
- Myeclipse导包总是报错,jar包路径都没问题
是访问限制报错. 方法一: 全局属性Project>preferences>java>Compiler>Errors/Warnings>把右侧的[Deprecated a ...