使用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 相关文章推荐
用正则xmlHttp实现的偷(转)
Jan 22 Javascript
js借助ActiveXObject实现创建文件
Sep 29 Javascript
jquery动态调整div大小使其宽度始终为浏览器宽度
Jun 06 Javascript
jquery中each遍历对象和数组示例
Aug 05 Javascript
使用jquery.qrcode.min.js实现中文转化二维码
Mar 11 Javascript
浅谈jQuery 选择器和dom操作
Jun 07 Javascript
jquery操作ID带有变量的节点实例
Dec 07 Javascript
利用select实现年月日三级联动的日期选择效果【推荐】
Dec 13 Javascript
移动端使用localResizeIMG4压缩图片
Apr 22 Javascript
微信小程序url传参写变量的方法
Aug 09 Javascript
Vue 中 filter 与 computed 的区别与用法解析
Nov 21 Javascript
VueCli4项目配置反向代理proxy的方法步骤
May 17 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实现的在线人员函数库
2008/04/09 PHP
smarty表格换行实例
2014/12/15 PHP
PHP解压tar.gz格式文件的方法
2016/02/14 PHP
php运行报错Call to undefined function curl_init()的最新解决方法
2016/11/20 PHP
PHP的imageTtfText()函数深入详解
2021/03/03 PHP
一个javascript参数的小问题
2008/03/02 Javascript
Node.js生成HttpStatusCode辅助类发布到npm
2013/04/09 Javascript
jquery右下角弹出提示框示例代码
2013/10/08 Javascript
JS实现匀速运动的代码实例
2013/11/29 Javascript
js实现仿百度瀑布流的方法
2015/02/05 Javascript
jQuery实现首页图片淡入淡出效果的方法
2015/06/10 Javascript
对jquery的ajax进行二次封装以及ajax缓存代理组件:AjaxCache详解
2016/04/11 Javascript
所见即所得的富文本编辑器bootstrap-wysiwyg使用方法详解
2016/05/27 Javascript
Listloading.js移动端上拉下拉刷新组件
2016/08/04 Javascript
深入理解jQuery3.0的domManip函数
2016/09/01 Javascript
Vue 进入/离开动画效果
2017/12/26 Javascript
JS实现点击发送验证码 xx秒后重新发送功能
2019/07/30 Javascript
小程序简单两栏瀑布流效果的实现
2019/12/18 Javascript
深入理解Javascript中的this关键字
2015/03/27 Python
在Python中定义和使用抽象类的方法
2016/06/30 Python
详解Python各大聊天系统的屏蔽脏话功能原理
2016/12/01 Python
python配置grpc环境
2019/01/01 Python
Python Process多进程实现过程
2019/10/22 Python
如何查看python关键字
2021/01/17 Python
解决HTML5手机端页面缩放的问题
2017/10/27 HTML / CSS
MADE荷兰:提供原创设计师家具
2018/04/03 全球购物
捷克原创男装和女装购物网站:Bolf.cz
2018/04/28 全球购物
教师的实习自我鉴定
2013/12/17 职场文书
学生会离职感言
2014/02/11 职场文书
2014年房产经纪人工作总结
2014/12/08 职场文书
2014年纳税评估工作总结
2014/12/23 职场文书
紫日观后感
2015/06/05 职场文书
公司管理制度范本
2015/08/03 职场文书
如何使用Python对NetCDF数据做空间相关分析
2021/04/21 Python
python 爬取天气网卫星图片
2021/06/07 Python
详解gantt甘特图可拖拽、编辑(vue、react都可用 highcharts)
2021/11/27 Vue.js