使用Java调用OpenAI API并解析响应:详细教程

使用Java调用OpenAI API并解析响应:详细教程

在现代应用程序中,API调用是一个非常常见的任务。本文将通过一个完整的示例,讲解如何使用Java调用OpenAI的ChatGPT API,并通过ObjectMapper处理JSON响应。本文的示例不仅适用于OpenAI的API,也可以扩展到其他API调用中。具体示例中我们会使用HttpURLConnection来发起请求,并使用ObjectMapper进行JSON解析。

项目场景

我们将编写一个方法,通过调用ChatGPT API,模拟发送消息并获取AI的响应。核心步骤包括:

  1. 发起HTTP请求。
  2. 设置请求头和请求体。
  3. 解析服务器返回的JSON响应。

1. URL类

在Java中,URL类用于表示统一资源定位符(即Web地址)。在我们的示例中,URL对象用于指定我们要调用的API的URL地址。

URL url = new URL("https://api.chatanywhere.tech/v1/chat/completions");

这里我们使用了一个中转服务器地址。通常,你会调用OpenAI官方的API地址 https://api.openai.com/v1/chat/completions。但在国内,访问这些外网资源可能受到限制,因此我们可以使用中转服务进行代理访问。

2. HttpURLConnection类

HttpURLConnection类是Java用于发送HTTP请求的核心类。我们通过它来设置请求方法、请求头、请求体,并读取响应。

HttpURLConnection connection = (HttpURLConnection) url.openConnection();
  • 设置请求方法:通过connection.setRequestMethod("GET")"POST"可以指定HTTP请求类型。通常,API请求发送数据使用POST方法。
connection.setRequestMethod("POST");
  • 设置请求头:为了与API服务交互,我们需要设置一些必要的请求头信息,如授权信息和内容类型。
connection.setRequestProperty("Authorization", "Bearer " + apiKey);
connection.setRequestProperty("Content-Type", "application/json");
  • 请求体:在发送POST请求时,需要将请求内容以字节流的形式写入输出流中。这里我们构建了一个JSON格式的请求体,并通过getOutputStream方法发送。
String inputJson = "{\"model\": \"gpt-3.5-turbo\", \"messages\": [{\"role\": \"system\", \"content\": \"你是一个贴心的AI助手,用来解决用户的各种问题,回答用中文!\"}, {\"role\": \"user\", \"content\": \"你是谁,基于什么模型?\"}]}";
try (OutputStream os = connection.getOutputStream()) {byte[] input = inputJson.getBytes(StandardCharsets.UTF_8);os.write(input, 0, input.length);
}

3. 处理响应数据

一旦请求发送后,服务器会返回数据。我们可以通过getInputStream方法获取服务器的响应,使用Scanner类读取并逐行打印响应内容。

//因为InputStream是一种一次性流,它只能读取一次,读完之后就关闭了,不能再读取,所以用Scanner进行读取数据并逐行处理,然后再将其一行行的写入StringBulider中,方便后续操作和使用
try (Scanner scanner = new Scanner(connection.getInputStream(), StandardCharsets.UTF_8)) {StringBuilder response = new StringBuilder();while (scanner.hasNext()) {response.append(scanner.nextLine());}System.out.println("接收到响应为: " + response.toString());
}

4. 使用ObjectMapper解析JSON

在我们的API返回数据中,通常是JSON格式。为了方便解析和操作JSON数据,我们使用Jackson库中的ObjectMapper类。ObjectMapper是Jackson提供的一个核心工具类,可以帮助我们将JSON字符串转换为Java对象,或者将Java对象转换为JSON。

ObjectMapper objectMapper = new ObjectMapper();
JsonNode jsonNode = objectMapper.readTree(response.toString());
JsonNode jsonChoicesNode = jsonNode.get("choices").get(0);
String content = jsonChoicesNode.get("message").get("content").asText();

在上面的代码中,readTree()方法会将JSON字符串转换为JsonNode对象。通过get()方法,我们可以获取JSON中的特定字段,并使用asText()方法将其转换为字符串。

5. 异常处理

在与外部API交互时,可能会遇到各种异常情况,比如连接超时、读写超时或者其他I/O错误。为了确保程序的鲁棒性,我们需要捕获这些异常并进行处理。

catch (IOException e) {throw new RuntimeException(e);
}

完整代码示例

void openAiChatGpt() {String apiKey = "sk-your-api-key";//替换成你自己的API KEY try {URL url = new URL("https://api.chatanywhere.tech/v1/chat/completions");System.out.println("测试连接");HttpURLConnection connection = (HttpURLConnection) url.openConnection();connection.setRequestMethod("GET");connection.setRequestProperty("Authorization", "Bearer " + apiKey);connection.setRequestProperty("Content-Type", "application/json");connection.setDoOutput(true);String inputJson = "{\"model\": \"gpt-3.5-turbo\", \"messages\": [{\"role\": \"system\", \"content\": \"你是一个贴心的AI助手,用来解决用户的各种问题,回答用中文!\"}, {\"role\": \"user\", \"content\": \"你是谁,基于什么模型?\"}]}";try (OutputStream os = connection.getOutputStream()) {byte[] input = inputJson.getBytes(StandardCharsets.UTF_8);os.write(input, 0, input.length);}try (Scanner scanner = new Scanner(connection.getInputStream(), StandardCharsets.UTF_8)) {StringBuilder response = new StringBuilder();while (scanner.hasNext()) {response.append(scanner.nextLine());}System.out.println("接收到响应为: " + response.toString());ObjectMapper objectMapper = new ObjectMapper();JsonNode jsonNode = objectMapper.readTree(response.toString());JsonNode jsonChoicesNode = jsonNode.get("choices").get(0);String content = jsonChoicesNode.get("message").get("content").asText();System.out.println("-----------");System.out.println(content);}} catch (IOException e) {throw new RuntimeException(e);}
}

结果

在这里插入图片描述

总结

通过这篇文章,我们了解了如何使用Java进行HTTP请求,如何设置请求头、发送请求体,如何使用Jackson的ObjectMapper来解析服务器返回的JSON响应。通过这个简单的示例,你可以很容易扩展到其他API调用场景中。如果你需要调用更多复杂的API,比如需要身份验证、文件上传或下载,都可以在此基础上进行扩展。

希望这篇文章对你有所帮助!如果你有任何问题,欢迎留言讨论。

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

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

相关文章

网络参考模型

OSI七层网络参考模型 OSI模型仅作为参考,现实中并不用,OSI模型的目的是为了解决主机之间的网络通讯。 1. 物理层: 物理层将由比特(0和1)组成的数据用不同的媒介(电、光或其他形式的电磁波)传输…

黑马软件测试第一篇_测试理论

概念 使用技术手段验证软件功能是否符合需求 测试种类 功能测试 自动化测试 接口测试 性能测试 按测试阶段划分 单元测试:针对程序源码进行测试 集成测试:又称接口测试,针对模块之间访问地址进行测试 系统测试:对整个系统进行…

京东零售数据湖应用与实践

作者:陈洪健:京东零售大数据架构师,深耕大数据 10 年,2019 年加入京东,主要负责 OLAP 优化、大数据传输工具生态、流批一体、SRE 建设。 当前企业数据处理广泛采用 Lambda 架构。Lambda 架构的优点是保证了数据的完整性…

YOLO的相关改进机制

我的面包多平台有多种关于YOLO的改进,大家尽早关注,不迷路

【宽字节注入】

字符编码 url 编码 GBK编码 utf8 编码 宽字节注入 php中的转译函数 宽字节注入介绍 练习 正常输入没有回显: 没有回显 usernameadmin&passwordadmin 闭合单引号,依旧没有回显 usernameadmin and 11%23&passwordadmin利用宽字节尝试闭合,依旧…

查看SQL Server授权序列号通过SQL查询查看安装日志文件使用PowerShell查询

本人详解 作者:王文峰,参加过 CSDN 2020年度博客之星,《Java王大师王天师》 公众号:JAVA开发王大师,专注于天道酬勤的 Java 开发问题中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯 山峯 转载说明:务必注明来源(注明:作者:王文峰…

在Stable Diffusion WebUI中安装SadTalker插件时几种错误提示的处理方法

SD中的插件一般安装比较简单,但也有一些插件安装会比较难。比如我在安装SadTalker时,就遇到很多问题,一度放弃了,后来查了一些网上攻略,自己也反复查看日志,终于解决,不吐不快。 一、在Stable …

闪迪U盘误删的数据该怎么恢复呢?3个方法轻松解决

闪迪是一家全球知名的美国公司,也是全球最大的闪存数据存储卡产品供应商,其中,闪迪U盘作为其主要产品之一,因其便携性、大容量和高速传输能力而深受用户喜爱。然而,在平时存储重要数据的时候,会因为我们一系…

ElasticSearch备考 -- Update by query Reindex

一、题目 有个索引task,里面的文档长这样 现在需要添加一个字段all,这个字段的值是以下 a、b、c、d字段的值连在一起 二、思考 需要把四个字段拼接到一起,组成一个新的字段,这个就需要脚本, 这里有两种方案&#xff…

CSRF | GET 型 CSRF 漏洞攻击

关注这个漏洞的其他相关笔记:CSRF 漏洞 - 学习手册-CSDN博客 0x01:GET 型 CSRF 漏洞攻击 —— 理论篇 GET 型 CSRF 漏洞是指攻击者通过构造恶意的 HTTP GET 请求,利用用户的登录状态,在用户不知情的情况下,诱使浏览器…

Elasticsearch(二)集成Spring Boot 基本的API操作

目录 一、集成Spring Boot 1、创建项目 2、pom文件 查看springboot集成的依赖 3、增加es的config类 二、索引相关API 1、创建索引 2、获取索引,判断其是否存在 3、删除索引 三、文档相关API 1、添加文档 2、获取文档,判断是否存在 3、获取文档…

【D3.js in Action 3 精译_029】3.5 给 D3 条形图加注图表标签(上)

当前内容所在位置(可进入专栏查看其他译好的章节内容) 第一部分 D3.js 基础知识 第一章 D3.js 简介(已完结) 1.1 何为 D3.js?1.2 D3 生态系统——入门须知1.3 数据可视化最佳实践(上)1.3 数据可…

深度学习:基于MindSpore实现ResNet50中药分拣

ResNet基本介绍 ResNet(Residual Network)是一种深度神经网络架构,由微软研究院的Kaiming He等人在2015年提出,并且在ILSVRC 2015竞赛中取得了很好的成绩。ResNet主要解决了随着网络深度增加而出现的退化问题,即当网络…

vulnhub-digitalworld.local DEVELOPMENT靶机

vulnhub:digitalworld.local: DEVELOPMENT ~ VulnHub 导入靶机,放在kali同网段,扫描 靶机在192.168.114.129,扫描端口 开了几个端口,8080端口有网页,访问 说是让访问html_pages 似乎把页面都写出来了&…

Unity网络开发基础 —— 实践小项目

概述 接Unity网络开发基础 导入基础知识中的代码 需求分析 手动写Handler类 手动书写消息池 using GamePlayer; using System; using System.Collections; using System.Collections.Generic; using UnityEngine;/// <summary> /// 消息池中 主要是用于 注册 ID和消息类…

JavaEE之多线程进阶-面试问题

一.常见的锁策略 锁策略不是指某一个具体的锁&#xff0c;所有的锁都可以往这些锁策略中套 1.悲观锁与乐观锁 预测所冲突的概率是否高&#xff0c;悲观锁为预测锁冲突的概率较高&#xff0c;乐观锁为预测锁冲突的概率更低。 2.重量级锁和轻量级锁 从加锁的开销角度判断&am…

ssm教师办公管理系统的设计与实现+jsp

系统包含&#xff1a;源码论文 所用技术&#xff1a;SpringBootVueSSMMybatisMysql 免费提供给大家参考或者学习&#xff0c;获取源码请私聊我 需要定制请私聊 目 录 目 录 III 1 绪论 1 1.1 研究背景 1 1.2 目的和意义 1 1.3 论文结构安排 2 2 相关技术 3 2.1 JSP技…

大模型存储选型 JuiceFS 在关键环节性能详解

从去年开始&#xff0c;LLM大语言模型领域发展迅速、如 LLaMA、ChatGLM、Baichuan、Qwen 和 yi-model 等基础模型&#xff08;Foundation Models&#xff09;的数量显著增加。众多企业也开始基于这些基础模型做 post-training 的相关工作&#xff0c;以开发特定垂直领域的模型实…

一键生成二维码的源码系统 电脑+手机版自适应代码 带完整的安装代码包以及搭建部署教程

系统概述 一键生成二维码的源码系统是一款集二维码生成、管理和应用于一体的综合性平台。它采用先进的技术和算法&#xff0c;能够快速、准确地生成各种类型的二维码&#xff0c;包括文本、链接、图片等。同时&#xff0c;该系统还具备高度的灵活性和可扩展性&#xff0c;能够…

基于matlab变频器控制交流电机调速系统的设计与仿真(毕业论文)

目录 摘要 I ABSTRACT II 绪论 1 1交流调速技术发展概况 2 1.1电力电子器件 3 1.2变流技术 3 1.3变频调速的控制方式 4 1.4MATLAB/Simulink仿真介绍 4 2逆变电路的建模与仿真 5 2.1绝缘栅双极型晶体管 6 2.2三相桥式逆变电路的基本原理 6 2.3正弦脉冲宽度调制&#xff08;SPWM&…