Java實(shí)現(xiàn)調(diào)用第三方相關(guān)接口
1.0.簡單版
以下是一個(gè)使用 Java 實(shí)際請(qǐng)求“第三方”的簡單示例代碼。這個(gè)示例使用了 Java 的 OkHttp 庫來發(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庫來發(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,用于控制生成的文本長度和創(chuàng)造性程度。最后,我們將API響應(yīng)的主體內(nèi)容打印到控制臺(tái)中。
請(qǐng)注意,這個(gè)示例是一個(gè)簡單的示例,實(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
}
}
??分析問題:
這個(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庫的MediaType類來指定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庫的MediaType類來指定請(qǐng)求正文的格式為JSON。我們將請(qǐng)求正文格式化為JSON字符串,并將其作為請(qǐng)求體發(fā)送。另外,我們還將Content-Type設(shè)置為application/json。
上面代碼執(zhí)行沒有問題,但是遇到個(gè)別問題,會(huì)出現(xiàn)響應(yīng)超時(shí)的異常錯(cuò)誤:
??執(zhí)行結(jié)果:
Call call = client.newCall(request);
Response response = call.execute();
報(bào)錯(cuò) timed out
??分析問題:
當(dāng)服務(wù)器響應(yīng)請(qǐng)求的時(shí)間過長時(shí),通常會(huì)發(fā)生“超時(shí)”錯(cuò)誤。要修復(fù)此錯(cuò)誤,您可以嘗試以下操作:
1.增加超時(shí):您可以嘗試增加代碼中的超時(shí)值。這將使服務(wù)器有更多時(shí)間在發(fā)生超時(shí)錯(cuò)誤之前進(jìn)行響應(yīng)。您可以通過調(diào)用該call.timeout()方法并以秒為單位傳入新的超時(shí)值來完成此操作。
2.檢查您的網(wǎng)絡(luò)連接:有時(shí)緩慢或不可靠的網(wǎng)絡(luò)連接會(huì)導(dǎo)致超時(shí)錯(cuò)誤。確保您的互聯(lián)網(wǎng)連接穩(wěn)定且快速,并檢查其他網(wǎng)站或應(yīng)用程序是否遇到類似問題。
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í)例通過該timeout方法設(shè)置新的超時(shí)值。timeout 的第一個(gè)參數(shù)是超時(shí)持續(xù)時(shí)間,第二個(gè)參數(shù)是時(shí)間單位(在本例中為TimeUnit.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)沒有響應(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)問題還是沒有解決!
??分析問題:
通常SocketTimeoutException表示客戶端沒有收到來自服務(wù)器的及時(shí)響應(yīng)。當(dāng)服務(wù)器響應(yīng)時(shí)間過長或客戶端與服務(wù)器之間存在網(wǎng)絡(luò)連接問題時(shí),可能會(huì)發(fā)生這種情況。
在您的情況下,該timeout方法用于設(shè)置 200 秒的超時(shí)值,這對(duì)于大多數(shù)用例來說應(yīng)該足夠了。但是,如果服務(wù)器在該時(shí)間段內(nèi)仍未響應(yīng),您可能需要嘗試增加超時(shí)值以查看是否可以解決問題。
另一個(gè)可能的原因SocketTimeoutException是客戶端和服務(wù)器之間可能存在一些網(wǎng)絡(luò)連接問題。您可能需要檢查您的網(wǎng)絡(luò)連接并確保它穩(wěn)定可靠。
最后,也有可能是服務(wù)器本身的問題。您可能需要檢查服務(wù)器日志以查看是否存在任何可能導(dǎo)致超時(shí)的錯(cuò)誤或問題。
3-1.java.net.SocketTimeoutException: 超時(shí)如何解決
SocketTimeoutException通常在網(wǎng)絡(luò)操作完成時(shí)間過長時(shí)拋出。要解決此錯(cuò)誤,您可以嘗試以下操作:
- 1.增加超時(shí)值:您可以嘗試增加網(wǎng)絡(luò)操作的超時(shí)值。這可以使用或類timeout中的方法來完成。例如,您可以使用以下代碼將超時(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ù)提供商是否存在任何問題。
3.檢查服務(wù)器狀態(tài):您嘗試連接的服務(wù)器可能流量過大或暫時(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í)例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-05-05Java基礎(chǔ)知識(shí)精通數(shù)組的使用
數(shù)組對(duì)于每一門編程語言來說都是重要的數(shù)據(jù)結(jié)構(gòu)之一,當(dāng)然不同語言對(duì)數(shù)組的實(shí)現(xiàn)及處理也不盡相同。Java?語言中提供的數(shù)組是用來存儲(chǔ)固定大小的同類型元素2022-04-04Stream distinct根據(jù)list某個(gè)字段去重的解決方案
這篇文章主要介紹了Stream distinct根據(jù)list某個(gè)字段去重,stream的distinct去重方法,是根據(jù) Object.equals,和 Object.hashCode這兩個(gè)方法來判斷是否重復(fù)的,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-05-05Android中比較常見的Java super關(guān)鍵字
這篇文章主要為大家介紹了Android中比較常見的Java super關(guān)鍵字,具有一定的學(xué)習(xí)參考價(jià)值,感興趣的小伙伴們可以參考一下2016-01-01

基數(shù)排序簡介及Java語言實(shí)現(xiàn)

高級(jí)數(shù)據(jù)結(jié)構(gòu)及應(yīng)用之使用bitmap進(jìn)行字符串去重的方法實(shí)例

IDEA項(xiàng)目如何實(shí)現(xiàn)打jar包