wordpress登陸后臺(tái)總是跳轉(zhuǎn)首頁網(wǎng)站seo服務(wù)公司
使用Java調(diào)用OpenAI API并解析響應(yīng):詳細(xì)教程
在現(xiàn)代應(yīng)用程序中,API調(diào)用是一個(gè)非常常見的任務(wù)。本文將通過一個(gè)完整的示例,講解如何使用Java調(diào)用OpenAI的ChatGPT API,并通過ObjectMapper
處理JSON響應(yīng)。本文的示例不僅適用于OpenAI的API,也可以擴(kuò)展到其他API調(diào)用中。具體示例中我們會(huì)使用HttpURLConnection
來發(fā)起請求,并使用ObjectMapper
進(jìn)行JSON解析。
項(xiàng)目場景
我們將編寫一個(gè)方法,通過調(diào)用ChatGPT API,模擬發(fā)送消息并獲取AI的響應(yīng)。核心步驟包括:
- 發(fā)起HTTP請求。
- 設(shè)置請求頭和請求體。
- 解析服務(wù)器返回的JSON響應(yīng)。
1. URL類
在Java中,URL
類用于表示統(tǒng)一資源定位符(即Web地址)。在我們的示例中,URL
對象用于指定我們要調(diào)用的API的URL地址。
URL url = new URL("https://api.chatanywhere.tech/v1/chat/completions");
這里我們使用了一個(gè)中轉(zhuǎn)服務(wù)器地址。通常,你會(huì)調(diào)用OpenAI官方的API地址 https://api.openai.com/v1/chat/completions
。但在國內(nèi),訪問這些外網(wǎng)資源可能受到限制,因此我們可以使用中轉(zhuǎn)服務(wù)進(jìn)行代理訪問。
2. HttpURLConnection類
HttpURLConnection
類是Java用于發(fā)送HTTP請求的核心類。我們通過它來設(shè)置請求方法、請求頭、請求體,并讀取響應(yīng)。
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
- 設(shè)置請求方法:通過
connection.setRequestMethod("GET")
或"POST"
可以指定HTTP請求類型。通常,API請求發(fā)送數(shù)據(jù)使用POST
方法。
connection.setRequestMethod("POST");
- 設(shè)置請求頭:為了與API服務(wù)交互,我們需要設(shè)置一些必要的請求頭信息,如授權(quán)信息和內(nèi)容類型。
connection.setRequestProperty("Authorization", "Bearer " + apiKey);
connection.setRequestProperty("Content-Type", "application/json");
- 請求體:在發(fā)送
POST
請求時(shí),需要將請求內(nèi)容以字節(jié)流的形式寫入輸出流中。這里我們構(gòu)建了一個(gè)JSON格式的請求體,并通過getOutputStream
方法發(fā)送。
String inputJson = "{\"model\": \"gpt-3.5-turbo\", \"messages\": [{\"role\": \"system\", \"content\": \"你是一個(gè)貼心的AI助手,用來解決用戶的各種問題,回答用中文!\"}, {\"role\": \"user\", \"content\": \"你是誰,基于什么模型?\"}]}";
try (OutputStream os = connection.getOutputStream()) {byte[] input = inputJson.getBytes(StandardCharsets.UTF_8);os.write(input, 0, input.length);
}
3. 處理響應(yīng)數(shù)據(jù)
一旦請求發(fā)送后,服務(wù)器會(huì)返回?cái)?shù)據(jù)。我們可以通過getInputStream
方法獲取服務(wù)器的響應(yīng),使用Scanner
類讀取并逐行打印響應(yīng)內(nèi)容。
//因?yàn)镮nputStream是一種一次性流,它只能讀取一次,讀完之后就關(guān)閉了,不能再讀取,所以用Scanner進(jìn)行讀取數(shù)據(jù)并逐行處理,然后再將其一行行的寫入StringBulider中,方便后續(xù)操作和使用
try (Scanner scanner = new Scanner(connection.getInputStream(), StandardCharsets.UTF_8)) {StringBuilder response = new StringBuilder();while (scanner.hasNext()) {response.append(scanner.nextLine());}System.out.println("接收到響應(yīng)為: " + response.toString());
}
4. 使用ObjectMapper解析JSON
在我們的API返回?cái)?shù)據(jù)中,通常是JSON格式。為了方便解析和操作JSON數(shù)據(jù),我們使用Jackson庫中的ObjectMapper
類。ObjectMapper
是Jackson提供的一個(gè)核心工具類,可以幫助我們將JSON字符串轉(zhuǎn)換為Java對象,或者將Java對象轉(zhuǎn)換為JSON。
ObjectMapper objectMapper = new ObjectMapper();
JsonNode jsonNode = objectMapper.readTree(response.toString());
JsonNode jsonChoicesNode = jsonNode.get("choices").get(0);
String content = jsonChoicesNode.get("message").get("content").asText();
在上面的代碼中,readTree()
方法會(huì)將JSON字符串轉(zhuǎn)換為JsonNode
對象。通過get()
方法,我們可以獲取JSON中的特定字段,并使用asText()
方法將其轉(zhuǎn)換為字符串。
5. 異常處理
在與外部API交互時(shí),可能會(huì)遇到各種異常情況,比如連接超時(shí)、讀寫超時(shí)或者其他I/O錯(cuò)誤。為了確保程序的魯棒性,我們需要捕獲這些異常并進(jìn)行處理。
catch (IOException e) {throw new RuntimeException(e);
}
完整代碼示例
void openAiChatGpt() {String apiKey = "sk-your-api-key";//替換成你自己的API KEY try {URL url = new URL("https://api.chatanywhere.tech/v1/chat/completions");System.out.println("測試連接");HttpURLConnection connection = (HttpURLConnection) url.openConnection();connection.setRequestMethod("GET");connection.setRequestProperty("Authorization", "Bearer " + apiKey);connection.setRequestProperty("Content-Type", "application/json");connection.setDoOutput(true);String inputJson = "{\"model\": \"gpt-3.5-turbo\", \"messages\": [{\"role\": \"system\", \"content\": \"你是一個(gè)貼心的AI助手,用來解決用戶的各種問題,回答用中文!\"}, {\"role\": \"user\", \"content\": \"你是誰,基于什么模型?\"}]}";try (OutputStream os = connection.getOutputStream()) {byte[] input = inputJson.getBytes(StandardCharsets.UTF_8);os.write(input, 0, input.length);}try (Scanner scanner = new Scanner(connection.getInputStream(), StandardCharsets.UTF_8)) {StringBuilder response = new StringBuilder();while (scanner.hasNext()) {response.append(scanner.nextLine());}System.out.println("接收到響應(yīng)為: " + response.toString());ObjectMapper objectMapper = new ObjectMapper();JsonNode jsonNode = objectMapper.readTree(response.toString());JsonNode jsonChoicesNode = jsonNode.get("choices").get(0);String content = jsonChoicesNode.get("message").get("content").asText();System.out.println("-----------");System.out.println(content);}} catch (IOException e) {throw new RuntimeException(e);}
}
結(jié)果
總結(jié)
通過這篇文章,我們了解了如何使用Java進(jìn)行HTTP請求,如何設(shè)置請求頭、發(fā)送請求體,如何使用Jackson的ObjectMapper
來解析服務(wù)器返回的JSON響應(yīng)。通過這個(gè)簡單的示例,你可以很容易擴(kuò)展到其他API調(diào)用場景中。如果你需要調(diào)用更多復(fù)雜的API,比如需要身份驗(yàn)證、文件上傳或下載,都可以在此基礎(chǔ)上進(jìn)行擴(kuò)展。
希望這篇文章對你有所幫助!如果你有任何問題,歡迎留言討論。