使用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 相关文章推荐
Jquery时间验证和转换工具小例子
Jul 01 Javascript
关于Javascript与iframe的那些事儿
Jul 04 Javascript
HTML页面弹出居中可拖拽的自定义窗口层
May 07 Javascript
js实现iframe自动自适应高度的方法
Feb 17 Javascript
深入理解JavaScript中的浮点数
May 18 Javascript
微信小程序侧边栏滑动特效(左右滑动)
Jan 23 Javascript
JavaScript自定义文本框光标
Mar 05 Javascript
ES6中箭头函数的定义与调用方式详解
Jun 02 Javascript
JS数组操作中的经典算法实例讲解
Jul 26 Javascript
微信小程序上传多图到服务器并获取返回的路径
May 05 Javascript
JS实现网站吸顶条
Jan 08 Javascript
Vue-cli3多页面配置详解
Mar 22 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 utf-8编码问题,utf8编码,数据库乱码,页面显示输出乱码
2013/04/08 PHP
php发送get、post请求的6种方法简明总结
2014/07/08 PHP
Yii扩展组件编写方法实例分析
2015/06/29 PHP
PHP 实现的将图片转换为TXT
2015/10/21 PHP
Yii框架实现图片上传的方法详解
2017/05/20 PHP
js 禁用浏览器的后退功能的简单方法
2008/12/10 Javascript
JavaScript读取中文cookie时的乱码问题的解决方法
2009/10/14 Javascript
关于extjs4如何获取grid修改后的数据的问题
2013/08/07 Javascript
js操作label给label赋值及取label的值示例
2013/11/07 Javascript
JQuery拖动表头边框线调整表格列宽效果代码
2014/09/10 Javascript
JS+CSS实现TreeMenu二级树形菜单完整实例
2015/09/18 Javascript
深入剖析JavaScript编程中的对象概念
2015/10/21 Javascript
关于使用axios的一些心得技巧分享
2017/07/02 Javascript
nodejs express配置自签名https服务器的方法
2018/05/22 NodeJs
vue项目实现图片上传功能
2019/12/23 Javascript
2020淘宝618理想生活列车自动领喵币js脚本的代码
2020/06/02 Javascript
关于angular浏览器兼容性问题的解决方案
2020/07/26 Javascript
Vue 同步异步存值取值实现案例
2020/08/05 Javascript
微信小程序实现单个或多个倒计时功能
2020/11/01 Javascript
[03:12]完美世界DOTA2联赛PWL DAY6集锦
2020/11/05 DOTA
动态创建类实例代码
2009/10/07 Python
Python探索之爬取电商售卖信息代码示例
2017/10/27 Python
matplotlib简介,安装和简单实例代码
2017/12/26 Python
Python实现的KMeans聚类算法实例分析
2018/12/29 Python
Python正则表达式匹配和提取IP地址
2019/06/06 Python
python里运用私有属性和方法总结
2019/07/08 Python
后端开发使用pycharm的技巧(推荐)
2020/03/27 Python
解决windows上安装tensorflow时报错,“DLL load failed: 找不到指定的模块”的问题
2020/05/20 Python
8种常用的Python工具
2020/08/05 Python
Python+Selenium随机生成手机验证码并检查页面上是否弹出重复手机号码提示框
2020/09/21 Python
CSS3实现精美横向滚动菜单按钮
2017/04/14 HTML / CSS
canvas三角函数模拟水波效果的示例代码
2018/07/03 HTML / CSS
John Varvatos官方网站:设计师男士时装
2017/02/08 全球购物
如何打开WebSphere远程debug
2014/10/10 面试题
2015年度党员自我评价范文
2015/03/03 职场文书
sql中mod()函数取余数的用法
2021/05/29 SQL Server