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

目录

  • 前言
  • 1. 基本知识
  • 2. Demo
  • 3. 工具类

前言

最近需要提取一个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"};// 构建 URLStringBuilder 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();// 设置请求方法为 GETconnection.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();// 设置请求方法为 POSTconnection.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();// 设置请求方法为 POSTconn.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);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/517928.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Sentinel 面试题及答案整理,最新面试题

Sentinel的流量控制规则有哪些&#xff0c;各自的作用是什么&#xff1f; Sentinel的流量控制规则主要包括以下几种&#xff1a; 1、QPS&#xff08;每秒查询量&#xff09;限流&#xff1a; 限制资源每秒的请求次数&#xff0c;适用于控制高频访问。 2、线程数限流&#xf…

通过MNIST手写数字识别任务快速入门深度学习(事无巨细版)

可点此跳转看全篇 本文内容 什么是深度学习入门深度学习时的困惑典型的入门案例——CNN实现的MNIST手写数字识别虚拟环境的创建创建虚拟环境配置需求的依赖包代码1. 引入依赖包2. 准备数据集datasets3. 准备数据加载器dataloader4. 配置网络5. 设置训练器6. 网络训练7. 模型保存…

CVPR 2022 Oral | Bailando: 基于编舞记忆和Actor-Critic GPT的3D舞蹈生成

目录 测试结果&#xff1a; 02 提出的方法 测试结果&#xff1a; 预测有3个步骤&#xff0c;速度比较慢 02 提出的方法 1. 针对舞蹈序列的VQ-VAE和编舞记忆 与之前的方法不同&#xff0c;我们不学习从音频特征到 3D 关键点序列的连续域的直接映射。相反&#xff0c;我们先让…

2024环境工程、能源系统与化学材料国际会议(ICEEESCM 2024)

2024环境工程、能源系统与化学材料国际会议&#xff08;ICEEESCM 2024) 一、【会议简介】 2024环境工程、能源系统与化学材料国际会议&#xff08;ICEEESCM 2024)将于2024年在西安举行。会议将围绕环境工程、能源系统与化学材料等议题展开讨论&#xff0c;旨在为从事环境工程…

arm架构服务器使用Virtual Machine Manager安装的kylin v10虚拟机

本文中使用Virtual Machine Manager安装kylin v10的虚拟机 新建虚拟机 新建虚拟机 选择镜像&#xff0c;下一步 设置内存和CPU&#xff0c;下一步 选择或创建自定义存储&#xff08;默认存储位置的磁盘空间可能不够用&#xff09; 点击管理&#xff0c;打开选择存储卷页…

曲线曲面 - 连续性, 坐标变换矩阵

连续性 有两种&#xff1a;参数连续性&#xff08;Parametric Continuity&#xff09;、几何连续性&#xff08;Geometric Continuity&#xff09;参数连续性&#xff1a; 零阶参数连续性&#xff0c;记为&#xff0c;指相邻两段曲线在结合点处具有相同的坐标 一阶参数连续性&…

1.JavaWebJava基础加强[万字长文]-Junit、反射、注解核心知识点梳理

导语&#xff1a; 一、Junit单元测试 1.Junit测试概述 2.Junit使用步骤 3.Junit_Before&After 二、反射 1.反射概述 2.反射获取字节码Class对象的三种方式 3.Class对象功能概述 4.Class对象功能_获取Field 5.Class对象功能_获取Constructor 6.Class对象功能_获取…

响应人大代表王旭的提议:996程序员也要每天一节体育课

哈喽&#xff0c;我是熊子峰&#xff0c;38岁程序员&#xff0c;正在结合AI写作进行自我成长&#xff0c;穿越程序员的中年危机&#xff0c;这是第 69 篇日更文章。 每天一节体育课 今天&#xff0c;看到一条新闻&#xff0c;人大代表王旭提议中小学生每天应该有一节体育课&am…

你不得不知道的Python AI库

Python是人工智能&#xff08;AI&#xff09;和机器学习&#xff08;ML&#xff09;领域中使用最广泛的编程语言之一&#xff0c;拥有丰富的库支持各种AI和ML任务。本文介绍一些经典的Python AI库。 1. NumPy 简介&#xff1a;NumPy&#xff08;Numerical Python&#xff09;…

Docker部署ruoyi前后端分离项目

目录 一. 介绍前后端项目 二. 搭建局域网 2.1 创建网络 2.2 注意点 三. Redis 3.1 安装 3.2 配置redis.conf文件 3.3 测试 四. 安装MySQL 4.1 安装 4.2 配置my2.cnf文件 4.3 充许远程连接 五. 若依部署后端服务 5.1 数据导入 5.2 使用Dockerfile自定义镜像 5.3 运行…

基于单片机的医院输液系统设计

目 录 摘 要 Ⅰ Abstract Ⅱ 引 言 1 1系统方案设计与论证 3 1.1系统硬件结构总体设计方案 3 1.2点滴速度测量电路方案的选择与论证 3 1.3液面检测电路方案的选择与论证 4 1.4通过电机控制滴速电路的方案与论证 4 1.5显示器接口电路方案选择与论证 5 1.6键盘接口电路方案选择与…

土地利用数据分类过程教学/土地利用分类/遥感解译/土地利用获取来源介绍/地理数据获取

本篇主要介绍如何对影像数据进行分类解译&#xff0c;及过程教学&#xff0c;示例数据下载链接&#xff1a;数据下载链接 一、背景介绍 土地是人类赖以生存与发展的重要资源和物质保障&#xff0c;在“人口&#xff0d;资源&#xff0d;环境&#xff0d;发展&#x…