使用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一点特殊用法
May 28 Javascript
ExtJS 设置级联菜单的默认值
Jun 13 Javascript
js实现点小图看大图效果的思路及示例代码
Oct 28 Javascript
jQuery实现简单网页遮罩层/弹出层效果兼容IE6、IE7
Jun 16 Javascript
JS实现固定在右下角可展开收缩DIV层的方法
Feb 13 Javascript
JavaScript中判断数据类型的方法总结
May 24 Javascript
Angular.JS利用ng-disabled属性和ng-model实现禁用button效果
Apr 05 Javascript
Vue2单一事件管理组件通信
May 09 Javascript
基于React Native 0.52实现轮播图效果
Aug 25 Javascript
vue多页面项目中路由使用history模式的方法
Sep 23 Javascript
JavaScript如何判断input数据类型
Feb 06 Javascript
vue-cli打包后本地运行dist文件中的index.html操作
Aug 12 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面向对象程序设计组合模式与装饰模式详解
2016/12/02 PHP
JS动画效果代码3
2008/04/03 Javascript
js 与 php 通过json数据进行通讯示例
2014/03/26 Javascript
ExtJS 刷新后如何默认选中刷新前最后一次选中的节点
2014/04/03 Javascript
浅谈jquery事件处理
2015/04/24 Javascript
jquery的幻灯片图片切换效果代码分享
2015/09/07 Javascript
基于angularJS的表单验证指令介绍
2016/10/21 Javascript
浅析JavaScript中var that=this
2017/02/17 Javascript
Node.js和Express简单入门介绍
2017/03/24 Javascript
JavaScript结合HTML DOM实现联动菜单
2017/04/05 Javascript
浅谈Angular4实现热加载开发旅程
2017/09/08 Javascript
Vue中render函数的使用方法
2018/01/31 Javascript
vuex 的简单使用
2018/03/22 Javascript
vue代码分割的实现(codesplit)
2018/11/13 Javascript
nodejs log4js 使用详解
2019/05/31 NodeJs
vue 实现v-for循环回来的数据动态绑定id
2019/11/07 Javascript
小程序登录之支付宝授权的实现示例
2019/12/13 Javascript
python根据时间生成mongodb的ObjectId的方法
2015/03/13 Python
python文件特定行插入和替换实例详解
2017/07/12 Python
对numpy中数组转置的求解以及向量内积计算方法
2018/10/31 Python
对Python3中bytes和HexStr之间的转换详解
2018/12/04 Python
python基于json文件实现的gearman任务自动重启代码实例
2019/08/13 Python
python基础教程之while循环
2019/08/14 Python
python list多级排序知识点总结
2019/10/23 Python
Pytorch根据layers的name冻结训练方式
2020/01/06 Python
JavaScript+Canvas实现自定义画板的示例代码
2019/05/13 HTML / CSS
新加坡网上花店:FlowerAdvisor新加坡
2018/10/05 全球购物
美国宠物美容和宠物用品购物网站:Cherrybrook
2018/12/07 全球购物
说说在weblogic中开发消息Bean时的persistent与non-persisten的差别
2013/04/07 面试题
专业技术职务聘任书
2014/03/29 职场文书
财务部会计岗位职责
2015/02/03 职场文书
导游词之沈阳清昭陵
2019/12/28 职场文书
Go标准容器之Ring的使用说明
2021/05/05 Golang
教你怎么用Python selenium操作浏览器对象的基础API
2021/06/23 Python
ubuntu安装jupyter并设置远程访问的实现
2022/03/31 Python
vue3引入highlight.js进行代码高亮的方法实例
2022/04/08 Vue.js