123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 |
- package http
- import (
- "bytes"
- "context"
- "encoding/json"
- "encoding/xml"
- "errors"
- "eta_mini_ht_api/common/utils/client"
- "github.com/medivhzhan/weapp/v3/logger"
- "net/http"
- )
- // ContentType 请求内容类型
- type ContentType uint
- const (
- ContentTypePlain ContentType = iota
- ContentTypeXML
- ContentTypeJSON
- )
- func (ctp ContentType) String() string {
- switch ctp {
- case ContentTypeXML:
- return "service/xml"
- case ContentTypeJSON:
- return "service/json"
- default:
- return "text/plain"
- }
- }
- type Request struct {
- http *client.HttpClient
- // 获取日志记录器
- logger func() logger.Logger
- contentType ContentType
- }
- func NewRequest(http *client.HttpClient, ctp ContentType, logger func() logger.Logger) *Request {
- return &Request{
- http: http,
- logger: logger,
- contentType: ctp,
- }
- }
- func (cli *Request) Get(url string, response interface{}) error {
- cli.logger().Info(context.Background(), "request url: %s", url)
- resp, err := cli.http.Get(url)
- if err != nil {
- cli.logger().Error(context.Background(), "get error: %s", err)
- return err
- }
- defer resp.Body.Close()
- switch cli.contentType {
- case ContentTypeXML:
- return xml.NewDecoder(resp.Body).Decode(response)
- case ContentTypeJSON:
- return json.NewDecoder(resp.Body).Decode(response)
- default:
- return errors.New("invalid content type")
- }
- }
- func (cli *Request) GetWithBody(url string) (*http.Response, error) {
- cli.logger().Info(context.Background(), "request url: %s", url)
- rsp, err := cli.http.Get(url)
- if err != nil {
- cli.logger().Error(context.Background(), "get with body error: %s", url)
- return nil, err
- }
- return rsp, nil
- }
- func (cli *Request) Post(url string, params interface{}, response interface{}) error {
- resp, err := cli.PostWithBody(url, params)
- if err != nil {
- cli.logger().Error(context.Background(), "post error: %s", err)
- return err
- }
- defer resp.Body.Close()
- switch cli.contentType {
- case ContentTypeXML:
- return xml.NewDecoder(resp.Body).Decode(response)
- case ContentTypeJSON:
- return json.NewDecoder(resp.Body).Decode(response)
- default:
- return errors.New("invalid content type")
- }
- }
- func (cli *Request) PostWithBody(url string, params interface{}) (*http.Response, error) {
- cli.logger().Info(context.Background(), "request url: %s", url)
- cli.logger().Info(context.Background(), "request params: %+v", params)
- buf := new(bytes.Buffer)
- if params != nil {
- switch cli.contentType {
- case ContentTypeXML:
- err := xml.NewEncoder(buf).Encode(params)
- if err != nil {
- return nil, err
- }
- case ContentTypeJSON:
- enc := json.NewEncoder(buf)
- enc.SetEscapeHTML(false)
- err := enc.Encode(params)
- if err != nil {
- return nil, err
- }
- default:
- return nil, errors.New("invalid content type")
- }
- }
- rsp, err := cli.http.Post(url, cli.contentType.String(), buf)
- if err != nil {
- cli.logger().Error(context.Background(), "post with body error: %s", url)
- return nil, err
- }
- return rsp, nil
- }
|