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