以下是一个可能的实现方式:

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。您需要根据实际情况进行修改。

用golang实现浏览器请求apichatgpt后获取传递的问题和秘钥后请求chatgptapi进行提问并返回内容

原文地址: https://www.cveoy.top/t/topic/CwF 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录