Java實(shí)現(xiàn)調(diào)用第三方相關(guān)接口
1.0.簡(jiǎn)單版
以下是一個(gè)使用 Java 實(shí)際請(qǐng)求“第三方”的簡(jiǎn)單示例代碼。這個(gè)示例使用了 Java 的 OkHttp 庫(kù)來(lái)發(fā)送 HTTP 請(qǐng)求和接收。
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);
}
}在這個(gè)示例中,我們使用了OkHttp庫(kù)來(lái)發(fā)送HTTP請(qǐng)求到OpenAI的GPT-3 API,并接收響應(yīng)。我們需要將OpenAI提供的API密鑰設(shè)置為API_KEY變量的值,并將要請(qǐng)求的文本設(shè)置為prompt變量的值。我們還需要指定一些請(qǐng)求參數(shù),如max_tokens和temperature,用于控制生成的文本長(zhǎng)度和創(chuàng)造性程度。最后,我們將API響應(yīng)的主體內(nèi)容打印到控制臺(tái)中。
請(qǐng)注意,這個(gè)示例是一個(gè)簡(jiǎn)單的示例,實(shí)際使用中可能需要進(jìn)行更多的錯(cuò)誤處理和數(shù)據(jù)解析。另外,OpenAI提供了多種API和模型,具體的實(shí)現(xiàn)可能因模型和API而異。
??執(zhí)行結(jié)果:
{
"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
}
}
??分析問(wèn)題:
這個(gè)錯(cuò)誤提示是由于請(qǐng)求頭中的Content-Type設(shè)置為了application/x-www-form-urlencoded,但是OpenAI API要求請(qǐng)求頭的Content-Type設(shè)置為application/json。因此,您需要在請(qǐng)求中將Content-Type修改為application/json。您可以使用OkHttp庫(kù)的MediaType類(lèi)來(lái)指定JSON格式的請(qǐng)求正文。以下是一個(gè)示例代碼:
2.0.升級(jí)版
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);
}
}在這個(gè)示例中,我們使用了OkHttp庫(kù)的MediaType類(lèi)來(lái)指定請(qǐng)求正文的格式為JSON。我們將請(qǐng)求正文格式化為JSON字符串,并將其作為請(qǐng)求體發(fā)送。另外,我們還將Content-Type設(shè)置為application/json。
上面代碼執(zhí)行沒(méi)有問(wèn)題,但是遇到個(gè)別問(wèn)題,會(huì)出現(xiàn)響應(yīng)超時(shí)的異常錯(cuò)誤:
??執(zhí)行結(jié)果:
Call call = client.newCall(request);
Response response = call.execute();
報(bào)錯(cuò) timed out
??分析問(wèn)題:
當(dāng)服務(wù)器響應(yīng)請(qǐng)求的時(shí)間過(guò)長(zhǎng)時(shí),通常會(huì)發(fā)生“超時(shí)”錯(cuò)誤。要修復(fù)此錯(cuò)誤,您可以嘗試以下操作:
1.增加超時(shí):您可以嘗試增加代碼中的超時(shí)值。這將使服務(wù)器有更多時(shí)間在發(fā)生超時(shí)錯(cuò)誤之前進(jìn)行響應(yīng)。您可以通過(guò)調(diào)用該call.timeout()方法并以秒為單位傳入新的超時(shí)值來(lái)完成此操作。
2.檢查您的網(wǎng)絡(luò)連接:有時(shí)緩慢或不可靠的網(wǎng)絡(luò)連接會(huì)導(dǎo)致超時(shí)錯(cuò)誤。確保您的互聯(lián)網(wǎng)連接穩(wěn)定且快速,并檢查其他網(wǎng)站或應(yīng)用程序是否遇到類(lèi)似問(wèn)題。
3.查看服務(wù)器狀態(tài):可能是你所在的服務(wù)器運(yùn)行卡頓。
2-1.call.timeout()怎么傳入新的超時(shí)值
要為您的 OkHttpCall對(duì)象設(shè)置一個(gè)新的超時(shí)值,您可以使用該timeout方法并指定一個(gè)新的超時(shí)持續(xù)時(shí)間。
例如,如果你想設(shè)置 10 秒的超時(shí),你可以使用下面的代碼:
Call call = client.newCall(request); call.timeout().timeout(10, TimeUnit.SECONDS); Response response = call.execute();
在此代碼中,該timeout方法返回的一個(gè)實(shí)例Timeout,您可以使用該實(shí)例通過(guò)該timeout方法設(shè)置新的超時(shí)值。timeout 的第一個(gè)參數(shù)是超時(shí)持續(xù)時(shí)間,第二個(gè)參數(shù)是時(shí)間單位(在本例中為T(mén)imeUnit.SECONDS)。
2-2.timeout(10, TimeUnit.SECONDS)兩個(gè)參數(shù)的意思,具體含義
OkHttp 中的方法timeout有兩個(gè)參數(shù):
1.duration:這是 OkHttp 在請(qǐng)求超時(shí)之前等待的時(shí)間。它是一個(gè) long 值,表示超時(shí)持續(xù)時(shí)間。
2.unit:這是用于參數(shù)的時(shí)間單位duration。它是枚舉的一個(gè)實(shí)例TimeUnit,允許您以秒、毫秒、微秒或納秒為單位指定持續(xù)時(shí)間。
所以在代碼中timeout(10, TimeUnit.SECONDS),10是超時(shí)的持續(xù)時(shí)間(以秒為單位),并且TimeUnit.SECONDS是指定持續(xù)時(shí)間的時(shí)間單位。這意味著 OkHttp 將在請(qǐng)求超時(shí)之前等待 10 秒。如果服務(wù)器在 10 秒內(nèi)沒(méi)有響應(yīng),OkHttp 將拋出超時(shí)異常。
3.0.進(jìn)階版
按照上面的改進(jìn)思路,增加了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);這么一行代碼,重新執(zhí)行。
??執(zhí)行結(jié)果:
java.net.SocketTimeoutException: timeout
發(fā)現(xiàn)問(wèn)題還是沒(méi)有解決!
??分析問(wèn)題:
通常SocketTimeoutException表示客戶(hù)端沒(méi)有收到來(lái)自服務(wù)器的及時(shí)響應(yīng)。當(dāng)服務(wù)器響應(yīng)時(shí)間過(guò)長(zhǎng)或客戶(hù)端與服務(wù)器之間存在網(wǎng)絡(luò)連接問(wèn)題時(shí),可能會(huì)發(fā)生這種情況。
在您的情況下,該timeout方法用于設(shè)置 200 秒的超時(shí)值,這對(duì)于大多數(shù)用例來(lái)說(shuō)應(yīng)該足夠了。但是,如果服務(wù)器在該時(shí)間段內(nèi)仍未響應(yīng),您可能需要嘗試增加超時(shí)值以查看是否可以解決問(wèn)題。
另一個(gè)可能的原因SocketTimeoutException是客戶(hù)端和服務(wù)器之間可能存在一些網(wǎng)絡(luò)連接問(wèn)題。您可能需要檢查您的網(wǎng)絡(luò)連接并確保它穩(wěn)定可靠。
最后,也有可能是服務(wù)器本身的問(wèn)題。您可能需要檢查服務(wù)器日志以查看是否存在任何可能導(dǎo)致超時(shí)的錯(cuò)誤或問(wèn)題。
3-1.java.net.SocketTimeoutException: 超時(shí)如何解決
SocketTimeoutException通常在網(wǎng)絡(luò)操作完成時(shí)間過(guò)長(zhǎng)時(shí)拋出。要解決此錯(cuò)誤,您可以嘗試以下操作:
- 1.增加超時(shí)值:您可以嘗試增加網(wǎng)絡(luò)操作的超時(shí)值。這可以使用或類(lèi)timeout中的方法來(lái)完成。例如,您可以使用以下代碼將超時(shí)設(shè)置為 60 秒:OkHttpClientURLConnection
OkHttpClient client = new OkHttpClient.Builder() .connectTimeout(60, TimeUnit.SECONDS) .readTimeout(60, TimeUnit.SECONDS) .build();
這會(huì)將連接和讀取超時(shí)設(shè)置為 60 秒。
2.檢查您的網(wǎng)絡(luò)連接:確保您的網(wǎng)絡(luò)連接穩(wěn)定且快速。您可以嘗試重置您的路由器,或檢查您的互聯(lián)網(wǎng)服務(wù)提供商是否存在任何問(wèn)題。
3.檢查服務(wù)器狀態(tài):您嘗試連接的服務(wù)器可能流量過(guò)大或暫時(shí)關(guān)閉。您可以查看服務(wù)器狀態(tài)或聯(lián)系服務(wù)器管理員確認(rèn)。
4.優(yōu)化您的代碼:如果您的代碼發(fā)出許多網(wǎng)絡(luò)請(qǐng)求,您可以對(duì)其進(jìn)行優(yōu)化以減少請(qǐng)求數(shù)量或?qū)⒄?qǐng)求一起批量處理。
4.0.終極版
對(duì)方法進(jìn)行一下封裝,方便接口調(diào)試
完整代碼:
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;
}
}??執(zhí)行結(jié)果:
{
"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
}
}

到此這篇關(guān)于Java實(shí)現(xiàn)調(diào)用第三方相關(guān)接口的文章就介紹到這了,更多相關(guān)Java 調(diào)用第三方接口內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java實(shí)現(xiàn)的程序員老黃歷實(shí)例
這篇文章主要介紹了Java實(shí)現(xiàn)的程序員老黃歷實(shí)例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-05-05
Java基礎(chǔ)知識(shí)精通數(shù)組的使用
數(shù)組對(duì)于每一門(mén)編程語(yǔ)言來(lái)說(shuō)都是重要的數(shù)據(jù)結(jié)構(gòu)之一,當(dāng)然不同語(yǔ)言對(duì)數(shù)組的實(shí)現(xiàn)及處理也不盡相同。Java?語(yǔ)言中提供的數(shù)組是用來(lái)存儲(chǔ)固定大小的同類(lèi)型元素2022-04-04
Stream distinct根據(jù)list某個(gè)字段去重的解決方案
這篇文章主要介紹了Stream distinct根據(jù)list某個(gè)字段去重,stream的distinct去重方法,是根據(jù) Object.equals,和 Object.hashCode這兩個(gè)方法來(lái)判斷是否重復(fù)的,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-05-05
Android中比較常見(jiàn)的Java super關(guān)鍵字
這篇文章主要為大家介紹了Android中比較常見(jiàn)的Java super關(guān)鍵字,具有一定的學(xué)習(xí)參考價(jià)值,感興趣的小伙伴們可以參考一下2016-01-01
基數(shù)排序簡(jiǎn)介及Java語(yǔ)言實(shí)現(xiàn)
高級(jí)數(shù)據(jù)結(jié)構(gòu)及應(yīng)用之使用bitmap進(jìn)行字符串去重的方法實(shí)例
IDEA項(xiàng)目如何實(shí)現(xiàn)打jar包

