Java实现调用第三方相关接口(附详细思路)
目录
- 1.0.简单版
- 2.0.升级版
- 2-1.call.timeout()怎么传入新的超时值
- 2-2.timeout(10, TimeUnit.SECONDS)两个参数的意思,具体含义
- 3.0.进阶版
- 3-1.java.net.SocketTimeoutException: 超时如何解决
- 4.0.终极版

1.0.简单版
以下是一个使用 Java 实际请求“第三方”的简单示例代码。这个示例使用了 Java 的 OkHttp 库来发送 HTTP 请求和接收。
import okhttp3.*;import java.io.IOException;public class ChatGPT {private static final String API_ENDPOINT = "<your-api>";private static final String API_KEY = "<your-openai-api-key>";public static void main(String[] args) throws IOException {OkHttpClient client = new OkHttpClient();String prompt = "I like to eat pizza because";RequestBody requestBody = new FormBody.Builder().add("prompt", prompt).add("max_tokens", "50").add("temperature", "0.5").build();Request request = new Request.Builder().url(API_ENDPOINT).header("Authorization", "Bearer " + API_KEY).header("Content-Type", "application/json").post(requestBody).build();Call call = client.newCall(request);Response response = call.execute();String responseBody = response.body().string();System.out.println(responseBody);}
}
在这个示例中,我们使用了OkHttp库来发送HTTP请求到OpenAI的GPT-3 API,并接收响应。我们需要将OpenAI提供的API密钥设置为API_KEY变量的值,并将要请求的文本设置为prompt变量的值。我们还需要指定一些请求参数,如max_tokens和temperature,用于控制生成的文本长度和创造性程度。最后,我们将API响应的主体内容打印到控制台中。
请注意,这个示例是一个简单的示例,实际使用中可能需要进行更多的错误处理和数据解析。另外,OpenAI提供了多种API和模型,具体的实现可能因模型和API而异。
📌执行结果:
{"error": {"message": "Invalid Content-Type header (application/x-www-form-urlencoded), expected application/json. (HINT: If you're using curl, you can pass -H 'Content-Type: application/json')","type": "invalid_request_error","param": null,"code": null}
}
📌分析问题:
这个错误提示是由于请求头中的Content-Type设置为了application/x-www-form-urlencoded,但是OpenAI API要求请求头的Content-Type设置为application/json。因此,您需要在请求中将Content-Type修改为application/json。您可以使用OkHttp库的MediaType类来指定JSON格式的请求正文。以下是一个示例代码:
2.0.升级版
import okhttp3.*;import java.io.IOException;public class ChatGPT {private static final String API_ENDPOINT = "<your-api>";private static final String API_KEY = "<your-openai-api-key>";public static void main(String[] args) throws IOException {OkHttpClient client = new OkHttpClient();String prompt = "I like to eat pizza because";MediaType mediaType = MediaType.parse("application/json; charset=utf-8");String requestBody = "{\"prompt\":\"" + prompt + "\",\"max_tokens\":50,\"temperature\":0.5}";Request request = new Request.Builder().url(API_ENDPOINT).header("Authorization", "Bearer " + API_KEY).header("Content-Type", "application/json").post(RequestBody.create(mediaType, requestBody)).build();Call call = client.newCall(request);Response response = call.execute();String responseBody = response.body().string();System.out.println(responseBody);}
}
在这个示例中,我们使用了OkHttp库的MediaType类来指定请求正文的格式为JSON。我们将请求正文格式化为JSON字符串,并将其作为请求体发送。另外,我们还将Content-Type设置为application/json。
上面代码执行没有问题,但是遇到个别问题,会出现响应超时的异常错误:
📌执行结果:
Call call = client.newCall(request);
Response response = call.execute();
报错 timed out
📌分析问题:
当服务器响应请求的时间过长时,通常会发生“超时”错误。要修复此错误,您可以尝试以下操作:
-
1.增加超时:您可以尝试增加代码中的超时值。这将使服务器有更多时间在发生超时错误之前进行响应。您可以通过调用该call.timeout()方法并以秒为单位传入新的超时值来完成此操作。
-
2.检查您的网络连接:有时缓慢或不可靠的网络连接会导致超时错误。确保您的互联网连接稳定且快速,并检查其他网站或应用程序是否遇到类似问题。
-
3.查看服务器状态:可能是你所在的服务器运行卡顿。
2-1.call.timeout()怎么传入新的超时值
要为您的 OkHttpCall对象设置一个新的超时值,您可以使用该timeout方法并指定一个新的超时持续时间。
例如,如果你想设置 10 秒的超时,你可以使用下面的代码:
Call call = client.newCall(request);
call.timeout().timeout(10, TimeUnit.SECONDS);
Response response = call.execute();
在此代码中,该timeout方法返回的一个实例Timeout,您可以使用该实例通过该timeout方法设置新的超时值。timeout 的第一个参数是超时持续时间,第二个参数是时间单位(在本例中为TimeUnit.SECONDS)。
2-2.timeout(10, TimeUnit.SECONDS)两个参数的意思,具体含义
OkHttp 中的方法timeout有两个参数:
-
1.duration:这是 OkHttp 在请求超时之前等待的时间。它是一个 long 值,表示超时持续时间。
-
2.unit:这是用于参数的时间单位duration。它是枚举的一个实例TimeUnit,允许您以秒、毫秒、微秒或纳秒为单位指定持续时间。
所以在代码中timeout(10, TimeUnit.SECONDS),10是超时的持续时间(以秒为单位),并且TimeUnit.SECONDS是指定持续时间的时间单位。这意味着 OkHttp 将在请求超时之前等待 10 秒。如果服务器在 10 秒内没有响应,OkHttp 将抛出超时异常。
3.0.进阶版
按照上面的改进思路,增加了call.timeout()方法。
Call call = client.newCall(request);
call.timeout().timeout(180, TimeUnit.SECONDS);
Response response = call.execute();
在Call call = client.newCall(request);
的后面增加了call.timeout().timeout(180, TimeUnit.SECONDS);
这么一行代码,重新执行。
📌执行结果:
java.net.SocketTimeoutException: timeout
发现问题还是没有解决!
📌分析问题:
通常SocketTimeoutException表示客户端没有收到来自服务器的及时响应。当服务器响应时间过长或客户端与服务器之间存在网络连接问题时,可能会发生这种情况。在您的情况下,该timeout方法用于设置 200 秒的超时值,这对于大多数用例来说应该足够了。但是,如果服务器在该时间段内仍未响应,您可能需要尝试增加超时值以查看是否可以解决问题。
另一个可能的原因SocketTimeoutException是客户端和服务器之间可能存在一些网络连接问题。您可能需要检查您的网络连接并确保它稳定可靠。
最后,也有可能是服务器本身的问题。您可能需要检查服务器日志以查看是否存在任何可能导致超时的错误或问题。
3-1.java.net.SocketTimeoutException: 超时如何解决
SocketTimeoutException通常在网络操作完成时间过长时抛出。要解决此错误,您可以尝试以下操作:
- 1.增加超时值:您可以尝试增加网络操作的超时值。这可以使用或类timeout中的方法来完成。例如,您可以使用以下代码将超时设置为 60 秒:OkHttpClientURLConnection
OkHttpClient client = new OkHttpClient.Builder().connectTimeout(60, TimeUnit.SECONDS).readTimeout(60, TimeUnit.SECONDS).build();
这会将连接和读取超时设置为 60 秒。
-
2.检查您的网络连接:确保您的网络连接稳定且快速。您可以尝试重置您的路由器,或检查您的互联网服务提供商是否存在任何问题。
-
3.检查服务器状态:您尝试连接的服务器可能流量过大或暂时关闭。您可以查看服务器状态或联系服务器管理员确认。
-
4.优化您的代码:如果您的代码发出许多网络请求,您可以对其进行优化以减少请求数量或将请求一起批量处理。
4.0.终极版
对方法进行一下封装,方便接口调试
完整代码:
package com.example.business.controller;import okhttp3.*;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;import java.io.IOException;
import java.util.concurrent.TimeUnit;@Controller
@RequestMapping(value = "/chat")
public class ChatGPTController {private static final String API_ENDPOINT = "<your-api>";private static final String API_KEY = "<your-openai-api-key>";@ResponseBody@RequestMapping(value = "/get-chat-info", produces = "application/json;charset=UTF-8", method = {RequestMethod.GET, RequestMethod.POST})public String getChatInfo(String prompt) throws IOException {
// OkHttpClient client = new OkHttpClient();OkHttpClient client = new OkHttpClient.Builder().connectTimeout(180, TimeUnit.SECONDS).readTimeout(180, TimeUnit.SECONDS).build();// String prompt = "I like to eat pizza because";MediaType mediaType = MediaType.parse("application/json; charset=utf-8");String requestBody = "{\"prompt\":\"" + prompt + "\",\"max_tokens\":1024,\"temperature\":0.9,\"top_p\":1,\"frequency_penalty\":0.0,\"presence_penalty\":0.6}";Request request = new Request.Builder().url(API_ENDPOINT).header("Authorization", "Bearer " + API_KEY).header("Content-Type", "application/json").post(RequestBody.create(mediaType, requestBody)).build();Call call = client.newCall(request);call.timeout().timeout(180, TimeUnit.SECONDS);Response response = call.execute();String responseBody = response.body().string();System.out.println(responseBody);return responseBody;}
}
📌执行结果:
{"id": "cmpl-6k7pjisebdHLjNIF0wKoLyEhyOCVJ","object": "text_completion","created": 1676451219,"model": "text-davinci-003","choices": [{"text": "\n有什么可以帮助您?","index": 0,"logprobs": null,"finish_reason": "stop"}],"usage": {"prompt_tokens": 4,"completion_tokens": 21,"total_tokens": 25}
}
PS:更多接口请查阅官方文档

相关文章:

Java实现调用第三方相关接口(附详细思路)
目录1.0.简单版2.0.升级版2-1.call.timeout()怎么传入新的超时值2-2.timeout(10, TimeUnit.SECONDS)两个参数的意思,具体含义3.0.进阶版3-1.java.net.SocketTimeoutException: 超时如何解决4.0.终极版1.0.简单版 以下是一个使用 Java 实际请求“第三方”的简单示例代…...

基础数据结构:单链表
今天懒洋洋学习了关于基础数据结构有关单链表的相关操作,懒洋洋来这温习一下。一:单链表的定义链表定义:用链式存储的线性表统称为链表,即逻辑结构上连续,物理结构上不连续。链表分类:单链表、双链表、循环链表、静态链…...

基于51单片机的智能计算器Protues仿真设计
目录 一、设计背景 二、实现功能 三、硬件设计 3.1 总体硬件设计 3.2 键盘电路的设计 3.3 显示电路的设计 四、仿真演示 五、源程序 一、设计背景 随着社会的发展,科学的进步,人们的生活水平在逐步的提高,尤其是微电子技术的发展&am…...
Pandas数据分析实战练习
Pandas数据分析实战练习 文章目录 Pandas数据分析实战练习一、读取Excel文件中的数据1、读取工号、姓名、时段、交易额这四列数据,使用默认索引,输出前10行数据2、读取第一个worksheet中所有列,跳过第1、3、5行,指定下标为1的列中数据为DataFrame的行索引标签二、筛选符合特…...

C++ 继承下(二篇文章学习继承所有知识点)
5.继承与友元友元关系不能继承,也就是说基类友元不能访问子类私有和保护成员 //验证友元不能继承 class B {friend void Print(); public:B(int b): _b(b){cout << "B()" << endl;}protected:int _b; };class D : public B { public:D(int b,…...

【C++】C++11新特性——类的改进|lambda表达式
文章目录一、类的改进1.1 默认生成1.2 移动构造函数1.3 移动赋值重载函数1.4 成员变量缺省值1.5 强制生成默认函数的关键字default1.6 禁止生成默认函数的关键字delete1.6.1 C98防拷贝1.6.1 C11防拷贝二、lambda表达式2.1 对比2.2 lambda表达式语法2.3 捕捉列表2.4 函数对象与l…...

C语言进阶(37) | 程序环境和预处理
目录 1.程序的翻译环境和执行环境 2.详解编译链接 2.1 翻译环境 2.2 编译本身也分为几个阶段: 2.3 运行环境 3.预处理详解 3.1预定符号 3.2 #define 3.3 #undef 3.4 命令行定义 3.5 条件编译 3.6 文件包含 了解重点: 程序的翻译环境程序的执行环境详解: C语言程…...

Golang每日一练(leetDay0005)
目录 13. 罗马数字转整数 Roman to Integer ★ 14. 最长公共前缀 Longest Common Prefix ★ 15. 三数之和 3Sum ★★★ 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 13. 罗马数字转…...

occt_modeling_data(一)——拓扑
下面是我基于opencascade英文文档中关于occt_modeling_data中Topology部分进行的翻译,英文好的还是建议直接看文档,部分我不肯定的地方我会附上英文原句。如发现有错误欢迎评论区留言。 OCCT Topolog允许用户访问和操纵物体的数据,且不需要处…...

【AcWing】蓝桥杯备赛-深度优先搜索-dfs(3)
目录 写在前面: 题目:93. 递归实现组合型枚举 - AcWing题库 读题: 输入格式: 输出格式: 数据范围: 输入样例: 输出样例: 解题思路: 代码: AC &…...

宇宙最强-GPT-4 横空出世:最先进、更安全、更有用
文章目录前言一、准确性提升1.创造力2.视觉输入3.更长的上下文二、相比于ChatGPT有哪些提升1.GPT-4 的高级推理能力超越了 ChatGPT2.GPT-4 在多种测试考试中均优于 ChatGPT。三、研究团队在GPT-4模型都做了哪些改善1.遵循 GPT、GPT-2 和 GPT-3 的研究路径2.我们花了 6 个月的时…...

HashMap的实际开发使用
目 录 前言 一、HashMap是什么? 二、使用步骤 1.解析一下它实现的原理 编辑 2.实际开发使用 总结 前言 本章,只是大概记录一下hashMap的简单使用方法,以及理清一下hashMap的put方法的原理,以及get方法的原理。 一、Has…...

OpenCV入门(十三)快速学会OpenCV 12 图像梯度
OpenCV入门(十三)快速学会OpenCV 12 图像梯度1.Sobel算子1.1 计算x1.2 计算y1.3 计算xy2.Scharr算子2.1 计算x2.2 计算y2.3 计算xy3.Laplacian算子4.总结图像梯度计算的是图像变化的速度。对于图像的边缘部分,其灰度值变化较大,梯…...

软考:常见小题目计算题
01采购合同的类型采购合同主要包括总价类合同、成本补偿类合同、工料合同三大类合同。1、总价类合同此类合同为既定产品、服务或成果的采购设定一个总价。这种合同应在已明确定义需求,且不会出现重大范围变更的情况下使用。包括:(1࿰…...

【Linux】进程的程序替换
文章目录1. 程序替换1.创建子进程的目的是什么?2.了解程序是如何进行替换的3. 程序替换的基本原理当创建进程的时候,先有进程数据结构,还是先加载代码和数据?程序替换是整体替换,不是局部替换execl 返回值4. 替换函数1…...

【C++】模板(上)
文章目录1、泛型编程2、函数模板函数模板的实例化模板参数的匹配原则3、 类模板类模板的实例化1、泛型编程 void Swap(int& left, int& right) {int temp left;left right;right temp; } void Swap(double& left, double& right) {double temp left;left …...

express框架利用formidable上传图片
express框架,在上传图片功能方面,用formidable里面的incomingform功能,很方便。很多功能都已经封装好了,非常好用,简单,不需要写更深层次的代码了。确实不错。 下面是我自己跟着黑马教程的博客系统的部分&…...

测试背锅侠?入职软件测试后大d佬给我丢了这个bug分类分析,至今受益匪浅......
目录:导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜)前言 刚成为入职…...

STM32 OTA应用开发——通过内置DFU实现USB升级(方式1)
STM32 OTA应用开发——通过内置DFU实现USB升级(方式1) 目录STM32 OTA应用开发——通过内置DFU实现USB升级(方式1)前言1 硬件介绍2 环境搭建2.1 Keil uVsion2.2 zadig2.3 STM32CubeProgrammer2.4 安装USB驱动3 OTA升级结束语前言 …...

基于MFC的JavaScript进行网页数据交互
目录 前言 一、创建html对话框工程 二、使用步骤 1.引入JavaScript接口代码 2.重写相关接口 3.在html网页中添加C/C调用的接口 4.在MFC工程中添加调用接口 5.设置确认按键触发调用 6.运行结果 总结 前言 如何快速的进行MFC开发,这里我介绍一种JavaScript与C/C交互的…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...

JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...

vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...