在Golang中管理多种返回类型

时间:2019-03-05 16:51:07

标签: go

我对Go有点陌生,我无法根据请求类型将响应对象从API调用转换为不同的结构

从本质上讲,我有一个功能可以发出请求

func (fpc *FPClient) request(path string, method string, params interface{}, Token string, response interface{}) *dto.AppError {
    client := &http.Client{
        Timeout: time.Second * 15,
    }
    requestBody, err := json.Marshal(params)
    if err != nil {
         //
    }

    req, _ := http.NewRequest(method, path, bytes.NewBuffer(requestBody))
    req.Header.Set("Content-Type", "application/json")
    req.Header.Set("Cookie", fmt.Sprintf("cookie=%s;", Token))
    req.SetBasicAuth(fpc.username, fpc.password)
    resp, err := client.Do(req)

    if err != nil {
        // 
    }
    body, err := ioutil.ReadAll(resp.Body)

    if err != nil {
       //
    }
    if FPErr := fpc.processErrors(resp, body); FPerr != nil {
        return FPErr
    }

    responseData := FPApiSuccess{Head: response, Body: response}
    if err := json.Unmarshal(body, &responseData); err != nil {
       //
    }
    fmt.Printf("\n\n client Response : \n %+v \n", responseData.Body)
    return nil
}

FPApiSuccess的结构为:

type FPApiSuccess struct {
    Body interface{} `json:"body"`
    Head interface{} `json:"head"`
}

现在,有2个调用函数,并且两者的API响应都有些不同

两个API响应均具有以下结构

{
    "head": {},
    "body": {}
}

但是,每个密钥中的嵌套详细信息根据所使用的API而有所不同。

我想捕获我提供的struct参数中的headbody键,并将其发送回调用函数。 response函数中的request参数是基于调用函数的不同结构类型。

我无法使它正常工作-我只能从request函数中获取空白结构。这是fmt.PrintF日志

 client Response : 
 &{Body:{BOrderID:0 CC: Exch: EOID: Type: Local:0 Message: } Head:{ResponseCode: Status: StatusDescription:}} 

这是一个空结构-理想情况下,应使用从API检索的值填充它。

作为参考,以下是在请求函数中作为参数response传递的结构:

   type FPApiResponse struct {
        Body FPBodyResponse `json:"body"`
        Head FPHeadResponse `json:"head"`
    }

    type FPHeadResponse struct {
        ResponseCode      string `json:"responseCode"`
        Status            string `json:"status"`
        StatusDescription string `json:"statusDescription"`
    }

    type FPBodyResponse struct {
        BOrderID   int    `json:"BOrderID"`
        CC      string `json:"CC"`
        Exch            string `json:"Exch"`
        EOID     string `json:"EOID"`
        Type        string `json:"Type"`
        Local    int    `json:"Local"`
        Message         string `json:"Message"`
    }

更新

所以我做到了;代替

responseData := FPApiSuccess{Head: response, Body: response}

我做到了

responseData := fivePaisaApiSuccess{}

现在,我在控制台中看到以下内容

 Client Response : 
 {Body:map[BOrderID:0 CC:52715111 Type:D Local:0 Message:Invalid Session ] Head:map[responseCode:5POrdReq status:0 statusDescription:Success]} 

因此,从本质上讲,这是可行的,但是调用函数似乎无法获得正确的响应:

这是调用函数

func (fpc *FPClient) PlaceOrder(orderParams dto.OrderBodyParams, variety string, Token string) (string, *dto.AppError) {
    var result FPApiResponse

    headParams := dto.FFPOrderHeadParams{
      //
    }
    FPOrderParams := dto.FPOrderParams{
       //
    }
    FPErr := fpc.request(FPURL+FPPlaceOrder, http.MethodPost, FPOrderParams, brokerAccessToken, &result)
    if FPErr != nil {
        return "", FPErr
    }
    fmt.Printf("\n\n Client result : \n %+v \n", result)
    if result.Head.Status != "0" {
       //
    }

    if result.Body.Status != 0 {
      //
    }
    return strconv.Itoa(result.Body.Broker), nil
}

result值为空白:

 {Body:{BOId:0 CC: Exch: Type: Local:0 Message: Status:0} Head:{ResponseCode: Status: StatusDescription:}}

我不明白,该指针已填充到请求函数中

这是我传递给请求的结构:

type FPApiResponse struct {
    Body FPBodyResponse `json:"body"`
    Head FPHeadResponse `json:"head"`
}

0 个答案:

没有答案