使用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 相关文章推荐
js apply/call/caller/callee/bind使用方法与区别分析
Oct 28 Javascript
一个简单的js鼠标划过切换效果
Jun 30 Javascript
jQuery+css3动画属性制作猎豹浏览器宽屏banner焦点图
Mar 16 Javascript
基于jQuery实现音乐播放试听列表
Apr 14 Javascript
原生js仿jquery animate动画效果
Jul 13 Javascript
javascript self对象使用详解
Oct 18 Javascript
jQuery插件fullPage.js实现全屏滚动效果
Dec 02 Javascript
JavaScript实现无穷滚动加载数据
May 06 Javascript
js实现简单数字变动效果
Nov 06 Javascript
anime.js 实现带有描边动画效果的复选框(推荐)
Dec 24 Javascript
10 种最常见的 Javascript 错误(频率最高)
Feb 08 Javascript
微信小程序input框中加入小图标的实现方法
Jun 19 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
配置Apache2.2+PHP5+CakePHP1.2+MySQL5运行环境
2009/04/25 PHP
Sorting Array Values in PHP(数组排序)
2011/09/15 PHP
php DOS攻击实现代码(附如何防范)
2012/05/29 PHP
php随机输出名人名言的代码
2012/10/07 PHP
PHP中常用的转义函数
2014/02/28 PHP
ThinkPHP实现将SESSION存入MYSQL的方法
2014/07/22 PHP
PHP与Ajax相结合实现登录验证小Demo
2016/03/16 PHP
php计算给定日期所在周的开始日期和结束日期示例
2017/02/06 PHP
phpMyAdmin通过密码漏洞留后门文件
2018/11/20 PHP
Laravel实现通过blade模板引擎渲染视图
2019/10/25 PHP
jscript之Open an Excel Spreadsheet
2007/06/13 Javascript
json跟xml的对比分析
2008/06/10 Javascript
js判断输入是否为正整数、浮点数等数字的函数代码
2010/11/17 Javascript
JavaScript中number转换成string介绍
2014/12/31 Javascript
jQuery form插件之ajaxForm()和ajaxSubmit()的可选参数项对象
2016/01/23 Javascript
微信小程序页面跳转功能之从列表的item项跳转到下一个页面的方法
2017/11/27 Javascript
Vue项目组件化工程开发实践方案
2018/01/09 Javascript
jQuery实现左右滑动的toggle方法
2018/03/03 jQuery
详解Vue.js自定义tipOnce指令用法实例
2018/12/19 Javascript
使用Jenkins部署React项目的方法步骤
2019/03/11 Javascript
js实现车辆管理系统
2020/08/26 Javascript
[06:44]2018DOTA2亚洲邀请赛4.5 SOLO赛 MidOne vs Sumail
2018/04/06 DOTA
python脚本实现xls(xlsx)转成csv
2016/04/10 Python
Django如何自定义model创建数据库索引的顺序
2019/06/20 Python
python 求定积分和不定积分示例
2019/11/20 Python
pytorch获取模型某一层参数名及参数值方式
2019/12/30 Python
python字典和json.dumps()的遇到的坑分析
2020/03/11 Python
浅析Python 字符编码与文件处理
2020/09/24 Python
GitHub上值得推荐的8个python 项目
2020/10/30 Python
中学教师岗位职责
2013/11/26 职场文书
计算机个人求职信范例
2014/01/24 职场文书
服装设计师职业生涯规划范文
2014/02/28 职场文书
2019学校请假条格式及范文
2019/06/25 职场文书
Ajax实现三级联动效果
2021/10/05 Javascript
Java spring定时任务详解
2021/10/05 Java/Android
Android自定义双向滑动控件
2022/04/19 Java/Android