详细分析Java中的HttpURLConnection基本知识(附Demo)

本文介绍了如何使用Java的HttpURLConnection进行GET和POST请求,处理包含JSON数据的响应,并展示了如何使用工具类发送JSON格式的POST请求。内容包括基本知识、示例代码和工具类的使用方法。
摘要由CSDN通过智能技术生成

前言

最近需要提取一个Json的数据放到数据库,配合定时任务
需要用到的相关知识推荐阅读:

  1. java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全)
  2. 详细分析Java中的分布式任务调度框架 XXL-Job

1. 基本知识

HttpURLConnection 是 Java 提供的用于发送 HTTP 请求的类

它的作用是建立与服务器的连接,发送 HTTP 请求并获取服务器的响应,HttpURLConnection 是 Java 标准库中的一部分,用于实现 HTTP 协议的客户端

作用:

  • 建立与服务器的连接
  • 发送 HTTP 请求并获取服务器的响应
  • 支持 GET、POST、PUT、DELETE 等 HTTP 请求方法
  • 提供了一系列方法,用于设置请求头、写入请求体、获取响应码、获取响应体等操作

常用的 API 接口:

  • openConnection(): 打开连接,返回一个 HttpURLConnection 对象

  • setRequestMethod(String method): 设置请求方法,如 GET、POST 等

  • setRequestProperty(String key, String value): 设置请求头字段

  • connect(): 建立与服务器的连接

  • getInputStream(): 获取响应输入流,用于读取服务器响应数据

  • getResponseCode(): 获取响应码,如 200、404 等

  • getHeaderField(String name): 获取指定请求头字段的值

  • getHeaderFields(): 获取所有响应头字段及其值

  • 接口参数说明

  • URL:要请求的目标 URL

  • method:请求方法,常见的有 GET、POST、PUT、DELETE

  • 请求头字段:如 Content-Type、User-Agent 等,用于设置请求的元数据

  • 请求体:对于 POST、PUT 等方法,请求体用于发送数据到服务器

  • 响应码:服务器对请求的响应状态码,如 200 表示成功,404 表示未找到资源等

  • 响应体:服务器返回的实际数据,可以是 HTML、JSON、XML 等格式的文档

2. Demo

此处的接口数据为get请求,Json数据如下:

在这里插入图片描述

对应的Java代码如下:

package com.example.test;

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

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

public class Demo{
    public static void main(String[] args) {
        try {
            // 构建请求参数
            String equipmentNo = "RC22";
            String[] dataNums = {"55", "57", "59", "66"};

            // 构建 URL
            StringBuilder urlBuilder = new StringBuilder();
            urlBuilder.append("http://127.0.0.1/xxx/yyy?");
            for (String dataNum : dataNums) {
                urlBuilder.append("dataNums=").append(dataNum).append("&");
            }
            urlBuilder.append("equipmentNo=").append(equipmentNo);
            URL url = new URL(urlBuilder.toString());

            // 创建连接
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("GET");

            // 获取响应
            int responseCode = conn.getResponseCode();
            if (responseCode == HttpURLConnection.HTTP_OK) {
                BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
                String inputLine;
                StringBuilder response = new StringBuilder();

                while ((inputLine = in.readLine()) != null) {
                    response.append(inputLine);
                }
                in.close();

                // 将响应转换为 JSON 对象
                JSONObject jsonObject = JSONObject.parseObject(response.toString());

                // 提取参数值
                String equipmentNoResult = jsonObject.getString("equipmentNo");
                String dataTime = jsonObject.getString("data_time");
                JSONArray dataArray = jsonObject.getJSONArray("data");
                for (int i = 0; i < dataArray.size(); i++) {
                    JSONObject dataObject = dataArray.getJSONObject(i);
                    String dataName = dataObject.getString("data_name");
                    String unit = dataObject.getString("unit");
                    int dataNum = dataObject.getIntValue("data_num");
                    int value = dataObject.getIntValue("value");

                    // 打印参数值
                    System.out.println("Data Name: " + dataName);
                    System.out.println("Unit: " + unit);
                    System.out.println("Data Number: " + dataNum);
                    System.out.println("Value: " + value);
                    System.out.println("--------------------------");
                }
            } else {
                System.out.println("GET 请求失败,响应码: " + responseCode);
            }
            conn.disconnect();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

通过上述请求可以发现:(此处为数据的抽取)

  1. 将响应转换为 JSON 对象:JSONObject jsonObject = JSONObject.parseObject(response.toString());
  2. 提取参数值:jsonObject.getString
  3. 提取内部data的参数值:jsonObject.getJSONArray("data");

3. 工具类

以下是对UrlConnectionUtils类中方法的详细注释:

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

public class UrlConnectionUtils {

    /**
     * 发送 GET 请求并获取响应数据
     *
     * @param url 目标 URL
     * @return 响应数据字符串
     */
    public static String sendGetRequest(String url) {
        try {
            // 创建 URL 对象
            URL targetUrl = new URL(url);
            // 打开 HTTP 连接
            HttpURLConnection connection = (HttpURLConnection) targetUrl.openConnection();
            // 设置请求方法为 GET
            connection.setRequestMethod("GET");

            StringBuilder response = new StringBuilder();

            try (BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()))) {
                String line;
                // 读取响应数据
                while ((line = reader.readLine()) != null) {
                    response.append(line);
                }
            } finally {
                // 关闭连接
                connection.disconnect();
            }

            return response.toString();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return null;
    }

    /**
     * 发送 POST 请求并获取响应数据
     *
     * @param url         目标 URL
     * @param requestBody 请求体数据字符串
     * @return 响应数据字符串
     */
    public static String sendPostRequest(String url, String requestBody) {
        try {
            // 创建 URL 对象
            URL targetUrl = new URL(url);
            // 打开 HTTP 连接
            HttpURLConnection connection = (HttpURLConnection) targetUrl.openConnection();
            // 设置请求方法为 POST
            connection.setRequestMethod("POST");
            // 允许向服务器发送数据
            connection.setDoOutput(true);

            try (OutputStream outputStream = connection.getOutputStream()) {
                // 发送请求体数据
                outputStream.write(requestBody.getBytes());
                outputStream.flush();
            }

            StringBuilder response = new StringBuilder();

            try (BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()))) {
                String line;
                // 读取响应数据
                while ((line = reader.readLine()) != null) {
                    response.append(line);
                }
            } finally {
                // 关闭连接
                connection.disconnect();
            }

            return response.toString();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return null;
    }

    /**
     * 发送 JSON 格式的 POST 请求并获取响应数据
     *
     * @param stringurl       目标 URL
     * @param requestParameter JSON 格式的请求参数字符串
     * @return 响应数据字符串
     */
    public static String sendJsonRequest(String stringurl, String requestParameter) {
        try {
            // 创建 URL 对象
            URL url = new URL(stringurl);
            // 打开 HTTP 连接
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();

            // 设置请求方法为 POST
            conn.setRequestMethod("POST");
            // 设置请求头部为 JSON 格式
            conn.setRequestProperty("Content-Type", "application/json");
            // 允许向服务器发送数据
            conn.setDoOutput(true);

            // 向服务器发送 JSON 数据
            OutputStream outputStream = conn.getOutputStream();
            outputStream.write(requestParameter.getBytes());
            outputStream.flush();

            // 获取响应结果
            int responseCode = conn.getResponseCode();
            BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            String line;
            StringBuffer response = new StringBuffer();
            // 读取响应数据
            while ((line = reader.readLine()) != null) {
                response.append(line);
            }
            reader.close();

            return response.toString();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

通过上述工具类,可以使用post请求:

个别参数截图如下:

// 创建params对象
Map<String, Object> param = new HashMap<>();
param.put("triggerids", "xxx");
param.put("output", "yyy");

// 创建整个JSON对象
Map<String, Object> json = new HashMap<>();
json.put("jsonrpc", "2.0");
json.put("method", "host.get");
json.put("params", param);
json.put("id", 1);
json.put("auth", "xxx");

// 将JSON对象转换为JSON字符串
JSONObject gson = new JSONObject(json);
String jsonString = gson.toJSONString();

url = "http://127.0.0.1/xxx";
String hostResult = UrlConnectionUtils.sendJsonRequest(url,jsonString);

jsonObject = JSON.parseObject(hostResult);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农研究僧

你的鼓励将是我创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值