API запрос и ответ - PullRequest
       31

API запрос и ответ

0 голосов
/ 01 апреля 2019

Я хотел бы выяснить, возможно ли для HTTP-клиента POST отправить конкретный объект JSON и ответ сервера с другим объектом JSON в Go.Например, клиент отправляет объект JSON

тело запроса

{
  "nfNssaiAvailabilityUri": "string",
  "taiList": [
    {
      "plmnId": {
        "mcc": "string",
        "mnc": "string"
      },
      "tac": "string"
    }
  ],
  "expiry": "2019-04-01T10:41:54.344Z"
}

тело ответа в виде

{
  "subscriptionId": "string",
  "expiry": "2019-04-01T10:41:54.363Z",
  "authorizedNssaiAvailabilityData": [
    {
      "tai": {
        "plmnId": {
          "mcc": "string",
          "mnc": "string"
        },
        "tac": "string"
      },
      "supportedSnssaiList": [
        {
          "sst": 0,
          "sd": "string"
        }
      ],
      "restrictedSnssaiList": [
        {
          "homePlmnId": {
            "mcc": "string",
            "mnc": "string"
          },
          "sNssaiList": [
            {
              "sst": 0,
              "sd": "string"
            }
          ]
        }
      ]
    }
  ]
}

Как видите, тело запроса JSON отличается отответ.У меня есть структуры для обоих JSON, и в настоящее время я могу только POST с телом запроса и получить то же тело, что и ответ.Я ожидаю, что смогу получить объект JSON, указанный в ответе выше.

У меня есть:

type NssfEventSubscriptionCreateData struct {
    NfNssaiAvailabilityUri string `json:"nfNssaiAvailabilityUri"`
    TaiList []Tai `json:"taiList,omitempty"`
        ...
}
type NssfEventSubscriptionCreatedData struct {
    SubscriptionId string `json:"subscriptionId"`
    Expiry time.Time `json:"expiry,omitempty"`
        ....
}
func (m *SliceDataAccess) InsertNssaiSubscriptionInfo(subdata NssfEventSubscriptionCreateData) error {
    err := db.C(COLLECTION).Insert(subdata)
    if err != nil {
        return err
    }
    return nil
}
func NSSAIAvailabilityPost(w http.ResponseWriter, r *http.Request) {
    if r.Header.Get("Accept") != "application/json" {
        WriteError(w, ErrNotAcceptable)
        return
    }
    if r.Method == "POST" {

        var reqsubData NssfEventSubscriptionCreateData
        err := json.NewDecoder(r.Body).Decode(&reqsubData)
        if err != nil {
            respondWithError(w, http.StatusBadRequest, "Object body not well decoded")
            return
        }
        //reqsubData.ID = bson.NewObjectId()
        if err := da.InsertNssaiSubscriptionInfo(reqsubData); err != nil {
            respondWithError(w, http.StatusInternalServerError, err.Error())
        } else {
            scheme := "http"
            if r.URL.Scheme != "" {
                scheme = r.URL.Scheme
            }
            w.Header().Set("Location", scheme+"://"+r.Host+r.URL.Path)
            w.Header().Set("Response-Code", "201")
            w.Header().Set("Response-Desc", "Success")
            respondWithJson(w, http.StatusCreated, reqsubData)
        }

    }
}

Функция NSSAIAvailabilityPost отвечает * JSON-объектом NssfEventSubscriptionCreateData типа структуры, но я бы хотел иметь возможность ответитьс NssfEventSubscriptionCreatedData объектом типа JSON.

1 Ответ

1 голос
/ 01 апреля 2019

Создайте структуру типа NssfEventSubscriptionCreatedData, инициализируйте ее значения и верните в responseWithJSON.

respData : = NssfEventSubscriptionCreatedData{}
// init fields

 respondWithJson(w, http.StatusCreated, respData)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...