package service import ( "bytes" "city_chips/internal/repository" "city_chips/pkg/helper/rsaEncrypt" "encoding/json" "errors" "fmt" "github.com/spf13/viper" "github.com/tidwall/gjson" "io" "io/ioutil" "net/http" ) type ConferenceService interface { GetToken() (string, error) SendRequest(client HTTPClient, method, url string, body interface{}) ([]byte, error) } func NewConferenceService(service *Service, conferenceRepository repository.ConferenceRepository, conf *viper.Viper) ConferenceService { return &conferenceService{ Service: service, conferenceRepository: conferenceRepository, conf: conf, } } type conferenceService struct { *Service conferenceRepository repository.ConferenceRepository conf *viper.Viper } type HTTPClient interface { Do(req *http.Request) (*http.Response, error) } // SendRequest 发送HTTP请求,并返回响应数据或错误信息。 func (s *conferenceService) SendRequest(client HTTPClient, method, url string, body interface{}) ([]byte, error) { token, err := s.GetToken() if err != nil { return nil, err } token = "Bearer " + token var requestBody io.Reader if body != nil { jsonBytes, err := json.Marshal(body) if err != nil { return nil, err } requestBody = bytes.NewBuffer(jsonBytes) } req, err := http.NewRequest(method, url, requestBody) if err != nil { return nil, err } if method == "POST" { req.Header.Set("Content-Type", "application/json") } else if method == "GET" { req.Header.Set("Content-Type", "application/x-www-form-urlencoded") } if token != "" { req.Header.Set("Authorization", token) } resp, err := client.Do(req) if err != nil { return nil, err } defer resp.Body.Close() responseBody, err := io.ReadAll(resp.Body) if err != nil { return nil, err } if resp.StatusCode >= 400 { return nil, fmt.Errorf("bad status: %s", resp.Status) } return responseBody, nil } func (s *conferenceService) GetToken() (string, error) { baseUrl := s.conf.GetString("conference.baseurl") getPublicKey := baseUrl + s.conf.GetString("conference.getPublicKey") login := baseUrl + s.conf.GetString("conference.login") // 准备登录数据 s.conf.GetString("conference.mobile") loginData := map[string]string{ "mobile": s.conf.GetString("conference.mobile"), "password": s.conf.GetString("conference.password"), } jsonStr, err := json.Marshal(loginData) if err != nil { return "", nil } token, err := rsaEncrypt.GetToken(getPublicKey, jsonStr) // 构造请求参数 data := map[string]string{ "admin": "0", "client_type": "web", "secret": token, } jsonData, _ := json.Marshal(data) // 发送登录请求 resp, err := http.Post(login, "application/json", bytes.NewBuffer(jsonData)) if err != nil { return "", err } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) if err != nil { return "", err } if gjson.Get(string(body), "code").Int() == 0 { s := gjson.Get(string(body), "data.token").String() return s, nil } return "", errors.New("获取token失败") }