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

一、前言

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

Java有原生的API可用于发送HTTP请求,即java.net.URLjava.net.URLConnection,这些API很好用、很常用,但不够简便;

所以,也流行有许多Java HTTP请求的framework,如,Apache的HttpClient。

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

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

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

2.设置请求的参数

3.发送请求

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

5.关闭输入流

三、发送请求与接收响应流类 HttpRequestor

package me.http;

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 = this.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 = this.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;
 }

}

四、为测试方便,新建一个项目,并新建一个Servlet,接收post请求并对HttpRequestor请求响应,发出响应流

LoginServlet.java代码:此处使用了

注解: @WebServlet("/LoginServlet") ,也可以在web.xml配置Servlet

package me.loginServlet;

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

/**
 * Servlet implementation class LoginServlet
 */
@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
 private static final long serialVersionUID = 1L;

 /**
  * @see HttpServlet#HttpServlet()
  */
 public LoginServlet() {
  super();
  // TODO Auto-generated constructor stub
 }

 /**
  * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
  */
 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  // TODO Auto-generated method stub
  System.out.println("111");
 }

 /**
  * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
  */
 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  // TODO Auto-generated method stub
   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!");

 }

}

五.测试类Test.java

package me.http;

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

public class Test {
public static void main(String[] args) {
  /* Post Request */
 Map dataMap = new HashMap();
 dataMap.put("username", "Nick Huang");
 dataMap.put("blog", "IT");
 try {
  System.out.println(new HttpRequestor().doPost("http://localhost:8081/TestProgect2/LoginServlet", dataMap));
  //System.out.println(new HttpRequestor().doGet("http://localhost:8081/TestProgect2/LoginServlet"));
 } catch (Exception e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
 }

 /* Get Request */

}
}

1.接收post请求类LoginServlet,控制台测试结果

2.HttpRequestor接收LoginServlet返回的流

OK,完成

六.对于接收TestProgect2项目中LoginServlet.java类返回的流,在真实环境中可能是异步接收返回的流的,当一台机器A向另外一台机器B发送请求,B接收到A的信息,将信息处理后,需要将处理结果返回即响应返回给A,A会接收到B返回的信息

可以另外建一个Servlet类HttpListenerServlet.java来专门异步接收返回的信息

package me.http;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class HttpListenerServlet
 */
@WebServlet("/HttpListenerServlet")
public class HttpListenerServlet extends HttpServlet {
 private static final long serialVersionUID = 1L;

 /**
  * @see HttpServlet#HttpServlet()
  */
 public HttpListenerServlet() {
  super();
  // TODO Auto-generated constructor stub
 }

 /**
  * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
  */
 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  // TODO Auto-generated method stub
 }

 /**
  * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
  */
 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  // TODO Auto-generated method stub
   InputStream inputStream = null;
   inputStream = request.getInputStream();
   InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
   BufferedReader reader = new BufferedReader(inputStreamReader);
   String tempLine = null;
   StringBuffer resultBuffer=new StringBuffer();
   while ((tempLine = reader.readLine()) != null) {
    resultBuffer.append(tempLine);
   }

   System.out.println(resultBuffer.toString());
 }

}

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

(0)

相关推荐

  • 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

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

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

  • Java网络编程之URL+URLconnection使用方法示例

    目录 HTTP GET和POST 从URLs到本地文件 在java.net包中包含两个有趣的类:URL类和URLConnection类.这两个类可以用来创建客户端到web服务器(HTTP服务器)的连接.下面是一个简单的代码例子: URL url = new URL("http://jenkov.com"); URLConnection urlConnection = url.openConnection(); InputStream input = urlConnection.getI

  • 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发送POST数据

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

  • 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请求步骤

  • RestTemplate发送HTTP GET请求使用方法详解

    目录 前言 一.getForObject()方法 1.1.以String的方式接受请求结果数据 1.2.以POJO对象的方式接受结果数据 1.3.以数组的方式接收请求结果 1.4.使用占位符号传参的几种方式 二.getForEntity()方法 前言 本文是精讲RestTemplate第3篇,前篇的blog访问地址如下: RestTemplate在Spring或非Spring环境下使用精讲 RestTemplate实现多种底层HTTP客户端类库的切换用法 RestTemplate可以发送HTTP

  • Java 通过手写分布式雪花SnowFlake生成ID方法详解

    目录 SnowFlake算法 SnowFlake优点: SnowFlake算法 SnowFlake算法生成id的结果是一个64bit大小的整数,它的结构如下图: 分为四段: 第一段: 1位为未使用,永远固定为0. (因为二进制中最高位是符号位,1表示负数,0表示正数.生成的id一般都是用正整数,所以最高位固定为0 ) 第二段: 41位为毫秒级时间(41位的长度可以使用69年) 第三段: 10位为workerId(10位的长度最多支持部署1024个节点) (这里的10位又分为两部分,第一部分5位表

  • Java 通过手写分布式雪花SnowFlake生成ID方法详解

    目录 SnowFlake算法 SnowFlake优点 SnowFlake不足 SnowFlake算法 SnowFlake算法生成id的结果是一个64bit大小的整数,它的结构如下图: 分为四段: 第一段: 1位为未使用,永远固定为0. (因为二进制中最高位是符号位,1表示负数,0表示正数.生成的id一般都是用正整数,所以最高位固定为0 ) 第二段: 41位为毫秒级时间(41位的长度可以使用69年) 第三段: 10位为workerId(10位的长度最多支持部署1024个节点) (这里的10位又分为

  • 使用Java构造和解析Json数据的两种方法(详解二)

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,是理想的数据交换格式.同时,JSON是 JavaScript 原生格式,这意味着在 JavaScript 中处理 JSON数据不须要任何特殊的 API 或工具包. 在www.json.org上公布了很多JAVA下的json构造和解析工具,其中org.json和json-lib比较简单,两者使用上差不多但还是有些区别.下面接着介绍用org.json构造和解析Json数据的方法

  • 使用Java构造和解析Json数据的两种方法(详解一)

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,是理想的数据交换格式.同时,JSON是 JavaScript 原生格式,这意味着在 JavaScript 中处理 JSON数据不须要任何特殊的 API 或工具包. 在www.json.org上公布了很多JAVA下的json构造和解析工具,其中org.json和json-lib比较简单,两者使用上差不多但还是有些区别.下面首先介绍用json-lib构造和解析Json数据的方法

  • 关于java中可变长参数的定义及使用方法详解

    JAVA中可以为方法定义可变长参数( Varargs)来匹配不确定数量的多个参数,其定义用"..."表示.其实,这类似于为方法传了一个数组,且在使用方法上也和数组相同,如下: public void test(String... str){ for(String s : str){ } } 调用方法就像普通的调用方式相同,只不过可以匹配的参数为0到多个.如下: test(); test("lilei"); test("lilei","h

  • RestTemplate发送HTTP POST请求使用方法详解

    目录 一.postForObject发送JSON格式请求 二.postForObject模拟表单数据提交 三.url支持占位符语法 四.postForEntity()方法 五.postForLocation()方法的使用 本文是精讲RestTemplate第4篇,前篇的blog访问地址如下: RestTemplate在Spring或非Spring环境下使用精讲 RestTemplate实现多种底层HTTP客户端类库的切换用法 RestTemplate发送HTTP GET请求使用方法详解 在上一节

  • Java实现添加,读取和删除Excel图片的方法详解

    目录 介绍 Java 代码示例 示例1添加图片 示例2读取图片 示例3删除图片 介绍 本文介绍在Java程序中如何添加图片到excel表格,添加图片时可设置图片大小.位置.旋转.超链接.可选文本等,以及如何读取.删除excel表格中已有的图片. 工具:Free Spire.XLS for Java (免费版) 注:可通过官网下载包,并解压将lib文件夹下的jar文件导入java程序:或者通过maven仓库下载导入. Jar导入效果: Java 代码示例 示例1添加图片 import com.sp

  • Java比较两个对象大小的三种方法详解

    目录 一. 为什么需要比较对象 二. 元素的比较 1. 基本类型的比较 2. 引用类型的比较 三. 对象比较的方法 1. equals方法比较 2. 基于Comparable接口的比较 3. 基于Comparator接口的比较 4. 三种比较方式对比 一. 为什么需要比较对象 上一节介绍了优先级队列,在优先级队列中插入的元素必须能比较大小,如果不能比较大小,如插入两个学生类型的元素,会报ClassCastException异常 示例: class Student{ String name; in

随机推荐