123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122 |
- 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
- }
- // 设置请求头
- req.Header.Set("Content-Type", "application/json")
- 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失败")
- }
|