从 http 响应中解组动态 JSON

问题描述

我正在编写一个允许用户使用 API 的 cli,它在请求和响应中非常一致,但会随着时间的推移而增长并且需要处理非常复杂的 json。所以我试图构建一个易于扩展的 http 客户端和方法来操作 API 的不同部分。到目前为止,我有以下内容:

{
  "name": "electron-quick-start","version": "1.0.0","description": "A minimal Electron application","main": "main.js","scripts": {
    "start": "electron .","build-installer": "electron-builder"
  },"build": {
    "extraResources": [
      {
        "from": "/","to": "" 
      }
    ],"appId": "electron-quick-start","win": {
      "target": ["nsis"]
    },"nsis": {
      "uninstallDisplayName": "electron-quick-start","oneClick": false,"allowToChangeInstallationDirectory": true
    },"files": [
      "ProxyChecker.py","**/*"
    ]
  },"repository": "https://github.com/electron/electron-quick-start","keywords": [
    "Electron","quick","start","tutorial","demo"
  ],"author": "GitHub","license": "CC0-1.0","devDependencies": {
    "electron": "^11.2.1","electron-packager": "^15.2.0"
  },"dependencies": {
    "python-shell": "^0.4.0"
  },"asar": true,"asarUnpack": [
      "ProxyChecker.py"
    ]
}

然后调用以列出服务

type (
    Doer interface {
        Do(req *http.Request) (*http.Response,error)
    }

    DoerFunc func(req *http.Request) (resp *http.Response,err error)

    Client struct {
        doer      Doer
        BaseURL   *url.URL
        UserAgent string
    }

    Services struct {
        Id   *int64  `json:"id,omitempty"`
        Name *string `json:"name,omitempty"`
        Team *string `json:"team,omitempty"`
    }
    request struct {
        Data interface{}
    }
)

func (c *Client) ListServices(ctx context.Context) ([]Services,error) {
    services := new([]Services)
    err := c.Request(ctx,"services",services)
    return *services,err
}

func NewClient(doer Doer) *Client {
    if doer == nil {
        doer = http.DefaultClient
    }
    baseURL,_ := url.Parse(defaultBaseURL)
    client := &Client{doer: doer,BaseURL: baseURL,UserAgent: conf.UserAgent + conf.GetVersion()}
    return client
}

func (c *Client) Request(ctx context.Context,path string,v interface{}) error {
    return c.request(ctx,"GET",path,nil,v)
}

// The response is populated into v
func (c *Client) request(ctx context.Context,method string,data interface{},v interface{}) error {
    rel,err := url.Parse(path)
    if err != nil {
        return err
    }
    u := c.BaseURL.ResolveReference(rel)
    var body io.Reader
    //TODO
    if data != nil {
        b,err := json.Marshal(request{Data: data})
        if err != nil {
            return err
        }
        body = bytes.NewReader(b)
    }
    req,err := http.NewRequest(method,u.String(),body)
    req.Header.Set("Content-type","application/json")
    req.Header.Set("User-Agent","cli/"+conf.GetVersion())
    if err != nil {
        return err
    }
    resp,err := c.doer.Do(req.WithContext(ctx))
    if err != nil {
        return err
    }
    defer resp.Body.Close()
    res,_ := ioutil.ReadAll(resp.Body)
    err = json.Unmarshal(res,&v)
    return err
}

但我收到:

服务:{0xc0001ba750 0xc000142ac0 }

有人能帮我理解我做错了什么吗?提前致谢!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)