Java實現(xiàn)調(diào)用第三方相關(guān)接口
1.0.簡單版
以下是一個使用 Java 實際請求“第三方”的簡單示例代碼。這個示例使用了 Java 的 OkHttp 庫來發(fā)送 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庫來發(fā)送HTTP請求到OpenAI的GPT-3 API,并接收響應。我們需要將OpenAI提供的API密鑰設置為API_KEY變量的值,并將要請求的文本設置為prompt變量的值。我們還需要指定一些請求參數(shù),如max_tokens和temperature,用于控制生成的文本長度和創(chuàng)造性程度。最后,我們將API響應的主體內(nèi)容打印到控制臺中。
請注意,這個示例是一個簡單的示例,實際使用中可能需要進行更多的錯誤處理和數(shù)據(jù)解析。另外,OpenAI提供了多種API和模型,具體的實現(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
}
}
??分析問題:
這個錯誤提示是由于請求頭中的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字符串,并將其作為請求體發(fā)送。另外,我們還將Content-Type設置為application/json。
上面代碼執(zhí)行沒有問題,但是遇到個別問題,會出現(xiàn)響應超時的異常錯誤:
??執(zhí)行結(jié)果:
Call call = client.newCall(request);
Response response = call.execute();
報錯 timed out
??分析問題:
當服務器響應請求的時間過長時,通常會發(fā)生“超時”錯誤。要修復此錯誤,您可以嘗試以下操作:
1.增加超時:您可以嘗試增加代碼中的超時值。這將使服務器有更多時間在發(fā)生超時錯誤之前進行響應。您可以通過調(diào)用該call.timeout()方法并以秒為單位傳入新的超時值來完成此操作。
2.檢查您的網(wǎng)絡連接:有時緩慢或不可靠的網(wǎng)絡連接會導致超時錯誤。確保您的互聯(lián)網(wǎng)連接穩(wěn)定且快速,并檢查其他網(wǎng)站或應用程序是否遇到類似問題。
3.查看服務器狀態(tài):可能是你所在的服務器運行卡頓。
2-1.call.timeout()怎么傳入新的超時值
要為您的 OkHttpCall對象設置一個新的超時值,您可以使用該timeout方法并指定一個新的超時持續(xù)時間。
例如,如果你想設置 10 秒的超時,你可以使用下面的代碼:
Call call = client.newCall(request); call.timeout().timeout(10, TimeUnit.SECONDS); Response response = call.execute();
在此代碼中,該timeout方法返回的一個實例Timeout,您可以使用該實例通過該timeout方法設置新的超時值。timeout 的第一個參數(shù)是超時持續(xù)時間,第二個參數(shù)是時間單位(在本例中為TimeUnit.SECONDS)。
2-2.timeout(10, TimeUnit.SECONDS)兩個參數(shù)的意思,具體含義
OkHttp 中的方法timeout有兩個參數(shù):
1.duration:這是 OkHttp 在請求超時之前等待的時間。它是一個 long 值,表示超時持續(xù)時間。
2.unit:這是用于參數(shù)的時間單位duration。它是枚舉的一個實例TimeUnit,允許您以秒、毫秒、微秒或納秒為單位指定持續(xù)時間。
所以在代碼中timeout(10, TimeUnit.SECONDS),10是超時的持續(xù)時間(以秒為單位),并且TimeUnit.SECONDS是指定持續(xù)時間的時間單位。這意味著 OkHttp 將在請求超時之前等待 10 秒。如果服務器在 10 秒內(nèi)沒有響應,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);
這么一行代碼,重新執(zhí)行。
??執(zhí)行結(jié)果:
java.net.SocketTimeoutException: timeout
發(fā)現(xiàn)問題還是沒有解決!
??分析問題:
通常SocketTimeoutException表示客戶端沒有收到來自服務器的及時響應。當服務器響應時間過長或客戶端與服務器之間存在網(wǎng)絡連接問題時,可能會發(fā)生這種情況。
在您的情況下,該timeout方法用于設置 200 秒的超時值,這對于大多數(shù)用例來說應該足夠了。但是,如果服務器在該時間段內(nèi)仍未響應,您可能需要嘗試增加超時值以查看是否可以解決問題。
另一個可能的原因SocketTimeoutException是客戶端和服務器之間可能存在一些網(wǎng)絡連接問題。您可能需要檢查您的網(wǎng)絡連接并確保它穩(wěn)定可靠。
最后,也有可能是服務器本身的問題。您可能需要檢查服務器日志以查看是否存在任何可能導致超時的錯誤或問題。
3-1.java.net.SocketTimeoutException: 超時如何解決
SocketTimeoutException通常在網(wǎng)絡操作完成時間過長時拋出。要解決此錯誤,您可以嘗試以下操作:
- 1.增加超時值:您可以嘗試增加網(wǎng)絡操作的超時值。這可以使用或類timeout中的方法來完成。例如,您可以使用以下代碼將超時設置為 60 秒:OkHttpClientURLConnection
OkHttpClient client = new OkHttpClient.Builder() .connectTimeout(60, TimeUnit.SECONDS) .readTimeout(60, TimeUnit.SECONDS) .build();
這會將連接和讀取超時設置為 60 秒。
2.檢查您的網(wǎng)絡連接:確保您的網(wǎng)絡連接穩(wěn)定且快速。您可以嘗試重置您的路由器,或檢查您的互聯(lián)網(wǎng)服務提供商是否存在任何問題。
3.檢查服務器狀態(tài):您嘗試連接的服務器可能流量過大或暫時關(guān)閉。您可以查看服務器狀態(tài)或聯(lián)系服務器管理員確認。
4.優(yōu)化您的代碼:如果您的代碼發(fā)出許多網(wǎng)絡請求,您可以對其進行優(yōu)化以減少請求數(shù)量或?qū)⒄埱笠黄鹋刻幚怼?/p>
4.0.終極版
對方法進行一下封裝,方便接口調(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
}
}
PS:更多接口請查閱官方文檔
到此這篇關(guān)于Java實現(xiàn)調(diào)用第三方相關(guān)接口的文章就介紹到這了,更多相關(guān)Java 調(diào)用第三方接口內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Stream distinct根據(jù)list某個字段去重的解決方案
這篇文章主要介紹了Stream distinct根據(jù)list某個字段去重,stream的distinct去重方法,是根據(jù) Object.equals,和 Object.hashCode這兩個方法來判斷是否重復的,本文給大家介紹的非常詳細,需要的朋友可以參考下2023-05-05Android中比較常見的Java super關(guān)鍵字
這篇文章主要為大家介紹了Android中比較常見的Java super關(guān)鍵字,具有一定的學習參考價值,感興趣的小伙伴們可以參考一下2016-01-01

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