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

作者:nick-huang 时间:2023-09-20 16:08:17 

如何通过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>

标签:URLConnection,HTTP
0
投稿

猜你喜欢

  • java从输入流中获取数据并返回字节数组示例

    2021-12-08 22:47:36
  • java中String.intern()方法功能介绍

    2023-11-25 23:49:21
  • java实现计算器功能

    2022-10-28 06:52:09
  • SpringBoot实现分页功能

    2021-11-07 12:33:16
  • java 文件上传到读取文件内容的实例

    2023-11-09 22:00:27
  • C# 实现QQ式截图功能实例代码

    2022-04-04 03:48:12
  • Java关于IO流的全面介绍

    2023-08-12 08:14:46
  • C# 嵌入dll 的方法

    2022-11-06 08:39:10
  • Android应用中制作选中后图标变大浮动效果的代码分享

    2022-01-09 20:38:26
  • Android中将View的内容保存为图像的简单实例

    2023-11-01 12:45:41
  • Spring2.5.6开发环境搭建图文教程

    2023-07-28 18:01:02
  • Java超详细讲解三大特性之一的多态

    2022-03-17 02:11:45
  • C# 正则表达式常用的符号和模式解析(最新推荐)

    2021-07-05 16:01:22
  • C#中流的使用和分类

    2022-10-04 22:17:41
  • Android手机通过rtp发送aac数据给vlc播放的实现步骤

    2023-11-10 00:48:02
  • C#七大经典排序算法系列(上)

    2023-08-14 04:30:45
  • Android编程实现状态保存的方法分析

    2023-07-17 12:54:45
  • Android音频开发之音频采集的实现示例

    2022-04-12 16:28:31
  • myBatis实现三 级嵌套复杂对象的赋值问题

    2023-11-23 06:42:26
  • Java线程间的通信方式详解

    2022-05-20 10:33:47
  • asp之家 软件编程 m.aspxhome.com