使用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 相关文章推荐
TopList标签和JavaScript结合两例
Aug 12 Javascript
jQuery 学习入门篇附实例代码
Mar 16 Javascript
js动态创建表格,删除行列的小例子
Jul 20 Javascript
基于javascript的JSON格式页面展示美化方法
Jul 02 Javascript
javascript获取wx.config内部字段解决微信分享
Mar 09 Javascript
js实现延迟加载的几种方法
Apr 24 Javascript
javascript如何用递归写一个简单的树形结构示例
Sep 06 Javascript
解决vue+webpack打包路径的问题
Mar 06 Javascript
详解微信小程序缓存--缓存时效性
May 02 Javascript
JS实现点击生成UUID的方法完整实例【基于jQuery】
Jun 12 jQuery
浅析vue-router实现原理及两种模式
Feb 11 Javascript
解读Vue组件注册方式
May 15 Vue.js
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
php导入大量数据到mysql性能优化技巧
2014/12/29 PHP
浅谈本地WAMP环境的搭建
2015/05/13 PHP
weiphp微信公众平台授权设置
2016/01/04 PHP
laravel框架数据库配置及操作数据库示例
2019/10/10 PHP
laravel入门知识点整理
2020/09/15 PHP
写入cookie的JavaScript代码库 cookieLibrary.js
2009/10/24 Javascript
网站导致浏览器崩溃的原因总结(多款浏览器) 推荐
2010/04/15 Javascript
JS 添加网页桌面快捷方式的代码详细整理
2012/12/27 Javascript
jquery中加载图片自适应大小主要实现代码
2013/08/23 Javascript
JavaScript Math.ceil() 函数使用介绍
2013/12/11 Javascript
js网页实时倒计时精确到秒级
2014/02/10 Javascript
jQuery实现不断闪烁文字的方法
2015/05/15 Javascript
浅谈Vue SSR 的 Cookies 问题
2017/11/20 Javascript
详解操作虚拟dom模拟react视图渲染
2018/07/25 Javascript
在vue中更换字体,本地存储字体非引用在线字体库的方法
2018/09/28 Javascript
微信小程序导航栏滑动定位功能示例(实现CSS3的positionsticky效果)
2019/01/24 Javascript
深入浅析Vue中mixin和extend的区别和使用场景
2019/08/01 Javascript
JavaScript代码模拟鼠标自动点击事件示例
2020/08/07 Javascript
python使用pyhook监控键盘并实现切换歌曲的功能
2014/07/18 Python
django中send_mail功能实现详解
2018/02/06 Python
Python学习之Django的管理界面代码示例
2018/02/10 Python
Python使用Selenium模块模拟浏览器抓取斗鱼直播间信息示例
2018/07/18 Python
将python文件打包exe独立运行程序方法详解
2020/02/12 Python
scrapy爬虫:scrapy.FormRequest中formdata参数详解
2020/04/30 Python
Python判断远程服务器上Excel文件是否被人打开的方法
2020/07/13 Python
澳大利亚最好的在线时尚精品店:Princess Polly
2018/01/03 全球购物
意大利奢侈品购物网站:Giglio
2018/01/05 全球购物
学雷锋标语
2014/06/25 职场文书
钳工实训报告总结
2014/11/04 职场文书
护理专业自荐信范文
2015/03/06 职场文书
师范生见习总结范文
2015/06/23 职场文书
2015年秋季运动会前导词
2015/07/20 职场文书
MySQL利用UNION连接2个查询排序失效详解
2021/11/20 MySQL
vue如何实现关闭对话框后刷新列表
2022/04/08 Vue.js
MySQL数据库之内置函数和自定义函数 function
2022/06/16 MySQL
微前端qiankun改造日渐庞大的项目教程
2022/06/21 Javascript