使用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 相关文章推荐
WebGame《逆转裁判》完整版 代码下载(1月24日更新)
Jan 29 Javascript
jquery防止重复执行动画避免页面混乱
Apr 22 Javascript
javascript基于HTML5 canvas制作画箭头组件
Jun 25 Javascript
JavaScript ES6的新特性使用新方法定义Class
Jun 28 Javascript
JSON格式的时间/Date(2367828670431)/格式转为正常的年-月-日 格式的代码
Jul 27 Javascript
js控制文本框只能输入中文、英文、数字与指定特殊符号的实现代码
Sep 09 Javascript
node作为中间服务层如何发送请求(发送请求的实现方法详解)
Jan 02 Javascript
vue嵌套路由与404重定向实现方法分析
May 04 Javascript
用node撸一个监测复联4开售短信提醒的实现代码
Apr 10 Javascript
Nuxt使用Vuex的方法示例
Sep 06 Javascript
JavaScript设计模式--简单工厂模式实例分析【XHR工厂案例】
May 23 Javascript
JavaScript控制台的更多功能
Apr 28 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
php循环检测目录是否存在并创建(循环创建目录)
2011/01/06 PHP
php 对输入信息的进行安全过滤的函数代码
2012/06/29 PHP
PHP中使用asort进行中文排序失效的问题处理
2014/08/18 PHP
php批量删除操作代码分享
2017/02/26 PHP
自写的利用PDO对mysql数据库增删改查操作类
2018/02/19 PHP
JQuery自定义事件的应用 JQuery最佳实践
2010/08/01 Javascript
输入框的字数时时统计—关于 onpropertychange 和 oninput 使用
2011/10/21 Javascript
基于JQuery模仿苹果桌面的Dock效果(初级版)
2012/10/15 Javascript
js计算字符串长度包含的中文是utf8格式
2013/10/15 Javascript
jquery简单实现鼠标经过导航条改变背景图
2013/12/17 Javascript
jQuery 鼠标经过(hover)事件的延时处理示例
2014/04/14 Javascript
javascript的alert box在java中如何显示多行
2014/05/18 Javascript
js实现二代身份证号码验证详解
2014/11/20 Javascript
jQuery实现选项卡切换效果简单演示
2015/12/09 Javascript
学习javascript面向对象 掌握创建对象的9种方式
2016/01/04 Javascript
Boostrap入门准备之border box
2016/05/09 Javascript
微信小程序 获取session_key和openid的实例
2017/08/17 Javascript
jQuery插件artDialog.js使用与关闭方法示例
2017/10/09 jQuery
Bootstrap导航菜单点击后无法自动添加active的处理方法
2018/08/10 Javascript
vue自定义指令实现方法详解
2019/02/11 Javascript
浅谈js闭包理解
2019/03/28 Javascript
vue实现设置载入动画和初始化页面动画效果
2019/10/28 Javascript
ant-design-vue中的select选择器,对输入值的进行筛选操作
2020/10/24 Javascript
python目录操作之python遍历文件夹后将结果存储为xml
2014/01/27 Python
Python模拟三级菜单效果
2017/09/11 Python
对tf.reduce_sum tensorflow维度上的操作详解
2018/07/26 Python
对django的User模型和四种扩展/重写方法小结
2019/08/17 Python
在Django中预防CSRF攻击的操作
2020/03/13 Python
python numpy矩阵信息说明,shape,size,dtype
2020/05/22 Python
python自动打开浏览器下载zip并提取内容写入excel
2021/01/04 Python
师范生自荐信
2013/10/27 职场文书
会计自我鉴定
2013/11/02 职场文书
大学生创业计划书的格式要求
2013/12/29 职场文书
同学聚会通知短信
2015/04/20 职场文书
iPhone13 Pro外观确定,升级4800万镜头,4月20日发新品
2021/04/15 数码科技
MySQL学习之基础命令实操总结
2022/03/19 MySQL