您的位置:首页 > 娱乐 > 明星 > 软件开发接单平台都有哪些_网页主题设计思路及制作步骤_东莞百度seo哪里强_网站制作流程

软件开发接单平台都有哪些_网页主题设计思路及制作步骤_东莞百度seo哪里强_网站制作流程

2025/3/27 14:52:12 来源:https://blog.csdn.net/LUCIAZZZ/article/details/140860985  浏览:    关键词:软件开发接单平台都有哪些_网页主题设计思路及制作步骤_东莞百度seo哪里强_网站制作流程
软件开发接单平台都有哪些_网页主题设计思路及制作步骤_东莞百度seo哪里强_网站制作流程

如果想有文档开发基础想直接搭建gpt,看完前情提要直接往下来看GPT篇章就行了

如果基础不牢我的建议是,看完xfg的视频+自己跟着文档操作一遍,很快就能弄懂了        

资料+前情提要

参考的视频

【小傅哥】《ChatGPT AI 问答助手》第5节:整合知识星球与ChatGPT,完成自动化回答_哔哩哔哩_bilibili

使用的免费转发GPT

是一个git??项目,里面有快速开始和使用文档

chatanywhere/GPT_API_free: Free ChatGPT API Key,免费ChatGPT API,支持GPT4 API(免费),ChatGPT国内可用免费转发API,直连无需代理。可以搭配ChatBox等软件/插件使用,极大降低接口使用成本。国内即可无限制畅快聊天。 (github.com)

发出请求 - ChatAnywhere API 帮助文档 (apifox.cn)


密钥的申请


请求头

领取到我们的密钥key之后

我们可以使用帮助文档来快速申请

首先我们要在请求头上加东西

Authorization 加我们的密钥

Bearer xxxxx(这个是我们的密钥,必须是Bearer加一个空格开头,空格后面加我们的申请的密钥)

Content-Type 我们直接写application/json就行了,指定我们的格式


JSON转换网站

JSON在线 | JSON解析格式化—SO JSON在线工具

可以在线帮我们转换

而且冗杂的JSON格式直接给我们可视化成清晰可见的格式

而且还能帮我们生成Java实体类让我们能够成功使用


用到的依赖

 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>com.alibaba.fastjson2</groupId><artifactId>fastjson2</artifactId><version>2.0.51</version></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.14.0</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version><scope>test</scope></dependency><!-- https://mvnrepository.com/artifact/io.github.bonigarcia/webdrivermanager --><dependency><groupId>io.github.bonigarcia</groupId><artifactId>webdrivermanager</artifactId><version>5.0.3</version></dependency><!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java --><dependency><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-java</artifactId><version>3.141.59</version></dependency><!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-api --><dependency><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-api</artifactId><version>3.141.59</version></dependency><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.14</version></dependency><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpmime</artifactId><version>4.5.10</version></dependency><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.27</version></dependency></dependencies>

(基础)模拟使用请求获取知识星球的评论的消息和进行评论

发起请求得到我们的评论的内容

这是我跟着xfg的教程来模拟的

但是xfg的教程是我们自己创建一个知识星球来自己提问,教我们怎么拿到类型然后使用

所以,这个东西的使用是一个道理,我直接使用我们的评论区来代替


用控制台拿到我们的网络的详细信息

这个是我们的评论的请求的URL

这个是我们的Coookie

这个是我们的Content-Type

我们在测试类写这样的代码

把对应的参数的值弄进去

解释一下下面的逻辑

我们跟着上面来发起请求,请求会得到一个CloseableHttpResponse对象

然后打印我们的得到的JSON字符串

 @Testvoid query() throws IOException {CloseableHttpClient httpclient = HttpClientBuilder.create().build();HttpGet get = new HttpGet("https://api.zsxq.com/v2/topics/8855151145211512/comments?sort=asc&count=30&with_sticky=tru");get.addHeader("cookie", "zsxq_access_token=D8F2CE33-78AD-388F-9E35-3E70AAC9FFA8_BA82B67DD0480B20; zsxqsessionid=38f3e5defa68fa7ba92f64ace1a5f820; sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%22582528585455854%22%2C%22first_id%22%3A%2219024f51d845d1-0daef36da24f15-26001c51-1327104-19024f51d861262%22%2C%22props%22%3A%7B%22%24latest_traffic_source_type%22%3A%22%E7%9B%B4%E6%8E%A5%E6%B5%81%E9%87%8F%22%2C%22%24latest_search_keyword%22%3A%22%E6%9C%AA%E5%8F%96%E5%88%B0%E5%80%BC_%E7%9B%B4%E6%8E%A5%E6%89%93%E5%BC%80%22%2C%22%24latest_referrer%22%3A%22%22%7D%2C%22identities%22%3A%22eyIkaWRlbnRpdHlfY29va2llX2lkIjoiMTkwMjRmNTFkODQ1ZDEtMGRhZWYzNmRhMjRmMTUtMjYwMDFjNTEtMTMyNzEwNC0xOTAyNGY1MWQ4NjEyNjIiLCIkaWRlbnRpdHlfbG9naW5faWQiOiI1ODI1Mjg1ODU0NTU4NTQifQ%3D%3D%22%2C%22history_login_id%22%3A%7B%22name%22%3A%22%24identity_login_id%22%2C%22value%22%3A%22582528585455854%22%7D%2C%22%24device_id%22%3A%2219024f51d845d1-0daef36da24f15-26001c51-1327104-19024f51d861262%22%7D; abtest_env=beta");get.addHeader("Content-Type", "application/json;charset=utf-8");CloseableHttpResponse response = httpclient.execute(get);if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {String res = EntityUtils.toString(response.getEntity());System.out.println(res);} else {System.out.println(response.getStatusLine().getStatusCode());}

然后我们的控制台成功输出了

这样子观看很不美观,所以我们找到我们的JSON转换网站进行格式化,这样观感就好很多了


用Java代码去进行评论

我们还是和之前一样,去发起评论然后看看网络的变化

payload载荷可以得到我们返回数据的详细信息

然后复制出来,得到我们的返回格式是这样子的

开始模拟发起评论

主要的不同在于

我们把那个JSON格式复制过来

然后修改了里面的text的内容,修改成了 玩原神是这样子的

这个就是我们的评论

然后我们整理一下我们的post请求里面的内容,然后执行

执行,我们成功了说明评论成功

而且我们得到的网络内容,和我们在浏览器控制台得到的是一样的

打开知识星球的评论,发现我们已经评论成功了

这个是我们的测试类的代码

@Testvoid answer() throws IOException {CloseableHttpClient httpclient = HttpClientBuilder.create().build();HttpPost post=new HttpPost("https://api.zsxq.com/v2/topics/8855151145211512/comments?sort=asc&count=30&with_sticky=true");post.addHeader("cookie", "zsxq_access_token=D8F2CE33-78AD-388F-9E35-3E70AAC9FFA8_BA82B67DD0480B20; zsxqsessionid=38f3e5defa68fa7ba92f64ace1a5f820; sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%22582528585455854%22%2C%22first_id%22%3A%2219024f51d845d1-0daef36da24f15-26001c51-1327104-19024f51d861262%22%2C%22props%22%3A%7B%22%24latest_traffic_source_type%22%3A%22%E7%9B%B4%E6%8E%A5%E6%B5%81%E9%87%8F%22%2C%22%24latest_search_keyword%22%3A%22%E6%9C%AA%E5%8F%96%E5%88%B0%E5%80%BC_%E7%9B%B4%E6%8E%A5%E6%89%93%E5%BC%80%22%2C%22%24latest_referrer%22%3A%22%22%7D%2C%22identities%22%3A%22eyIkaWRlbnRpdHlfY29va2llX2lkIjoiMTkwMjRmNTFkODQ1ZDEtMGRhZWYzNmRhMjRmMTUtMjYwMDFjNTEtMTMyNzEwNC0xOTAyNGY1MWQ4NjEyNjIiLCIkaWRlbnRpdHlfbG9naW5faWQiOiI1ODI1Mjg1ODU0NTU4NTQifQ%3D%3D%22%2C%22history_login_id%22%3A%7B%22name%22%3A%22%24identity_login_id%22%2C%22value%22%3A%22582528585455854%22%7D%2C%22%24device_id%22%3A%2219024f51d845d1-0daef36da24f15-26001c51-1327104-19024f51d861262%22%7D; abtest_env=beta");post.addHeader("Content-Type", "application/json;charset=UTF-8");String paramJson="{\n" +"    \"req_data\": {\n" +"        \"text\": \"玩原神是这样子的\\n\",\n" +"        \"image_ids\": [],\n" +"        \"mentioned_user_ids\": []\n" +"    }\n" +"}";StringEntity stringEntity = new StringEntity(paramJson,ContentType.create("text/json", "UTF-8"));post.setEntity(stringEntity);CloseableHttpResponse response = httpclient.execute(post);if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {String res = EntityUtils.toString(response.getEntity());System.out.println(res);} else {System.out.println(response.getStatusLine().getStatusCode());}
}

(进阶)封装好实体类+Java代码方法发起请求

重点

payload里的内容,是我们发起请求时的类型

Preview里面是我们的返回值的类型


实体类(得到评论区消息)

点开我们的评论区的详细页面

复制到JSON在线解析,我们来看

发现我们的返回体有两个字段

一个是succeded

一个是resp_data

然后里面还有很多东西

我们让它来生成实体类,然后把这个实体类都弄到我们的Java代码里面去

这个是我们的返回类型,其他都是小类型

JsonProperties的使用

让我们和JSON字段的名字一一对应,有时候不完全一样的话我们对应不上导致赋值为null

package com.example.chataidoamin.model;import com.example.chataidoamin.Resp.Resp_data;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;@Data
public class Aggregates {private boolean succeeded;@JsonProperty("resp_data")private Resp_data respData;public boolean isSucceeded() {return succeeded;}public void setSucceeded(boolean succeeded) {this.succeeded = succeeded;}public Resp_data getRespData() {return respData;}public void setRespData(Resp_data respData) {this.respData = respData;}
}

JsonFormat的使用

如果日期类型和返回的类型不对应,我们也会赋值失败

package com.example.chataidoamin.POJO;import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;@Data
public class Comment
{@JsonProperty("comment_id")private long comment_id;@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX")private String create_time;private Owner owner;private String text;private int likes_count;private int rewards_count;private boolean sticky;}

package com.example.chataidoamin.POJO;import lombok.Data;import java.math.BigDecimal;@Data
public class Owner
{private BigDecimal user_id;private String name;private String avatar_url;private String location;}

package com.example.chataidoamin.Req;import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;import java.util.List;@Data
public class Req_data {@JsonProperty("text")private String text;@JsonProperty("image_ids")private List<String> image_ids;public Req_data(String text, List<String> image_ids, List<String> mentioned_user_ids) {this.text = text;this.image_ids = image_ids;this.mentioned_user_ids = mentioned_user_ids;}@JsonProperty("mentioned_user_ids")private List<String> mentioned_user_ids;}

以上就是弄好了我们的实体类

业务代码

写一个接口

我们先写我们的query()方法,也就是我们先写发起请求

我们弄个实现类来写,然后结合之前测试类的东西来进行修改

例如我们的get请求我们的topics后面的数字我们换成一个形参

然后我们的Cookie也弄成一个形参

这样子就简洁了很多

主要是这个Java类型的转换

要是实体类没写好会导致里面有一些转换内容为null的

Value注解的使用

我们把全局参数弄到配置文件里面

然后在测试类里面注入

开始测试

然后我们可以拿到我们的评论List<Comment>

也就是这些

这样子我们就能成功拿到我们的评论消息了


实体类(发起评论)

这个是我们发起评论的时候的参数类型

之前我们的rep_data

现在我们的返回类型是resp_data

我们和之前一样来生成实体,然后步骤是一样的

就只加多了一个东西

也就是我们的请求头里的user-agent

说明这个请求是浏览器后去的

开始测试

评论成功了


测试类代码

package com.example.chataidoamin;
import com.alibaba.fastjson2.JSON;
import com.example.chataidoamin.POJO.Comment;
import com.example.chataidoamin.model.Aggregates;
import org.apache.http.HttpStatus;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils;
import org.junit.jupiter.api.Test;
import com.example.chataidoamin.Service.zsxqApi;
import jakarta.annotation.Resource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;import java.io.IOException;
import java.util.List;
import java.util.UUID;@SpringBootTest
public class Test1 {@Value("${chatai-api.topicsid}")private String topics_id;@Value("${chatai-api.cookie}")private String cookie;@ResourcezsxqApi api;@Testvoid aa(){System.out.println(topics_id);System.out.println(cookie);}//使用我们的封装起来的函数@Testvoid test() throws IOException {//拿到我们的评论的信息Aggregates query = api.query(topics_id, cookie);System.out.println(query);List<Comment> comments = query.getRespData().getComments();for(Comment cm:comments){long commentId = cm.getComment_id();String text = cm.getText();System.out.println(text+commentId);}
//回答问题评论api.answer(topics_id, cookie, "这个是我们的自动回答,我们随机回答的ID是:" + UUID.randomUUID().toString());}@Testvoid answer() throws IOException {CloseableHttpClient httpclient = HttpClientBuilder.create().build();HttpPost post=new HttpPost("https://api.zsxq.com/v2/topics/8855151145211512/comments?sort=asc&count=30&with_sticky=true");post.addHeader("cookie", "zsxq_access_token=D8F2CE33-78AD-388F-9E35-3E70AAC9FFA8_BA82B67DD0480B20; zsxqsessionid=38f3e5defa68fa7ba92f64ace1a5f820; sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%22582528585455854%22%2C%22first_id%22%3A%2219024f51d845d1-0daef36da24f15-26001c51-1327104-19024f51d861262%22%2C%22props%22%3A%7B%22%24latest_traffic_source_type%22%3A%22%E7%9B%B4%E6%8E%A5%E6%B5%81%E9%87%8F%22%2C%22%24latest_search_keyword%22%3A%22%E6%9C%AA%E5%8F%96%E5%88%B0%E5%80%BC_%E7%9B%B4%E6%8E%A5%E6%89%93%E5%BC%80%22%2C%22%24latest_referrer%22%3A%22%22%7D%2C%22identities%22%3A%22eyIkaWRlbnRpdHlfY29va2llX2lkIjoiMTkwMjRmNTFkODQ1ZDEtMGRhZWYzNmRhMjRmMTUtMjYwMDFjNTEtMTMyNzEwNC0xOTAyNGY1MWQ4NjEyNjIiLCIkaWRlbnRpdHlfbG9naW5faWQiOiI1ODI1Mjg1ODU0NTU4NTQifQ%3D%3D%22%2C%22history_login_id%22%3A%7B%22name%22%3A%22%24identity_login_id%22%2C%22value%22%3A%22582528585455854%22%7D%2C%22%24device_id%22%3A%2219024f51d845d1-0daef36da24f15-26001c51-1327104-19024f51d861262%22%7D; abtest_env=beta");post.addHeader("Content-Type", "application/json;charset=UTF-8");String paramJson="{\n" +"    \"req_data\": {\n" +"        \"text\": \"玩原神是这样子的\\n\",\n" +"        \"image_ids\": [],\n" +"        \"mentioned_user_ids\": []\n" +"    }\n" +"}";StringEntity stringEntity = new StringEntity(paramJson,ContentType.create("text/json", "UTF-8"));post.setEntity(stringEntity);CloseableHttpResponse response = httpclient.execute(post);if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {String res = EntityUtils.toString(response.getEntity());System.out.println(res);} else {System.out.println(response.getStatusLine().getStatusCode());}}@Testvoid query() throws IOException {CloseableHttpClient httpclient = HttpClientBuilder.create().build();HttpGet get = new HttpGet("https://api.zsxq.com/v2/topics/8855151145211512/comments?sort=asc&count=30&with_sticky=tru");get.addHeader("cookie", "zsxq_access_token=D8F2CE33-78AD-388F-9E35-3E70AAC9FFA8_BA82B67DD0480B20; zsxqsessionid=38f3e5defa68fa7ba92f64ace1a5f820; sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%22582528585455854%22%2C%22first_id%22%3A%2219024f51d845d1-0daef36da24f15-26001c51-1327104-19024f51d861262%22%2C%22props%22%3A%7B%22%24latest_traffic_source_type%22%3A%22%E7%9B%B4%E6%8E%A5%E6%B5%81%E9%87%8F%22%2C%22%24latest_search_keyword%22%3A%22%E6%9C%AA%E5%8F%96%E5%88%B0%E5%80%BC_%E7%9B%B4%E6%8E%A5%E6%89%93%E5%BC%80%22%2C%22%24latest_referrer%22%3A%22%22%7D%2C%22identities%22%3A%22eyIkaWRlbnRpdHlfY29va2llX2lkIjoiMTkwMjRmNTFkODQ1ZDEtMGRhZWYzNmRhMjRmMTUtMjYwMDFjNTEtMTMyNzEwNC0xOTAyNGY1MWQ4NjEyNjIiLCIkaWRlbnRpdHlfbG9naW5faWQiOiI1ODI1Mjg1ODU0NTU4NTQifQ%3D%3D%22%2C%22history_login_id%22%3A%7B%22name%22%3A%22%24identity_login_id%22%2C%22value%22%3A%22582528585455854%22%7D%2C%22%24device_id%22%3A%2219024f51d845d1-0daef36da24f15-26001c51-1327104-19024f51d861262%22%7D; abtest_env=beta");get.addHeader("Content-Type", "application/json;charset=utf-8");CloseableHttpResponse response = httpclient.execute(get);System.out.println(response);if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {String res = EntityUtils.toString(response.getEntity());System.out.println(res);Aggregates aggregates = JSON.parseObject(res, Aggregates.class);System.out.println(JSON.parseObject(res,Aggregates.class));System.out.println(aggregates);} else {System.out.println(response.getStatusLine().getStatusCode());}}@Testvoid query1() throws IOException {CloseableHttpClient httpclient = HttpClientBuilder.create().build();HttpGet get = new HttpGet("https://api.zsxq.com/v2/topics/8855151145211512/comments?sort=asc&count=30&with_sticky=tru");get.addHeader("cookie", "zsxq_access_token=D8F2CE33-78AD-388F-9E35-3E70AAC9FFA8_BA82B67DD0480B20; zsxqsessionid=38f3e5defa68fa7ba92f64ace1a5f820; sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%22582528585455854%22%2C%22first_id%22%3A%2219024f51d845d1-0daef36da24f15-26001c51-1327104-19024f51d861262%22%2C%22props%22%3A%7B%22%24latest_traffic_source_type%22%3A%22%E7%9B%B4%E6%8E%A5%E6%B5%81%E9%87%8F%22%2C%22%24latest_search_keyword%22%3A%22%E6%9C%AA%E5%8F%96%E5%88%B0%E5%80%BC_%E7%9B%B4%E6%8E%A5%E6%89%93%E5%BC%80%22%2C%22%24latest_referrer%22%3A%22%22%7D%2C%22identities%22%3A%22eyIkaWRlbnRpdHlfY29va2llX2lkIjoiMTkwMjRmNTFkODQ1ZDEtMGRhZWYzNmRhMjRmMTUtMjYwMDFjNTEtMTMyNzEwNC0xOTAyNGY1MWQ4NjEyNjIiLCIkaWRlbnRpdHlfbG9naW5faWQiOiI1ODI1Mjg1ODU0NTU4NTQifQ%3D%3D%22%2C%22history_login_id%22%3A%7B%22name%22%3A%22%24identity_login_id%22%2C%22value%22%3A%22582528585455854%22%7D%2C%22%24device_id%22%3A%2219024f51d845d1-0daef36da24f15-26001c51-1327104-19024f51d861262%22%7D; abtest_env=beta");get.addHeader("Content-Type", "application/json;charset=utf-8");CloseableHttpResponse response = httpclient.execute(get);if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {String res = EntityUtils.toString(response.getEntity());System.out.println(res); // 打印返回的 JSON 数据// 转换 JSON 数据到 Aggregates 类Aggregates aggregates = JSON.parseObject(res, Aggregates.class);System.out.println(aggregates);} else {System.out.println(response.getStatusLine().getStatusCode());}}}

GPT

测试密钥

发出请求 - ChatAnywhere API 帮助文档 (apifox.cn)

弄到key之后直接根据帮助文档来使用

复制我这个就行了,那个是shell命令的,在window命令行里面会换行

里面的Authorization参数换成自己的密钥

curl https://api.chatanywhere.tech/v1/chat/completions -H "Content-Type: application/json" -H "Authorization: Bearer xxxx(换成自己的密钥)" -d "{\"model\":\"gpt-3.5-turbo\",\"messages\":[{\"role\":\"user\",\"content\":\"写一个冒泡排序\"}],\"temperature\":0.7}"

如果还是错误那么就复制官网的然后让ai帮你写

我命令行执行成功了,那么说明就没错


然后自己用ApiFox执行一下

根据我的资料+前情提要里面配置一下请求头和密钥

可以的话那么密钥就没问题,正式进行java代码的编写了


参数类型

这个是我们的发起请求的类型

这个是我们的得到返回值的类型


执行思路

所以步骤和之前一样

我现在只弄了聊天窗口接口,右边有示例类型,反正可以跟着来


然后思路和之前一样,都是把那种参数弄成实体类,主要是返回参数,不然我们无法拿到数据

你看我gpt包下面那些都是我们的实体类

写接口和实现类

接口

实现类

其实观察你会发现

我们发起请求的类型及其简单,我们是

model 指定要问的gpt类型

role 判断是用户的提问还是ai的回答

content是文本内容

但是我自己弄了一下,失败了,然后观察了一下之前curl的代码

发现给我们的api示例文档漏了一个temperature参数

所以我们在Java实体类加上就行了,可能不加也行?你自己去试试吧,反正我能跑起来就行了

实现类代码

package com.example.chataidoamin.Service.ServiceImpl;import com.alibaba.fastjson2.JSON;
import com.example.chataidoamin.Service.IOpenAI;
import com.example.chataidoamin.gpt.AIAnswer;
import com.example.chataidoamin.gpt.Choices;
import org.apache.http.HttpStatus;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;import java.io.IOException;
import java.util.List;@Service
public class OpenAIImpl implements IOpenAI {@Value("${chatai-api.openAiKey}")String openAiKey;//question参数是我们的提问的问题@Overridepublic String doChatGPT(String question) throws IOException {CloseableHttpClient httpClient = HttpClientBuilder.create().build();//我们发起请求的网址HttpPost post=new HttpPost("https://api.chatanywhere.tech/v1/chat/completions");//我们的密钥post.addHeader("Authorization",openAiKey);//我们的响应类型post.addHeader("Content-Type","application/json");//我们的提问的问题变成提问gpt的JSON格式String parseJson="{\n" +"  \"model\": \"gpt-3.5-turbo\",\n" +"  \"messages\": [\n" +"    {\n" +"      \"role\": \"user\",\n" +"      \"content\": \""+question+"\"\n" +"    }\n" +"  ],\n" +"  \"temperature\": 0.7\n" +"}";StringEntity stringEntity=new StringEntity(parseJson, ContentType.create("application/json","utf-8"));post.setEntity(stringEntity);CloseableHttpResponse response = httpClient.execute(post);if(response.getStatusLine().getStatusCode()== HttpStatus.SC_OK){//得到我们的响应的JSONString res = EntityUtils.toString(response.getEntity());//这个是我们的返回类型的实体类AIAnswer aiAnswer = JSON.parseObject(res, AIAnswer.class);StringBuilder answers=new StringBuilder();List<Choices> choices = aiAnswer.getChoices();for(Choices cs:choices){//拼接我们的文章的内容answers.append(cs.getMessage().getContent());}//返回我们的回答内容
return answers.toString();}else{System.out.println(response.getStatusLine().getStatusCode());//抛出异常,我们的异常状态码throw new RuntimeException("Error Code is "+response.getStatusLine().getStatusCode());}}
}

接口形式

ok,搞定,发现能成功执行


版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com