java利用jdk11和jdk15新特性零依赖优雅调用GPT-4o,附golang实现对比

这里是小奏 ,觉得文章不错可以关注公众号小奏技术

背景

目前GPT-4o官方不支持所有使用,所以各路大神各显神通

因为只对前端进行了限制。

所以有利用油猴脚本跳过

有自己调用接口的

如果要使用java来实现http调用,放在低版本的jdk

实现起来非常麻烦,主要有几点

  1. 原生的http api非常难用
  2. 不支持模板字符串,所以写json会非常丑陋

所以java 0依赖如何优雅实现GPT-4o的调用呢?还是挺有意思的

jdk17来帮忙

本次我们使用的jdk版本是17

主要用到的特性有两个

  1. jdk15的模板字符串
  2. jdk11的新HttpClient api

话不多说,直接看代码

整体来看是不是很简单优雅

源码如下

java 复制代码
public static void main(String[] args) {
        String openaiApiKey = System.getenv("OPENAI_API_KEY");
        //文本块 需要jdk15+才支持
        String body = """
            {
                "model": "gpt-4o",
                "messages":
                 [
                    {
                        "role": "user",
                        "content": "hello world"
                    }
                ]
            }
            """;
        // jdk11+
        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("https://api.openai.com/v1/chat/completions"))
            .header("Content-Type", "application/json")
            .header("Authorization", "Bearer " + openaiApiKey)
            .POST(HttpRequest.BodyPublishers.ofString(body)).build();

        HttpClient client = HttpClient.newHttpClient();
        try {
            HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
            System.out.println(response.body());
        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }
    }

goalng实现

golang 复制代码
func main() {
	openaiApiKey := os.Getenv("OPENAI_API_KEY")

	body := map[string]interface{}{
		"model": "gpt-4o",
		"messages": []map[string]string{
			{
				"role":    "user",
				"content": "hello world",
			},
		},
	}

	bodyBytes, err := json.Marshal(body)
	if err != nil {
		fmt.Println("Error marshalling JSON:", err)
		return
	}

	req, err := http.NewRequest("POST", "https://api.openai.com/v1/chat/completions", bytes.NewBuffer(bodyBytes))
	if err != nil {
		fmt.Println("Error creating request:", err)
		return
	}

	req.Header.Set("Content-Type", "application/json")
	req.Header.Set("Authorization", "Bearer "+openaiApiKey)

	client := &http.Client{}
	resp, err := client.Do(req)
	if err != nil {
		fmt.Println("Error sending request:", err)
		return
	}
	defer func(Body io.ReadCloser) {
		err := Body.Close()
		if err != nil {

		}
	}(resp.Body)

	respBody, err := io.ReadAll(resp.Body)
	if err != nil {
		fmt.Println("Error reading response body:", err)
		return
	}
	fmt.Println(string(respBody))
}

这么看java也挺优雅的哈哈,golang我比较菜,不确定是否有更优雅的实现哈哈

相关推荐
爱上语文7 分钟前
Springboot的三层架构
java·开发语言·spring boot·后端·spring
serve the people11 分钟前
springboot 单独新建一个文件实时写数据,当文件大于100M时按照日期时间做文件名进行归档
java·spring boot·后端
罗政6 小时前
[附源码]超简洁个人博客网站搭建+SpringBoot+Vue前后端分离
vue.js·spring boot·后端
拾光师7 小时前
spring获取当前request
java·后端·spring
营赢盈英8 小时前
Allow anonymous access to my Azure OpenAI chat bot
ai·openai·azure·webapps
Java小白笔记9 小时前
关于使用Mybatis-Plus 自动填充功能失效问题
spring boot·后端·mybatis
JOJO___10 小时前
Spring IoC 配置类 总结
java·后端·spring·java-ee
白总Server11 小时前
MySQL在大数据场景应用
大数据·开发语言·数据库·后端·mysql·golang·php
Lingbug12 小时前
.Net日志组件之NLog的使用和配置
后端·c#·.net·.netcore
计算机学姐12 小时前
基于SpringBoot+Vue的篮球馆会员信息管理系统
java·vue.js·spring boot·后端·mysql·spring·mybatis