用golang实现浏览器请求apichatgpt后获取传递的问题和秘钥后请求chatgptapi进行提问并返回内容
以下是一个可能的实现方式:
package main
import (
"bytes"
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
)
type ChatRequest struct {
Secret string `json:"secret"`
Question string `json:"question"`
}
type ChatResponse struct {
Answer string `json:"answer"`
}
func main() {
http.HandleFunc("/api/chatgpt", handleChatRequest)
http.ListenAndServe(":8080", nil)
}
func handleChatRequest(w http.ResponseWriter, r *http.Request) {
body, err := ioutil.ReadAll(r.Body)
if err != nil {
http.Error(w, "Failed to read request body", http.StatusBadRequest)
return
}
var chatRequest ChatRequest
err = json.Unmarshal(body, &chatRequest)
if err != nil {
http.Error(w, "Failed to parse JSON request", http.StatusBadRequest)
return
}
chatResponse, err := getChatResponse(chatRequest.Secret, chatRequest.Question)
if err != nil {
http.Error(w, "Failed to get chat response", http.StatusInternalServerError)
return
}
responseBody, err := json.Marshal(chatResponse)
if err != nil {
http.Error(w, "Failed to serialize JSON response", http.StatusInternalServerError)
return
}
w.Header().Add("Content-Type", "application/json")
w.Write(responseBody)
}
func getChatResponse(secret string, question string) (*ChatResponse, error) {
client := http.Client{}
requestBody, err := json.Marshal(map[string]string{
"secret": secret,
"question": question,
})
if err != nil {
return nil, fmt.Errorf("Failed to serialize request body: %v", err)
}
request, err := http.NewRequest("POST", "https://chatgptapi.com/api/chat", bytes.NewBuffer(requestBody))
if err != nil {
return nil, fmt.Errorf("Failed to create HTTP request: %v", err)
}
request.Header.Add("Content-Type", "application/json")
response, err := client.Do(request)
if err != nil {
return nil, fmt.Errorf("Failed to perform HTTP request: %v", err)
}
defer response.Body.Close()
if response.StatusCode != http.StatusOK {
return nil, fmt.Errorf("Received non-200 HTTP status code: %d", response.StatusCode)
}
responseBody, err := ioutil.ReadAll(response.Body)
if err != nil {
return nil, fmt.Errorf("Failed to read response body: %v", err)
}
var chatResponse ChatResponse
err = json.Unmarshal(responseBody, &chatResponse)
if err != nil {
return nil, fmt.Errorf("Failed to parse JSON response: %v", err)
}
return &chatResponse, nil
}
此代码可以监听/api/chatgpt的HTTP POST请求,并解析JSON请求体。然后,它将秘钥和问题作为请求主体发送到chatgptapi,并解析返回的JSON响应。最后,它将答案作为JSON响应主体发送回原始请求。请注意,此示例忽略了任何错误处理,例如无效的JSON格式或无法连接到chatgptapi。您需要根据实际情况进行修改。
原文地址: https://www.cveoy.top/t/topic/CwF 著作权归作者所有。请勿转载和采集!