使用UrlConnection实现后台模拟http请求的简单实例

使用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等等,敬请期待吧。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

  • iOS中使用NSURLConnection处理HTTP同步与异步请求

    一.引言 在iOS7后,NSURLSession基本代替了NSURLConnection进行网络开发,在iOS9后,NSURLConnection相关方法被完全的弃用,iOS系统有向下兼容的特性,尽管NSURLConnection已经被弃用,但在开发中,其方法依然可以被使用,并且如果需要兼容到很低版本的iOS系统,有时就必须使用NSURLConnection类了. 二.使用NSURLConnection进行同步请求 对于网络请求分为同步和异步两种,同步是指在请求结果返回之前,程序代码会卡在请求处

  • Android通过HttpURLConnection和HttpClient接口实现网络编程

    Android中提供的HttpURLConnection和HttpClient接口可以用来开发HTTP程序.以下是学习中的一些经验. 1.HttpURLConnection接口 首先需要明确的是,Http通信中的POST和GET请求方式的不同.GET可以获得静态页面,也可以把参数放在URL字符串后面,传递给服务器.而POST方法的参数是放在Http请求中.因此,在编程之前,应当首先明确使用的请求方法,然后再根据所使用的方式选择相应的编程方式.HttpURLConnection是继承于URLCon

  • Android HttpURLConnection.getResponseCode()错误解决方法

    导语:个人对网络连接接触的不多,在使用时自己发现一些问题,记录一下. 正文:我在使用HttpURLConnection.getResponseCode()的时候直接报错是IOException错误,responseCode = -1.一直想不明白,同一个程序我调用了两次,结果有一个链接一直OK,另一个却一直报这个错误.后来发现两个链接的区别,有一个返回的内容是空的,所以导致了这个错误. 解决方法: 方法1.网页返回内容不能是空: 方法2.不要用这个接口咯.

  • Java HttpURLConnection超时和IO异常处理

    最近同步数据的时候发现了一个问题,我本身后台插入数据后给其他部门后台做同步.说简单一点其实就是调用对方提供的接口,进行HTTP请求调用.然后后面发现问题了.HTTP请求的话,有可能请求超时,中断失败,IO异常其实都有可能,如果是平时打开一个网页还好,打不开的时候,你会关掉,或者他页面给你显示信息.但是同步,不可以这样做,一旦请求失败,必须让数据正确的同步,今天才意识到这个问题的重要性. String httpUrl = "https://www.baidu.com/s?ie=UTF-8&

  • java后台调用HttpURLConnection类模拟浏览器请求实例(可用于接口调用)

    一般在项目开发中难免遇到外部接口的调用,本文实例讲述了java后台调用HttpURLConnection类模拟浏览器请求的方法.可用于接口调用.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: package com.cplatform.movie.back.test; import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.InputStreamReader; import ja

  • 利用HttpUrlConnection 上传 接收文件的实现方法

    如下所示: //客户端代码 public static void main(String[] args) throws IOException { DataInputStream in = null; OutputStream out = null; HttpURLConnection conn = null; JSONObject resposeTxt = null; InputStream ins = null; ByteArrayOutputStream outStream = null;

  • Android程序开发通过HttpURLConnection上传文件到服务器

    一:实现原理 最近在做Android客户端的应用开发,涉及到要把图片上传到后台服务器中,自己选择了做Spring3 MVC HTTP API作为后台上传接口,android客户端我选择用HttpURLConnection来通过form提交文件数据实现上传功能,本来想网上搜搜拷贝一下改改代码就好啦,发现根本没有现成的例子,多数的例子都是基于HttpClient的或者是基于Base64编码以后作为字符串来传输图像数据,于是我不得不自己动手,参考了网上一些资料,最终实现基于HttpURLConnect

  • Android中HttpURLConnection与HttpClient的使用与封装

    1.写在前面 大部分andriod应用需要与服务器进行数据交互,HTTP.FTP.SMTP或者是直接基于SOCKET编程都可以进行数据交互,但是HTTP必然是使用最广泛的协议.     本文并不针对HTTP协议的具体内容,仅探讨android开发中使用HTTP协议访问网络的两种方式--HttpURLConnection和HttpClient     因为需要访问网络,需在AndroidManifest.xml中添加如下权限 <uses-permission android:name="an

  • Android中使用HttpURLConnection实现GET POST JSON数据与下载图片

    Android6.0中把Apache HTTP Client所有的包与类都标记为deprecated不再建议使用所有跟HTTP相关的数据请求与提交操作都通过HttpURLConnection类实现,现实是很多Android开发者一直都Apache HTTP Client来做andoird客户端与后台HTTP接口数据交互,小编刚刚用HttpURLConnection做了一个android的APP,不小心踩到了几个坑,总结下最常用的就通过HttpURLConnection来POST提交JSON数据与

  • 谈谈Java利用原始HttpURLConnection发送POST数据

    URLConnection是个抽象类,它有两个直接子类分别是HttpURLConnection和JarURLConnection.另外一个重要的类是URL,通常URL可以通过传给构造器一个String类型的参数来生成一个指向特定地址的URL实例. 每个 HttpURLConnection 实例都可用于生成单个请求,但是其他实例可以透明地共享连接到 HTTP 服务器的基础网络.请求后在 HttpURLConnection 的 InputStream 或 OutputStream 上调用 close

  • Android 中HttpURLConnection与HttpClient使用的简单实例

    1:HttpHelper.java 复制代码 代码如下: public class HttpHelper {    //1:标准的Java接口    public static String getStringFromNet1(String param){        String result="";        try{            URL url=new URL(param);            HttpURLConnection conn=(HttpURLCo

  • iOS开发中使用NSURLConnection类处理网络请求的方法

    NSURLConnection 作为 Core Foundation / CFNetwork 框架的 API 之上的一个抽象,在 2003 年,随着第一版的 Safari 的发布就发布了.NSURLConnection 这个名字,实际上是指代的 Foundation 框架的 URL 加载系统中一系列有关联的组件:NSURLRequest.NSURLResponse.NSURLProtocol. NSURLCache. NSHTTPCookieStorage.NSURLCredentialStor

随机推荐