Управление несколькими типами возврата в Голанге - PullRequest
1 голос
/ 05 марта 2019

Я немного новичок в 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.

Я хочу захватить head и body ключи в аргументе структуры, которые я даю и отправляю обратно вызывающей функции.Аргумент response в функции request - это другой тип структуры, основанный на вызывающей функции.

Я не могу заставить это работать - я только возвращаю пустую структуру из request функция.Это fmt.PrintF log

 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"`
    }

Update

Итак, я сделал это;вместо

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"`
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...