URLConnection发送HTTP请求的方法_动力节点Java学院整理

如何通过Java发送HTTP请求,通俗点讲,如何通过Java(模拟浏览器)发送HTTP请求。

Java有原生的API可用于发送HTTP请求,即java.net.URL、java.net.URLConnection,这些API很好用、很常用,但不够简便;
所以,也流行有许多Java HTTP请求的framework,如,Apache的HttpClient。

目前项目主要用到Java原生的方式,所以,这里主要介绍此方式。

运用原生Java Api发送简单的Get请求、Post请求

HTTP请求粗分为两种,一种是GET请求,一种是POST请求。使用Java发送这两种请求的代码大同小异,只是一些参数设置的不同。步骤如下:

1.通过统一资源定位器(java.net.URL)获取连接器(java.net.URLConnection)

2.设置请求的参数

3.发送请求

4.以输入流的形式获取返回内容

5.关闭输入流

简单的Get请求示例如下:

package com.bjpowernode.httprequestdemo;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;

public class HttpGetRequest {

  /**
   * Main
   * @param args
   * @throws Exception
   */
  public static void main(String[] args) throws Exception {
    System.out.println(doGet());
  }

  /**
   * Get Request
   * @return
   * @throws Exception
   */
  public static String doGet() throws Exception {
    URL localURL = new URL("http://localhost:8080/OneHttpServer/");
    URLConnection connection = localURL.openConnection();
    HttpURLConnection httpURLConnection = (HttpURLConnection)connection;

    httpURLConnection.setRequestProperty("Accept-Charset", "utf-8");
    httpURLConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");

    InputStream inputStream = null;
    InputStreamReader inputStreamReader = null;
    BufferedReader reader = null;
    StringBuffer resultBuffer = new StringBuffer();
    String tempLine = null;

    if (httpURLConnection.getResponseCode() >= 300) {
      throw new Exception("HTTP Request is not success, Response code is " + httpURLConnection.getResponseCode());
    }

    try {
      inputStream = httpURLConnection.getInputStream();
      inputStreamReader = new InputStreamReader(inputStream);
      reader = new BufferedReader(inputStreamReader);

      while ((tempLine = reader.readLine()) != null) {
        resultBuffer.append(tempLine);
      }

    } finally {

      if (reader != null) {
        reader.close();
      }

      if (inputStreamReader != null) {
        inputStreamReader.close();
      }

      if (inputStream != null) {
        inputStream.close();
      }

    }

    return resultBuffer.toString();
  }

}

 简单的Post请求示例如下:

package com.bjpowernode.httprequestdemo;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;

public class HttpPostRequest {

  /**
   * Main
   * @param args
   * @throws Exception
   */
  public static void main(String[] args) throws Exception {
    System.out.println(doPost());
  }

  /**
   * Post Request
   * @return
   * @throws Exception
   */
  public static String doPost() throws Exception {
    String parameterData = "username=nickhuang&blog=http://www.cnblogs.com/nick-huang/";

    URL localURL = new URL("http://localhost:8080/OneHttpServer/");
    URLConnection connection = localURL.openConnection();
    HttpURLConnection httpURLConnection = (HttpURLConnection)connection;

    httpURLConnection.setDoOutput(true);
    httpURLConnection.setRequestMethod("POST");
    httpURLConnection.setRequestProperty("Accept-Charset", "utf-8");
    httpURLConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
    httpURLConnection.setRequestProperty("Content-Length", String.valueOf(parameterData.length()));

    OutputStream outputStream = null;
    OutputStreamWriter outputStreamWriter = null;
    InputStream inputStream = null;
    InputStreamReader inputStreamReader = null;
    BufferedReader reader = null;
    StringBuffer resultBuffer = new StringBuffer();
    String tempLine = null;

    try {
      outputStream = httpURLConnection.getOutputStream();
      outputStreamWriter = new OutputStreamWriter(outputStream);

      outputStreamWriter.write(parameterData.toString());
      outputStreamWriter.flush();

      if (httpURLConnection.getResponseCode() >= 300) {
        throw new Exception("HTTP Request is not success, Response code is " + httpURLConnection.getResponseCode());
      }

      inputStream = httpURLConnection.getInputStream();
      inputStreamReader = new InputStreamReader(inputStream);
      reader = new BufferedReader(inputStreamReader);

      while ((tempLine = reader.readLine()) != null) {
        resultBuffer.append(tempLine);
      }

    } finally {

      if (outputStreamWriter != null) {
        outputStreamWriter.close();
      }

      if (outputStream != null) {
        outputStream.close();
      }

      if (reader != null) {
        reader.close();
      }

      if (inputStreamReader != null) {
        inputStreamReader.close();
      }

      if (inputStream != null) {
        inputStream.close();
      }

    }

    return resultBuffer.toString();
  }

}

简单封装

如果项目中有多处地方使用HTTP请求,我们适当对其进行封装,

  1. 可以大大减少代码量(不需每次都写一大段原生的请求Source code)
  2. 也可以使配置更灵活、方便(全局设置一些项目特有的配置,比如已商榷的time out时间、已确定的Proxy Server,避免以后改动繁琐)

以下简单封装成HttpRequestor,以便使用:

package com.bjpowernode.util.httprequestor;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.InetSocketAddress;
import java.net.Proxy;
import java.net.URL;
import java.net.URLConnection;
import java.util.Iterator;
import java.util.Map;

public class HttpRequestor {

  private String charset = "utf-8";
  private Integer connectTimeout = null;
  private Integer socketTimeout = null;
  private String proxyHost = null;
  private Integer proxyPort = null;

  /**
   * Do GET request
   * @param url
   * @return
   * @throws Exception
   * @throws IOException
   */
  public String doGet(String url) throws Exception {

    URL localURL = new URL(url);

    URLConnection connection = openConnection(localURL);
    HttpURLConnection httpURLConnection = (HttpURLConnection)connection;

    httpURLConnection.setRequestProperty("Accept-Charset", charset);
    httpURLConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");

    InputStream inputStream = null;
    InputStreamReader inputStreamReader = null;
    BufferedReader reader = null;
    StringBuffer resultBuffer = new StringBuffer();
    String tempLine = null;

    if (httpURLConnection.getResponseCode() >= 300) {
      throw new Exception("HTTP Request is not success, Response code is " + httpURLConnection.getResponseCode());
    }

    try {
      inputStream = httpURLConnection.getInputStream();
      inputStreamReader = new InputStreamReader(inputStream);
      reader = new BufferedReader(inputStreamReader);

      while ((tempLine = reader.readLine()) != null) {
        resultBuffer.append(tempLine);
      }

    } finally {

      if (reader != null) {
        reader.close();
      }

      if (inputStreamReader != null) {
        inputStreamReader.close();
      }

      if (inputStream != null) {
        inputStream.close();
      }

    }

    return resultBuffer.toString();
  }

  /**
   * Do POST request
   * @param url
   * @param parameterMap
   * @return
   * @throws Exception
   */
  public String doPost(String url, Map parameterMap) throws Exception {

    /* Translate parameter map to parameter date string */
    StringBuffer parameterBuffer = new StringBuffer();
    if (parameterMap != null) {
      Iterator iterator = parameterMap.keySet().iterator();
      String key = null;
      String value = null;
      while (iterator.hasNext()) {
        key = (String)iterator.next();
        if (parameterMap.get(key) != null) {
          value = (String)parameterMap.get(key);
        } else {
          value = "";
        }

        parameterBuffer.append(key).append("=").append(value);
        if (iterator.hasNext()) {
          parameterBuffer.append("&");
        }
      }
    }

    System.out.println("POST parameter : " + parameterBuffer.toString());

    URL localURL = new URL(url);

    URLConnection connection = openConnection(localURL);
    HttpURLConnection httpURLConnection = (HttpURLConnection)connection;

    httpURLConnection.setDoOutput(true);
    httpURLConnection.setRequestMethod("POST");
    httpURLConnection.setRequestProperty("Accept-Charset", charset);
    httpURLConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
    httpURLConnection.setRequestProperty("Content-Length", String.valueOf(parameterBuffer.length()));

    OutputStream outputStream = null;
    OutputStreamWriter outputStreamWriter = null;
    InputStream inputStream = null;
    InputStreamReader inputStreamReader = null;
    BufferedReader reader = null;
    StringBuffer resultBuffer = new StringBuffer();
    String tempLine = null;

    try {
      outputStream = httpURLConnection.getOutputStream();
      outputStreamWriter = new OutputStreamWriter(outputStream);

      outputStreamWriter.write(parameterBuffer.toString());
      outputStreamWriter.flush();

      if (httpURLConnection.getResponseCode() >= 300) {
        throw new Exception("HTTP Request is not success, Response code is " + httpURLConnection.getResponseCode());
      }

      inputStream = httpURLConnection.getInputStream();
      inputStreamReader = new InputStreamReader(inputStream);
      reader = new BufferedReader(inputStreamReader);

      while ((tempLine = reader.readLine()) != null) {
        resultBuffer.append(tempLine);
      }

    } finally {

      if (outputStreamWriter != null) {
        outputStreamWriter.close();
      }

      if (outputStream != null) {
        outputStream.close();
      }

      if (reader != null) {
        reader.close();
      }

      if (inputStreamReader != null) {
        inputStreamReader.close();
      }

      if (inputStream != null) {
        inputStream.close();
      }

    }

    return resultBuffer.toString();
  }

  private URLConnection openConnection(URL localURL) throws IOException {
    URLConnection connection;
    if (proxyHost != null && proxyPort != null) {
      Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyHost, proxyPort));
      connection = localURL.openConnection(proxy);
    } else {
      connection = localURL.openConnection();
    }
    return connection;
  }

  /**
   * Render request according setting
   * @param request
   */
  private void renderRequest(URLConnection connection) {

    if (connectTimeout != null) {
      connection.setConnectTimeout(connectTimeout);
    }

    if (socketTimeout != null) {
      connection.setReadTimeout(socketTimeout);
    }

  }

  /*
   * Getter & Setter
   */
  public Integer getConnectTimeout() {
    return connectTimeout;
  }

  public void setConnectTimeout(Integer connectTimeout) {
    this.connectTimeout = connectTimeout;
  }

  public Integer getSocketTimeout() {
    return socketTimeout;
  }

  public void setSocketTimeout(Integer socketTimeout) {
    this.socketTimeout = socketTimeout;
  }

  public String getProxyHost() {
    return proxyHost;
  }

  public void setProxyHost(String proxyHost) {
    this.proxyHost = proxyHost;
  }

  public Integer getProxyPort() {
    return proxyPort;
  }

  public void setProxyPort(Integer proxyPort) {
    this.proxyPort = proxyPort;
  }

  public String getCharset() {
    return charset;
  }

  public void setCharset(String charset) {
    this.charset = charset;
  }

}

写一个调用的测试类:

package com.bjpowernode.util.httprequestor;

import java.util.HashMap;
import java.util.Map;

public class Call {

  public static void main(String[] args) throws Exception {

    /* Post Request */
    Map dataMap = new HashMap();
    dataMap.put("username", "Nick Huang");
    dataMap.put("blog", "IT");
    System.out.println(new HttpRequestor().doPost("http://localhost:8080/OneHttpServer/", dataMap));

    /* Get Request */
    System.out.println(new HttpRequestor().doGet("http://localhost:8080/OneHttpServer/"));
  }

}

OK,完成!!

简单测试

以上的请求地址都是http://localhost:8080/OneHttpServer/

这是自己的一个用于测试的Web Application,就一个简单的Servlet和web.xml。毕竟需要测试请求参数是否能正常接收,处理超时的情况。

LoginServlet

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LoginServlet extends HttpServlet {
  private static final long serialVersionUID = 1L;

  public LoginServlet() {
    super();
  }

  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    this.doPost(request, response);
  }

  protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String username = request.getParameter("username");
    String blog = request.getParameter("blog");

    System.out.println(username);
    System.out.println(blog);

    response.setContentType("text/plain; charset=UTF-8");
    response.setCharacterEncoding("UTF-8");
    response.getWriter().write("It is ok!");
  }

}

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
 <display-name>OneHttpServer</display-name>
 <welcome-file-list>
  <welcome-file>LoginServlet</welcome-file>
 </welcome-file-list>

 <servlet>
  <description></description>
  <display-name>LoginServlet</display-name>
  <servlet-name>LoginServlet</servlet-name>
  <servlet-class>LoginServlet</servlet-class>
 </servlet>
 <servlet-mapping>
  <servlet-name>LoginServlet</servlet-name>
  <url-pattern>/LoginServlet</url-pattern>
 </servlet-mapping>

</web-app>
(0)

相关推荐

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

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

  • java HttpURLConnection 发送文件和字符串信息

    java HttpURLConnection 发送文件和字符串信息 以文件的形式传参 /** * 通过拼接的方式构造请求内容,实现参数传输以及文件传输 * * @param actionUrl 访问的服务器URL * @param params 普通参数 * @param files 文件参数 * @return * @throws IOException */ public static void post(String actionUrl, Map<String, String> para

  • java 使用HttpURLConnection发送数据简单实例

    java 使用HttpURLConnection发送数据简单实例 每个 HttpURLConnection 实例都可用于生成单个请求,但是其他实例可以透明地共享连接到 HTTP 服务器的基础网络.请求后在 HttpURLConnection 的 InputStream 或 OutputStream 上调用 close() 方法可以释放与此实例关联的网络资源,但对共享的持久连接没有任何影响.如果在调用 disconnect() 时持久连接空闲,则可能关闭基础套接字.JAVA使用HttpURLCon

  • java利用java.net.URLConnection发送HTTP请求的方法详解

    一.前言 如何通过Java发送HTTP请求,通俗点讲,如何通过Java(模拟浏览器)发送HTTP请求. Java有原生的API可用于发送HTTP请求,即java.net.URL.java.net.URLConnection,这些API很好用.很常用,但不够简便: 所以,也流行有许多Java HTTP请求的framework,如,Apache的HttpClient. 目前项目主要用到Java原生的方式,所以,这里主要介绍此方式. 二.运用原生Java Api发送简单的Get请求.Post请求步骤

  • 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

  • URLConnection发送HTTP请求的方法_动力节点Java学院整理

    如何通过Java发送HTTP请求,通俗点讲,如何通过Java(模拟浏览器)发送HTTP请求. Java有原生的API可用于发送HTTP请求,即java.net.URL.java.net.URLConnection,这些API很好用.很常用,但不够简便: 所以,也流行有许多Java HTTP请求的framework,如,Apache的HttpClient. 目前项目主要用到Java原生的方式,所以,这里主要介绍此方式. 运用原生Java Api发送简单的Get请求.Post请求 HTTP请求粗分为

  • Java乱码问题解决方法_动力节点Java学院整理

    1.文件页面编码导致的乱码. 每一个文件(java,js,jsp,html等)都有其本身的编码格式,文件中的代码在一种编码中显示正常,在另外一种编码下就会显示出乱码. 在Eclipse中,每一个工程都会有编码格式(Text file encoding), 一般默认为GBK.而一个比较好的编程习惯是新建一个项目,优先把项目的编码设为UTF-8. 这样做的原因很简单,UTF-8包含全世界所有国家需要用到的字符,是国际编码,通用性强.几种常见的字符集,GBK,GB2312,UTF-8之间的关系如下:

  • TortoiseSVN使用方法_动力节点Java学院整理

    本文为大家分享了TortoiseSVN的使用方法,供大家参考,具体内容如下 添加文件 在检出的工作副本中添加一个Readme.txt文本文件,这时候这个文本文件会显示为没有版本控制的状态,如图: 这时候,你需要告知TortoiseSVN你的操作,如图: 加入以后,你的文件会变成这个状态,如图: 这时候使用TortoiseSVN进行提交.这样别人就能看到你所做的更改了,如图. 修改文件 使用TortoiseSVN更新,修改工作副本中的Readme.txt文件,加入"hello world!&quo

  • Java class文件格式之方法_动力节点Java学院整理

    class文件中的fields_count和fields fields_count描述的是当前的类中定义的字段的个数, 注意, 这里包括静态字段, 但不包括从父类继承的字段. 如果当前class文件是由一个接口生成的, 那么这里的fields_count描述的是接口中定义的字段, 我们知道, 接口中定义的字段默认都是静态的.此外要说明的是, 编译器可能会自动生成字段, 也就是说, class文件中的字段的数量可能多于源文件中定义的字段的数量. 举例来说, 编译器会为内部类增加一个字段, 这个字段

  • 探索Java中的equals()和hashCode()方法_动力节点Java学院整理

    equals()和hashCode()区别?  equals():反映的是对象或变量具体的值,即两个对象里面包含的值--可能是对象的引用,也可能是值类型的值.  hashCode():计算出对象实例的哈希码,并返回哈希码,又称为散列函数.根类Object的hashCode()方法的计算依赖于对象实例的D(内存地址),故每个Object对象的hashCode都是唯一的:当然,当对象所对应的类重写了hashCode()方法时,结果就截然不同了. 之所以有hashCode方法,是因为在批量的对象比

  • Java中json使用方法_动力节点Java学院整理

    摘要:JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于ECMAScript的一个子集. JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C.C++.C#.Java.JavaScript.Perl.Python等).这些特性使JSON成为理想的数据交换语言. 易于人阅读和编写,同时也易于机器解析和生成(网络传输速率). 一.准备工作  json是个非常重要的数据结构,在web开发中应用十分广泛.我觉得每个人都应该好好

  • JavaScript方法_动力节点Java学院整理

    在一个对象中绑定函数,称为这个对象的方法. 在JavaScript中,对象的定义是这样的: var xiaoming = { name: '小明', birth: 1990 }; 但是,如果我们给xiaoming绑定一个函数,就可以做更多的事情.比如,写个age()方法,返回xiaoming的年龄: var xiaoming = { name: '小明', birth: 1990, age: function () { var y = new Date().getFullYear(); retu

  • EL调用Java方法_动力节点Java学院整理

    简单来说,我们在一个类中的某个方法,可以使用EL进行调用,这个能被EL表达式调用的方法称之为EL函数,但是这种方式必须满足以下两点要求: ① 在EL表达式中调用的只能是Java类的静态方法 ② 这个Java类的静态方法需要在我们另外在自定义的TLD文件中描述 满足以上两点才能被EL表达式调用. 语法:  ${prefix:方法名(参数列表) } 例1:使用EL函数来实现HTML语言的过滤转义 在web工程中自定义一个HTMLFilter类,同时定义一个静态的filter方法: package c

  • Java中Object toString方法简介_动力节点Java学院整理

    一.Object类介绍  Object类在Java里面是一个比较特殊的类,JAVA只支持单继承,子类只能从一个父类来继承,如果父类又是从另外一个父类继承过来,那他也只能有一个父类,父类再有父类,那也只能有一个,JAVA为了组织这个类组织得比较方便,它提供了一个最根上的类,相当于所有的类都是从这个类继承,这个类就叫Object.所以Object类是所有JAVA类的根基类,是所有JAVA类的老祖宗.所有的类,不管是谁,都是从它继承下来的. 二.toString方法介绍  一个字符串和另外一种类型连接

  • Java方法重写_动力节点Java学院整理

    一.方法重写(Override) 在Java中如何来定义重写:Java程序中类的继承特性可以产生一个子类,子类继承父类就拥有了父类的非私有的属性(方法和变量),在子类中可以增加自己的属性(方法和变量),同时也可以对父类中的方法进行扩展,以增强自己的功能,这样就称之为重写,也称为复写或者覆盖.所谓方法重写就是子类的方法和父类中继承下来的方法具有完全相同的方法名.返回值类型.方法的参数个数以及参数类型,这样才能被称为方法重写. 代码体现: // 这是父类的定义 public class Person

随机推荐