使用Java调用OpenAI API并解析响应:详细教程

使用Java调用OpenAI API并解析响应:详细教程

在现代应用程序中,API调用是一个非常常见的任务。本文将通过一个完整的示例,讲解如何使用Java调用OpenAI的ChatGPT API,并通过ObjectMapper处理JSON响应。本文的示例不仅适用于OpenAI的API,也可以扩展到其他API调用中。具体示例中我们会使用HttpURLConnection来发起请求,并使用ObjectMapper进行JSON解析。

项目场景

我们将编写一个方法,通过调用ChatGPT API,模拟发送消息并获取AI的响应。核心步骤包括:

  1. 发起HTTP请求。
  2. 设置请求头和请求体。
  3. 解析服务器返回的JSON响应。

1. URL类

在Java中,URL类用于表示统一资源定位符(即Web地址)。在我们的示例中,URL对象用于指定我们要调用的API的URL地址。

URL url = new URL("https://api.chatanywhere.tech/v1/chat/completions");

这里我们使用了一个中转服务器地址。通常,你会调用OpenAI官方的API地址 https://api.openai.com/v1/chat/completions。但在国内,访问这些外网资源可能受到限制,因此我们可以使用中转服务进行代理访问。

2. HttpURLConnection类

HttpURLConnection类是Java用于发送HTTP请求的核心类。我们通过它来设置请求方法、请求头、请求体,并读取响应。

HttpURLConnection connection = (HttpURLConnection) url.openConnection();
  • 设置请求方法:通过connection.setRequestMethod("GET")"POST"可以指定HTTP请求类型。通常,API请求发送数据使用POST方法。
connection.setRequestMethod("POST");
  • 设置请求头:为了与API服务交互,我们需要设置一些必要的请求头信息,如授权信息和内容类型。
connection.setRequestProperty("Authorization", "Bearer " + apiKey);
connection.setRequestProperty("Content-Type", "application/json");
  • 请求体:在发送POST请求时,需要将请求内容以字节流的形式写入输出流中。这里我们构建了一个JSON格式的请求体,并通过getOutputStream方法发送。
String inputJson = "{\"model\": \"gpt-3.5-turbo\", \"messages\": [{\"role\": \"system\", \"content\": \"你是一个贴心的AI助手,用来解决用户的各种问题,回答用中文!\"}, {\"role\": \"user\", \"content\": \"你是谁,基于什么模型?\"}]}";
try (OutputStream os = connection.getOutputStream()) {
    byte[] input = inputJson.getBytes(StandardCharsets.UTF_8);
    os.write(input, 0, input.length);
}

3. 处理响应数据

一旦请求发送后,服务器会返回数据。我们可以通过getInputStream方法获取服务器的响应,使用Scanner类读取并逐行打印响应内容。

//因为InputStream是一种一次性流,它只能读取一次,读完之后就关闭了,不能再读取,所以用Scanner进行读取数据并逐行处理,然后再将其一行行的写入StringBulider中,方便后续操作和使用
try (Scanner scanner = new Scanner(connection.getInputStream(), StandardCharsets.UTF_8)) {
    StringBuilder response = new StringBuilder();
    while (scanner.hasNext()) {
        response.append(scanner.nextLine());
    }
    System.out.println("接收到响应为: " + response.toString());
}

4. 使用ObjectMapper解析JSON

在我们的API返回数据中,通常是JSON格式。为了方便解析和操作JSON数据,我们使用Jackson库中的ObjectMapper类。ObjectMapper是Jackson提供的一个核心工具类,可以帮助我们将JSON字符串转换为Java对象,或者将Java对象转换为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()方法会将JSON字符串转换为JsonNode对象。通过get()方法,我们可以获取JSON中的特定字段,并使用asText()方法将其转换为字符串。

5. 异常处理

在与外部API交互时,可能会遇到各种异常情况,比如连接超时、读写超时或者其他I/O错误。为了确保程序的鲁棒性,我们需要捕获这些异常并进行处理。

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\": \"你是一个贴心的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("接收到响应为: " + 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);
    }
}

结果

在这里插入图片描述

总结

通过这篇文章,我们了解了如何使用Java进行HTTP请求,如何设置请求头、发送请求体,如何使用Jackson的ObjectMapper来解析服务器返回的JSON响应。通过这个简单的示例,你可以很容易扩展到其他API调用场景中。如果你需要调用更多复杂的API,比如需要身份验证、文件上传或下载,都可以在此基础上进行扩展。

希望这篇文章对你有所帮助!如果你有任何问题,欢迎留言讨论。

使用Java调用OpenAI API Key需要遵循几个步骤: 1. **添加依赖**:首先,你需要在你的项目中引入合适的库来处理HTTP请求。对于简单的HTTP请求,可以使用`java.net.HttpURLConnection`或者第三方库如`HttpURLConnection`或`Apache HttpClient`。 ```java import java.net.HttpURLConnection; import java.net.URL; ``` 或者使用像`retrofit`这样的现代化HTTP客户端库,它更方便、强大,支持自动处理JSON响应。 ```java // 如果使用Retrofit import retrofit2.Retrofit; import retrofit2.converter.gson.GsonConverterFactory; ``` 2. **设置API密钥**:将你的OpenAI API密钥作为环境变量存储或硬编码到代码中,注意保持安全。 ```java final String apiKey = System.getenv("OPENAI_API_KEY") || "your_api_key_here"; ``` 3. **创建请求**:创建一个新的URL实例,并使用API密钥构造请求的查询字符串。 ```java URL url = new URL(String.format("https://api.openai.com/v1/engines/davinci-completions", apiKey)); ``` 4. **发送请求**:通过`HttpURLConnection`或Retrofit等方式发送GET/POST请求。 ```java HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("POST"); connection.setRequestProperty("Content-Type", "application/json; charset=utf-8"); String requestBody = "{\"prompt\":\"Your prompt here\",\"max_tokens\":50}"; connection.setDoOutput(true); connection.getOutputStream().write(requestBody.getBytes()); ``` 5. **处理响应**:读取服务器响应解析JSON数据。 ```java InputStream inputStream = connection.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); StringBuilder response = new StringBuilder(); String line = null; while ((line = reader.readLine()) != null) { response.append(line).append("\n"); } // 解析response JSONObject jsonResponse = new JSONObject(response.toString()); ``` 6. **异常处理**:记得处理可能出现的网络错误或API响应状态码。 ```java if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) { // 成功响应 } else { // 处理错误 } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值