Java实现调用第三方相关接口(附详细思路)

news/2024/10/22 15:44:03/

目录

    • 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:更多接口请查阅官方文档

在这里插入图片描述
创作不易,感谢您的点赞与支持。

http://www.ppmy.cn/news/32415.html

相关文章

有什么比较好的bug管理工具?5款热门工具推荐

工具再优秀&#xff0c;适合自己才最重要。 为尽量讲透这个问题&#xff0c;本文的行文结构我先整理如下&#xff1a; 1、为什么需要bug管理工具&#xff1f; 2、好的bug管理工具的标准是什么&#xff1f; 3、好的bug管理工具推荐&#xff08;5款&#xff09; 4、如何挑选适合…

【分享】用友U8无需代码连接钉钉宜搭的方法

用友U8用户使用场景&#xff1a; 企业使用用友U8快速整合记账管理、报账统计工作&#xff0c;每当用友U8有新的单据时&#xff0c;还需财务人员查询单据详情&#xff0c;并同步到钉钉宜搭表单中进行汇总&#xff0c;便于相关负责人查看。但人工手动同步数据不仅费时费力且易出错…

java-正装照换底色小demo-技术分享

文章目录前言java-正装照换底色小demo-技术分享01 实现思路02 效果02::01 原图:02::02 执行单元测试:02::03 效果:03 编码实现前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞…

单片机——IIC协议与24C02

1、基础知识 1.1、IIC串行总线的组成及工作原理 I2C总线只有两根双向信号线。一根是数据线SDA&#xff0c;另一根是时钟线SCL。 1.2、I2C总线的数据传输 I2C总线进行数据传送时&#xff0c;时钟信号为高电平期间&#xff0c;数据线上的数据必须保持稳定&#xff0c;只有在时钟…

Linux操作系统基础的常用命令

1&#xff0c;Linux简介Linux是一种自由和开放源码的操作系统&#xff0c;存在着许多不同的Linux版本&#xff0c;但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中&#xff0c;比如手机、平板电脑、路由器、台式计算机。1.1Linux介绍Linux出现于1991年&#xff0c…

你真的知道如何系统高效地学习数据结构与算法吗?

文章目录前言&#xff1a;什么是数据结构&#xff1f;什么是算法&#xff1f;学习这个算法需要什么基础&#xff1f;学习的重点在什么地方&#xff1f;一些可以让你事半功倍的学习技巧1.边学边练&#xff0c;适度刷题2.多问、多思考、多互动3.打怪升级学习法4.知识需要沉淀&…

PTA:C课程设计(3)

山东大学&#xff08;威海&#xff09;2022级大一下C习题集&#xff08;3&#xff09;3-5-1 顺序查找3-5-2 计算二维数组第一列元素之和3-5-3 判断方阵对称3-6-1 输出整数k 的所有质因子3-7-1 去掉最大值和最小值3-7-2 合并数组3-7-3 对了几题&#xff08;单选题&#xff09;3-…

计算机器的工作时长

对机器人的工作时间,我指的是在负载额定下时,如何去确定一个电池工作的时间.我先说明一下,电池的容量,电池是用安时来标准容量的,单位:安时(AH),安时的意思就是:电池在一个小时内最大的放电量.比如,一个电池标称20AH,那我们可以说它在一个小时内最大能持续输出20A的电流.所以,我…