[说明]:非原创,前两种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请求的几种实现的更多相关文章

  1. IIS请求筛选模块被配置为拒绝超过请求内容长度的请求

    HTTP错误404.13 - Not Found 请求筛选模块被配置为拒绝超过请求内容长度的请求,原因是Web服务器上的请求筛选被配置为拒绝该请求,因为内容长度超过配置的值(IIS 7 默认文件上传大 ...

  2. Android okHttp网络请求之Get/Post请求

    前言: 之前项目中一直使用的Xutils开源框架,从xutils 2.1.5版本使用到最近的xutils 3.0,使用起来也是蛮方便的,只不过最近想着完善一下app中使用的开源框架,由于Xutils里 ...

  3. 普通B/S架构模式同步请求与AJAX异步请求区别(个人理解)

    在上次面试的时候有被问到过AJAX同步与异步之间的概念问题,之前没有涉及到异步与同步的知识,所以特意脑补了一下,不是很全面... 同步请求流程:提交请求(POST/GET表单相似的提交操作)---服务 ...

  4. x-requested-with 请求头 区分ajax请求还是普通请求(转)

    在服务器端判断request来自Ajax请求(异步)还是传统请求(同步): 两种请求在请求的Header不同,Ajax 异步请求比传统的同步请求多了一个头参数 1.传统同步请求参数 accept  t ...

  5. HTTP错误404.13 - Not Found 请求筛选模块被配置为拒绝超过请求内容长度的请求

    http://www.cnblogs.com/JKqingxinfeng/archive/2012/10/29/2744663.html HTTP错误404.13 - Not Found 请求筛选模块 ...

  6. zzy:请求静态资源和请求动态资源, src再次请求服务器资源

    [总结可以发起请求的阶段:请求动态资源:通过web.xml匹配action然后,自定义Servlet处理该action1)form表单提交请求的时候,用action设定,该页面发起请求的Servlet ...

  7. HTTP协议---HTTP请求中的常用请求字段和HTTP的响应状态码及响应头

    http://blog.csdn.net/qxs965266509/article/details/8082810 用于HTTP请求中的常用请求头字段 Accept:用于高速服务器,客户机支持的数据类 ...

  8. HTTP 笔记与总结(2 )HTTP 协议的(请求行的)请求方法 及 (响应行的)状态码

    (请求行的)请求方法 包括: GET,POST,HEAD,PUT,TRACE,DELETE,OPTIONS 注意:这些请求方法虽然是 HTTP 协议规定的,但是 Web Server 未必允许或支持这 ...

  9. WebApi接口传参不再困惑(4):传参详解 一、get请求 二、post请求 三、put请求 四、delete请求 五、总结

    前言:还记得刚使用WebApi那会儿,被它的传参机制折腾了好久,查阅了半天资料.如今,使用WebApi也有段时间了,今天就记录下API接口传参的一些方式方法,算是一个笔记,也希望能帮初学者少走弯路.本 ...

随机推荐

  1. php 路径的理解

      当php文件用require方式包含了另外一个文件,这另外文件引用的图片是相对目录下的内容时,而该相对目录是指包含目录的文件的 -----index.php -----default 目录 --- ...

  2. Sql Server创建函数

    在使用数据库的过程中,往往我们需要对有的数据先进行计算,然后再查询出来,所以我们就需要创建函数来完成这项任务,在数据库的Programmability(如图1)下面的Function中创建函数(如图2 ...

  3. ES6学习笔记一

    块级作用域:在ES5中只有全局作用域与函数作用域,ES6中新增的块级作用域避免变量的覆盖与泄露.考虑到代码运行环境,在块级作用域中应避免声明函数,最好用函数表达式的方式声明. let与const:le ...

  4. css中margin的应用

    1.margin用于设置外边距,没有继承性,父元素设置的margin属性子元素不会继承. 2.margin存在重叠的问题. 水平边距永远不会发生重叠. 垂直边距在特定情况下会重叠. 重叠问题都很容易解 ...

  5. 掌握 Linux PC 性能之基准测试

    导读 基准测试是一项测试或一系列测试,用来确定某个计算机硬件运行起来的状况有多好:在许多情况下,“基准测试”实际上等同于“压力测试”,通过测试硬件的极限,然后可以将测得的结果与其他硬件测得的结果作一番 ...

  6. sql server2008根据经纬度计算两点之间的距离

    --通过经纬度计算两点之间的距离 create FUNCTION [dbo].[fnGetDistanceNew] --LatBegin 开始经度 --LngBegin 开始维度 --29.49029 ...

  7. ASP.NET MVC 5 使用autofac实现DI

    使用Nuget添加Autofac.MVC的引用 启动项设置 注册Controller 注册ModelBinder 注册相关的web abstraction 为View层启用属性注入 为Action F ...

  8. RIDE -- Robot Framework setup

    RobotFramework 是一款基于python 的可以实现关键字驱动和数据驱动并能够生成比较漂亮的测试报告的一款测试框架 这里使用的环境是 python-2.7.10.amd64.msi RID ...

  9. 得静下心来看python了。

    陆陆续续看了些python爬虫的相关知识.今天找到了这篇博客不错就看这个,明天看到那个又很好又跑去看那个. 来来回回耽误不少时间.接下来不能再这样了,老老实实就看xlzd.me博客和Python实战: ...

  10. ztree-demo 2

    <!DOCTYPE html> <HTML> <HEAD> <TITLE> ZTREE DEMO - Async</TITLE> <m ...