Java使用原生HttpURLConnection实现发送HTTP请求

1、HttpURLConnection 类的介绍

HttpURLConnection 是 Java 提供的原生标准的用于发送 HTTP 请求和接收 HTTP 响应的一个类,它位于 java.net 包下,并继承了 URLConnection 类。

HttpURLconnection 是基于 HTTP 协议的,支持 get,post,put,delete 等各种请求方式,最常用的就是 get 和 post。

URLConnection 提供了一组方法来建立与 URL 之间的连接、发送请求和接收响应。

以下是 HttpURLConnection 类常用的方法:

方法 说明
openConnection() 用于打开与 URL 的连接,返回一个 URLConnection 对象。
setRequestMethod(String method) 设置请求方法,如 GET、POST 等。
setRequestProperty(String key, String value) 设置请求属性,如请求头参数。
getRequestMethod() 获取当前请求的方法。
getRequestProperty(String key) 获取指定请求属性的值。
connect() 建立与URL的连接。
getInputStream() 获取输入流,用于接收响应数据。
getOutputStream() 获取输出流,用于发送请求数据。
getResponseCode() 获取响应的状态码。
getHeaderField(String name) 获取指定响应头字段的值。
setDoInput(boolean doinput) 设置是否从 URLConnection 读入,默认为true。
setDoOutput(boolean dooutput) 设置是否向 URLConnection 输出,默认为false。
setInstanceFollowRedirects(boolean followRedirects) 设置是否自动执行重定向,默认为true。
disconnect() 断开与URL的连接。

2、创建 HttpURLConnection 工具类

通过将常用的方法封装到工具类中,可以避免重复编写相同的代码,从而提高代码的复用性‌。

基于 HttpURLConnection 的 HTTP 请求工具类:

java 复制代码
package com.pjb.consumer.util;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Map;

/**
 * 基于 HttpURLConnection 的 HTTP 请求工具类
 * @author pan_junbiao
 **/
public class HttpURLConnectionUtil
{
    // 超时时间
    private final static int timeOut = 60000; //60秒

    /**
     * 发送 GET 请求并获取响应数据
     *
     * @param url    请求地址
     * @param params 请求参数
     * @return 响应数据字符串
     */
    public static String doGet(String url, Map<String, String> params)
    {
        HttpURLConnection connection = null;
        BufferedReader reader = null;
        try
        {
            // 1、拼接 URL
            StringBuffer stringBuffer = new StringBuffer(url);
            if (params != null && !params.isEmpty())
            {
                stringBuffer.append("?");
                for (Map.Entry<String, String> entry : params.entrySet())
                {
                    stringBuffer.append(entry.getKey()).append("=").append(entry.getValue()).append("&");
                }
                stringBuffer.deleteCharAt(stringBuffer.length() - 1);
            }
            URL targetUrl = new URL(stringBuffer.toString());

            // 2、建立链接
            connection = (HttpURLConnection) targetUrl.openConnection();
            // 设置请求方法为 GET
            connection.setRequestMethod("GET");
            // 设置连接超时
            connection.setConnectTimeout(timeOut);
            // 设置读取响应超时
            connection.setReadTimeout(timeOut);

            // 3、获取响应结果
            StringBuilder response = new StringBuilder();
            reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            String line;
            while ((line = reader.readLine()) != null)
            {
                response.append(line);
            }
            return response.toString();
        } catch (IOException e)
        {
            e.printStackTrace();
        } finally
        {
            if (connection != null)
            {
                try
                {
                    connection.disconnect();
                } catch (Exception e)
                {
                    System.out.println("连接关闭失败");
                }
            }
            if (reader != null)
            {
                try
                {
                    reader.close();
                } catch (IOException e)
                {
                    System.out.println("输入流关闭失败");
                }
            }
        }
        return null;
    }

    /**
     * 发送 POST 请求并获取响应数据
     *
     * @param url    请求地址
     * @param params 请求参数
     * @return 响应数据字符串
     */
    public static String doPost(String url, Map<String, String> params)
    {
        HttpURLConnection connection = null;
        OutputStream outputStream = null;
        BufferedReader reader = null;
        try
        {
            // 1、创建 URL 对象
            URL targetUrl = new URL(url);

            // 2、建立链接
            connection = (HttpURLConnection) targetUrl.openConnection();
            // 设置请求方法为 POST
            connection.setRequestMethod("POST");
            // 设置连接超时
            connection.setConnectTimeout(timeOut);
            // 设置读取响应超时
            connection.setReadTimeout(timeOut);
            // 设置请求头部为默认:URL编码表单数据格式
            connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            // 允许写入输出流
            connection.setDoOutput(true);
            // 禁用缓存
            connection.setUseCaches(false);

            // 3、写入请求体
            outputStream = connection.getOutputStream();
            StringBuffer payload = new StringBuffer();
            if (params != null && !params.isEmpty())
            {
                for (Map.Entry<String, String> entry : params.entrySet())
                {
                    payload.append(entry.getKey()).append("=").append(entry.getValue()).append("&");
                }
                payload.deleteCharAt(payload.length() - 1);
            }
            outputStream.write(payload.toString().getBytes());
            outputStream.flush();
            outputStream.close();

            // 4、获取响应结果
            StringBuilder response = new StringBuilder();
            reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            String line;
            // 读取响应数据
            while ((line = reader.readLine()) != null)
            {
                response.append(line);
            }
            return response.toString();
        } catch (IOException e)
        {
            e.printStackTrace();
        } finally
        {
            if (connection != null)
            {
                try
                {
                    connection.disconnect();
                } catch (Exception e)
                {
                    System.out.println("连接关闭失败");
                }
            }
            if (outputStream != null)
            {
                try
                {
                    outputStream.close();
                } catch (IOException e)
                {
                    System.out.println("输出流关闭失败");
                }
            }
            if (reader != null)
            {
                try
                {
                    reader.close();
                } catch (IOException e)
                {
                    System.out.println("输入流关闭失败");
                }
            }
        }
        return null;
    }

    /**
     * 发送 JSON 格式的 POST 请求并获取响应数据
     *
     * @param url       请求地址
     * @param jsonParam JSON格式的请求参数
     * @return 响应数据字符串
     */
    public static String doJsonPost(String url, String jsonParam)
    {
        HttpURLConnection connection = null;
        OutputStream outputStream = null;
        BufferedReader reader = null;
        try
        {
            // 1、创建 URL 对象
            URL targetUrl = new URL(url);

            // 2、建立链接
            connection = (HttpURLConnection) targetUrl.openConnection();
            // 设置请求方法为 POST
            connection.setRequestMethod("POST");
            // 设置请求头部为 JSON 格式
            connection.setRequestProperty("Content-Type", "application/json");
            // 设置连接超时
            connection.setConnectTimeout(timeOut);
            // 设置读取响应超时
            connection.setReadTimeout(timeOut);
            // 允许向服务器发送数据
            connection.setDoOutput(true);

            // 3、向服务器发送 JSON 数据
            outputStream = connection.getOutputStream();
            outputStream.write(jsonParam.getBytes());
            outputStream.flush();

            // 4、获取响应结果
            StringBuffer response = new StringBuffer();
            int responseCode = connection.getResponseCode();
            reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            String line;
            while ((line = reader.readLine()) != null)
            {
                response.append(line);
            }
            return response.toString();
        } catch (Exception e)
        {
            e.printStackTrace();
        } finally
        {
            if (connection != null)
            {
                try
                {
                    connection.disconnect();
                } catch (Exception e)
                {
                    System.out.println("连接关闭失败");
                }
            }
            if (outputStream != null)
            {
                try
                {
                    outputStream.close();
                } catch (IOException e)
                {
                    System.out.println("输出流关闭失败");
                }
            }
            if (reader != null)
            {
                try
                {
                    reader.close();
                } catch (IOException e)
                {
                    System.out.println("输入流关闭失败");
                }
            }
        }
        return null;
    }
}

3、综合实例

**【实例】**实现用户信息的查询、新增、修改、删除接口,并使用 HttpURLConnection 实现接口的请求。

(1)在 controller 层,创建用户信息控制器类,实现查询、新增、修改、删除接口。

java 复制代码
package com.pjb.business.controller;

import com.pjb.business.entity.UserInfo;
import com.pjb.business.exception.ApiResponseException;
import com.pjb.business.model.ApiModel.ApiResponseCode;
import com.pjb.business.model.ApiModel.ApiResponseResult;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

/**
 * 用户信息控制器类
 * @author pan_junbiao
 **/
@RestController
@RequestMapping("/user")
@Api(description = "用户信息控制器")
public class UserController
{
    /**
     * 查询用户信息
     */
    @ApiOperation(value = "查询用户信息")
    @RequestMapping(value = "/getUserInfo", method = RequestMethod.GET)
    public ApiResponseResult<UserInfo> getUserInfo(Long userId)
    {
        if (userId <= 0)
        {
            //使用:全局异常处理
            throw new ApiResponseException(ApiResponseCode.PARAMETER_ERROR);
        }

        UserInfo userInfo = new UserInfo();
        userInfo.setUserId(userId);
        userInfo.setUserName("pan_junbiao的博客");
        userInfo.setBlogName("您好,欢迎访问 pan_junbiao的博客");
        userInfo.setBlogUrl("https://blog.csdn.net/pan_junbiao");

        //使用:统一返回值
        return new ApiResponseResult(ApiResponseCode.SUCCESS, userInfo);
    }

    /**
     * 新增用户信息
     */
    @ApiOperation(value = "新增用户信息")
    @RequestMapping(value = "/addUserInfo", method = RequestMethod.POST)
    public ApiResponseResult<Boolean> addUserInfo(@RequestBody UserInfo userInfo)
    {
        if (userInfo == null || userInfo.getUserName() == null || userInfo.getUserName().length() == 0)
        {
            //使用:全局异常处理
            throw new ApiResponseException(ApiResponseCode.PARAMETER_ERROR);
        }

        //使用:统一返回值
        return new ApiResponseResult(ApiResponseCode.SUCCESS, true);
    }

    /**
     * 修改用户信息
     */
    @ApiOperation(value = "修改用户信息")
    @RequestMapping(value = "/updateUserInfo", method = RequestMethod.POST)
    public ApiResponseResult<Boolean> updateUserInfo(@RequestBody UserInfo userInfo)
    {
        if (userInfo == null && userInfo.getUserId() <= 0)
        {
            //使用:全局异常处理
            throw new ApiResponseException(ApiResponseCode.PARAMETER_ERROR);
        }

        //使用:统一返回值
        return new ApiResponseResult(ApiResponseCode.SUCCESS, true);
    }

    /**
     * 删除用户信息
     */
    @ApiOperation(value = "删除用户信息")
    @RequestMapping(value = "/deleteUserInfo", method = RequestMethod.POST)
    public ApiResponseResult<Boolean> deleteUserInfo(Long userId,String userName)
    {
        if (userId <= 0)
        {
            //使用:全局异常处理
            throw new ApiResponseException(ApiResponseCode.PARAMETER_ERROR);
        }

        //使用:统一返回值
        return new ApiResponseResult(ApiResponseCode.SUCCESS, true);
    }
}

(2)使用 HttpURLConnection 发送 Get 请求,查询用户信息。

java 复制代码
/**
 * 使用 HttpURLConnection 发送 Get 请求,查询用户信息
 */
@Test
public void getUserInfo()
{
    //请求地址
    String url = "http://localhost:8085/user/getUserInfo";

    //请求参数
    Map<String, String> params = new HashMap<>();
    params.put("userId", "1");

    //发送 HTTP 的 Get 请求(核心代码)
    String httpResult = HttpURLConnectionUtil.doGet(url, params);

    //反序列化JSON结果
    ApiResponseResult<UserInfo> responseResult = JacksonUtil.getJsonToGenericityBean(httpResult, ApiResponseResult.class, UserInfo.class);
    UserInfo userInfo = responseResult.getData();
    System.out.println("响应JSON结果:" + httpResult);
    System.out.println("响应结果编码:" + responseResult.getCode());
    System.out.println("响应结果信息:" + responseResult.getMessage());
    System.out.println("用户编号:" + userInfo.getUserId());
    System.out.println("用户名称:" + userInfo.getUserName());
    System.out.println("博客信息:" + userInfo.getBlogName());
    System.out.println("博客地址:" + userInfo.getBlogUrl());
}

执行结果:

(3)使用 HttpURLConnection 发送 JSON 格式的 POST 请求,新增用户信息。

java 复制代码
/**
 * 使用 HttpURLConnection 发送 JSON 格式的 POST 请求,新增用户信息
 */
@Test
public void addUserInfo()
{
    //请求地址
    String url = "http://localhost:8085/user/addUserInfo";

    //请求参数
    UserInfo userInfo = new UserInfo();
    userInfo.setUserId(2L);
    userInfo.setUserName("pan_junbiao的博客");
    userInfo.setBlogName("您好,欢迎访问 pan_junbiao的博客");
    userInfo.setBlogUrl("https://blog.csdn.net/pan_junbiao");
    String json = JacksonUtil.getBeanToJson(userInfo);

    //发送 JSON 格式的 POST 请求(核心代码)
    String httpResult = HttpURLConnectionUtil.doJsonPost(url, json);
    System.out.println("响应结果:" + httpResult);
}

执行结果:

java 复制代码
响应结果:{"code":200000,"message":"操作成功","data":true}

(4)使用 HttpURLConnection 发送 POST 请求,删除用户信息。

java 复制代码
/**
 * 使用 HttpURLConnection 发送 POST 请求,删除用户信息
 */
@Test
public void deleteUserInfo()
{
    //请求地址
    String url = "http://localhost:8085/user/deleteUserInfo";

    //请求参数
    Map<String, String> params = new HashMap<>();
    params.put("userId","3");

    //发送 HTTP 的 POST 请求(核心代码)
    String httpResult = HttpURLConnectionUtil.doPost(url, params);
    System.out.println("响应结果:" + httpResult);
}

执行结果:

java 复制代码
响应结果:{"code":200000,"message":"操作成功","data":true}
相关推荐
157092511342 小时前
Android进阶之光:HTTP协议原理深度解析
android·网络协议·http
虹科网络安全3 小时前
Redis 安全公告:CVE-2026-81934 TLS 处理漏洞及修复建议
网络·人工智能·网络安全
小程序设计4 小时前
某师范学院网络规划与设计
网络·安全
可爱系程序猿6 小时前
WSD 打印机时好时坏:从发现服务、地址变化到 Standard TCP/IP 端口的迁移记录
网络·网络协议·tcp/ip·程序人生·电脑
蓝速科技7 小时前
便民服务大厅 AI 数字人一体机场景适配与落地指南丨蓝速科技
大数据·网络·数据结构·人工智能·自然语言处理·数据分析·运维开发
济南凡维8 小时前
CODESOFT中如何将标签保存为PDF文件
网络·人工智能·打印机·codesoft
德迅云安全杨德俊8 小时前
高防IP:构建“防护-加速-管控”三位一体的全链路安全体系
网络·安全·ddos
猫哥随身wifi8 小时前
随身WiFi 怎么选?2026 主流品牌随身 WiFi 对比与选购避坑参考
网络·人工智能·5g·智能手机
en.en..8 小时前
TCP套接字编程 完整流程解析(服务端 + 客户端)
网络
Quanqiucard9 小时前
“十五五”数字乡村建设提速,平安乡村监控物联网卡怎么选才稳定
网络·物联网