使用UrlConnection实现后台模拟http请求的简单实例


Posted in Javascript onJanuary 04, 2017

使用UrlConnection实现后台模拟http请求的简单实例

这两天在整理看httpclient,然后想自己用UrlConnection后台模拟实现Http请求,于是一个简单的小例子就新鲜出炉了(支持代理哦):

public class SimpleHttpTest { 
 
  public static String send(String urlStr, Map<String,String> map,String encoding){ 
    String body=""; 
    StringBuffer sbuf = new StringBuffer(); 
    if(map!=null){ 
      for (Entry<String,String> entry : map.entrySet()) { 
        sbuf.append(entry.getKey()).append("=").append(entry.getValue()).append("&"); 
      } 
      if(sbuf.length()>0){ 
        sbuf.deleteCharAt(sbuf.length()-1); 
      } 
    } 
     // 1、重新对请求报文进行 GBK 编码 
    byte[] postData = null; 
    try { 
      postData = sbuf.toString().getBytes(encoding); 
    } catch (UnsupportedEncodingException e) { 
      e.printStackTrace(); 
    } 
 
    // 2、发送 HTTP(S) 请求 
    OutputStream reqStream = null; 
    InputStream resStream = null; 
    URLConnection request = null; 
    try { 
      System.out.println("交易请求地址:" + urlStr); 
      System.out.println("参数:" + sbuf.toString()); 
       
      //A、与服务器建立 HTTP(S) 连接 
      URL url = null; 
      try { 
        Proxy proxy = new Proxy(java.net.Proxy.Type.HTTP,new InetSocketAddress("127.0.0.1", 8087)); 
        url = new URL(urlStr); 
        request = url.openConnection(proxy); 
        request.setDoInput(true); 
        request.setDoOutput(true); 
      } catch (MalformedURLException e) { 
        e.printStackTrace(); 
      } catch (IOException e) { 
        e.printStackTrace(); 
      } 
       
      //B、指定报文头【Content-type】、【Content-length】 与 【Keep-alive】 
      request.setRequestProperty("Content-type", "application/x-www-form-urlencoded"); 
      request.setRequestProperty("Content-length", String.valueOf(postData.length)); 
      request.setRequestProperty("Keep-alive", "false"); 
      request.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)"); 
       
      //C、发送报文至服务器 
      reqStream = request.getOutputStream(); 
      reqStream.write(postData); 
      reqStream.close(); 
       
      //D、接收服务器返回结果 
      ByteArrayOutputStream ms = null; 
      resStream = request.getInputStream(); 
      ms = new ByteArrayOutputStream(); 
      byte[] buf = new byte[4096]; 
      int count; 
      while ((count = resStream.read(buf, 0, buf.length)) > 0) { 
        ms.write(buf, 0, count); 
      } 
      resStream.close(); 
      body = new String(ms.toByteArray(), encoding); 
    } catch (UnknownHostException e) { 
      System.err.println( "服务器不可达【" + e.getMessage() + "】"); 
    } catch (IOException e) { 
      e.printStackTrace(); 
    } finally { 
      try { 
        if (reqStream != null) 
          reqStream.close(); 
        if (resStream != null) 
          resStream.close(); 
      } catch (Exception ex) { 
      } 
    } 
 
    System.out.println("交易响应结果:"); 
    System.out.println(body); 
    return body; 
  } 
   
  public static void main(String[] args) { 
    String url="http://php.weather.sina.com.cn/iframe/index/w_cl.php"; 
    Map<String, String> map = new HashMap<String, String>(); 
    map.put("code", "js"); 
    map.put("day", "0"); 
    map.put("city", "上海"); 
    map.put("dfc", "1"); 
    map.put("charset", "utf-8"); 
    send(url, map,"utf-8"); 
  } 
}

结果如下:

交易请求地址:http://php.weather.sina.com.cn/iframe/index/w_cl.php 
参数:dfc=1&charset=utf-8&day=0&code=js&city=上海 
交易响应结果: 
(function(){var w=[];w['上海']=[{s1:'阴',s2:'阴',f1:'yin',f2:'yin',t1:'17',t2:'14',p1:'≤3',p2:'≤3',
d1:'东北风',d2:'东北风'}];var add={now:'2015-11-11 19:04:33',time:'1447239873',update:'
北京时间11月11日17:10更新',error:'0',total:'1'};window.SWther={w:w,add:add};})();//0

代码中的步骤写的很明白了,如果你有心,还可以对该方法进行各种封装,方便使用。下篇我会分享一下httpclient是如何模拟后台来发送http请求的,还有配置ssl、代理、自定义header等等,敬请期待吧。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

Javascript 相关文章推荐
javascript作用域容易记错的两个地方分析
Jun 22 Javascript
JS特权方法定义作用以及与公有方法的区别
Mar 18 Javascript
js获取 type=radio 值的方法
May 09 Javascript
javascript常用的方法整理
Aug 20 Javascript
jquery UI Datepicker时间控件的使用方法(终结版)
Nov 07 Javascript
js实现图片上传并正常显示
Dec 19 Javascript
TinyMCE汉化及本地上传图片功能实例详解
May 31 Javascript
jQuery表单验证插件解析(推荐)
Jul 21 Javascript
Vue.js第一天学习笔记(数据的双向绑定、常用指令)
Dec 01 Javascript
JS中的事件委托实例浅析
Mar 22 Javascript
Vux+Axios拦截器增加loading的问题及实现方法
Nov 08 Javascript
JavaScript对象字面量和构造函数原理与用法详解
Apr 18 Javascript
js实现定时进度条完成后切换图片
Jan 04 #Javascript
12306 刷票脚本及稳固刷票脚本(防挂)
Jan 04 #Javascript
深入理解JavaScript中的预解析
Jan 04 #Javascript
jQuery操作json常用方法示例
Jan 04 #Javascript
Bootstrap select下拉联动(jQuery cxselect)
Jan 04 #Javascript
jQuery Validate表单验证插件的基本使用方法及功能拓展
Jan 04 #Javascript
过期软件破解办法实例详解
Jan 04 #Javascript
You might like
thinkphp中AJAX返回ajaxReturn()方法分析
2016/12/06 PHP
jquery isType() 类型判断代码
2011/02/14 Javascript
jquery移除button的inline onclick事件(已测试及兼容浏览器)
2013/01/25 Javascript
JavaScript编写连连看小游戏
2015/07/07 Javascript
jQuery鼠标经过方形图片切换成圆边效果代码分享
2015/08/20 Javascript
JS实现可展开折叠层的鼠标拖曳效果
2015/10/09 Javascript
JS获取CSS样式(style/getComputedStyle/currentStyle)
2016/01/19 Javascript
Javascript实现图片轮播效果(二)图片序列节点的控制实现
2016/02/17 Javascript
JS中script标签defer和async属性的区别详解
2016/08/12 Javascript
jQuery的Read()方法代替原生JS详解
2016/11/08 Javascript
NodeJS中的MongoDB快速入门详细教程
2016/11/11 NodeJs
微信公众号 摇一摇周边功能开发
2016/12/08 Javascript
flexslider.js实现移动端轮播
2017/02/05 Javascript
JS验证不重复验证码
2017/02/10 Javascript
jQuery中的类名选择器(.class)用法简单示例
2018/05/14 jQuery
浅谈Vue 性能优化之深挖数组
2018/12/11 Javascript
详解vue 兼容IE报错解决方案
2018/12/29 Javascript
[06:44]2014DOTA2国际邀请赛-钥匙体育馆开战 开幕式振奋人心
2014/07/19 DOTA
[39:19]完美世界DOTA2联赛PWL S2 SZ vs LBZS 第二场 11.26
2020/11/30 DOTA
[01:03:09]完美世界DOTA2联赛PWL S2 Forest vs SZ 第二场 11.25
2020/11/26 DOTA
Python迭代用法实例教程
2014/09/08 Python
python单例模式实例分析
2015/04/08 Python
在Docker上开始部署Python应用的教程
2015/04/17 Python
Python3随机漫步生成数据并绘制
2018/08/27 Python
Python实现压缩文件夹与解压缩zip文件的方法
2018/09/01 Python
Python3.5面向对象程序设计之类的继承和多态详解
2019/04/24 Python
利用Python绘制Jazz网络图的例子
2019/11/21 Python
python 遍历pd.Series的index和value
2019/11/26 Python
将tensorflow.Variable中的某些元素取出组成一个新的矩阵示例
2020/01/04 Python
Pytorch生成随机数Tensor的方法汇总
2020/09/09 Python
加拿大便宜的隐形眼镜商店:Clearly
2016/09/15 全球购物
预备党员思想汇报
2014/01/08 职场文书
《冬阳童年骆驼队》教学反思
2014/04/15 职场文书
2014年五四青年节演讲稿范文
2014/04/22 职场文书
复兴之路观后感3000字
2015/06/02 职场文书
宣传委员竞选稿
2015/11/19 职场文书