使用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 相关文章推荐
document.onreadystatechange事件的用法分析
Oct 17 Javascript
javascript 语法基础 想学习js的朋友可以看看
Dec 16 Javascript
jQuery选择器的工作原理和优化分析
Jul 25 Javascript
玩转jQuery按钮 请告诉我你最喜欢哪些?
Jan 08 Javascript
JS实现队列与堆栈的方法
Apr 21 Javascript
JavaScript实现Java中Map容器的方法
Oct 09 Javascript
浅析如何利用JavaScript进行语音识别
Oct 27 Javascript
AngularJS开发教程之控制器之间的通信方法分析
Dec 25 Javascript
RequireJS 依赖关系的实例(推荐)
Jan 21 Javascript
Vue.js 2.x之组件的定义和注册图文详解
Jun 19 Javascript
Angular异步变同步处理方法
Aug 13 Javascript
详解微信小程序轨迹回放实现及遇到的坑
Feb 02 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
解析htaccess伪静态的规则
2013/06/18 PHP
php学习笔记之基础知识
2014/11/08 PHP
用jquery与css打造个性化的单选框和复选框
2010/10/20 Javascript
jQuery EasyUI API 中文文档 - TreeGrid 树表格使用介绍
2011/11/21 Javascript
jQuery实现点击标题输入详细信息
2013/04/16 Javascript
浅析XMLHttpRequest的缓存问题
2013/12/13 Javascript
ie9 提示'console' 未定义问题的解决方法
2014/03/20 Javascript
Javascript玩转继承(二)
2014/05/08 Javascript
javascript中返回顶部按钮的实现
2015/05/05 Javascript
js文本框输入内容智能提示效果
2015/12/02 Javascript
echarts3 使用总结(绘制各种图表,地图)
2017/01/05 Javascript
Vue 中axios配置实例详解
2018/07/27 Javascript
使用webpack打包后的vue项目如何正确运行(express)
2018/10/26 Javascript
小程序实现人脸识别功能(百度ai)
2018/12/23 Javascript
详解Vue基于vue-quill-editor富文本编辑器使用心得
2019/01/03 Javascript
微信小程序上传图片并等比列压缩到指定大小的实例代码
2019/10/24 Javascript
vue 解决路由只变化参数页面组件不更新问题
2019/11/05 Javascript
[01:03:41]完美世界DOTA2联赛PWL S3 DLG vs Phoenix 第一场 12.17
2020/12/19 DOTA
Pyramid将models.py文件的内容分布到多个文件的方法
2013/11/27 Python
python回溯法实现数组全排列输出实例分析
2015/03/17 Python
python实现学生信息管理系统
2020/04/05 Python
利用python提取wav文件的mfcc方法
2019/01/09 Python
Anaconda之conda常用命令介绍(安装、更新、删除)
2019/10/06 Python
Python中zip()函数的解释和可视化(实例详解)
2020/02/16 Python
Django静态文件加载失败解决方案
2020/08/26 Python
Pycharm安装python库的方法
2020/11/24 Python
使用Python爬取小姐姐图片(beautifulsoup法)
2021/02/11 Python
详解Html5原生拖拽操作
2018/01/12 HTML / CSS
阿联酋手表和配饰购物网站:Rivolishop
2019/11/25 全球购物
面向对象编程的优势是什么
2015/12/17 面试题
维修工先进事迹
2014/05/29 职场文书
借名购房协议书范本
2014/10/06 职场文书
未婚证明书模板
2014/10/08 职场文书
介绍信应该怎么开?
2019/04/03 职场文书
七年级写作指导之游记作文
2019/10/07 职场文书
html中显示特殊符号(附带特殊字符对应表)
2021/06/21 HTML / CSS