Отправить запрос в API Golang для отправки JSON и строкового JSON

При выполнении запроса POST к Golang API, если я отправляю строковые данные JSON, он возвращает успех, но когда я отправляю данные JSON, он возвращает ошибку с status 403.

Пожалуйста, помогите мне понять это поведение и как я могу отправить JSON данные, используя метод запроса POST.

Файл: main.go

package main

import (
    "devmgmtv2/auth"
    "github.com/gorilla/handlers"
    "github.com/gorilla/mux"
    "log"
    "net/http"
)

func main() {
    router := mux.NewRouter()
    auth.AuthInit(router)
    ssid.SsidInit(router)
    headersOk := handlers.AllowedHeaders([]string{"X-Requested-With"})
    originsOk := handlers.AllowedOrigins([]string{"*"})
    methodsOk := handlers.AllowedMethods([]string{"GET", "HEAD", "POST", "PUT", "OPTIONS"})
    router.HandleFunc("/auth/login", Login).Methods("POST", "OPTIONS")
    log.Fatal(http.ListenAndServe(":8000", handlers.CORS(headersOk, originsOk, methodsOk)(router)))
}

func Login(w http.ResponseWriter, r *http.Request) {
    //Create User Struct
    var user User
    json.NewDecoder(r.Body).Decode(&user)
    userPassword := getUserPassword(user.User)
    // call get value for that user
    // check for equality if true, return the structure
    // if false return error
    if user.Password == userPassword {
        w.Header().Set("Content-Type", "text/plain")
        w.Write([]byte("success"))
    } else {
        http.Error(w, "Forbidden", http.StatusForbidden)
    }
}

person Rishabh Jain    schedule 20.12.2017    source источник
comment
Что это работает, когда я передаю свой JSON в формате String, т.е. необработанный текст, но когда он означает «Отправить JSON»? JSON — это текстовый формат, который всегда отправляется в виде строки или текста. Что вы сделали точно?   -  person Volker    schedule 20.12.2017
comment
Когда я отправлял данные после выполнения JSON.stringify(data), это работало, но когда я отправлял данные как есть. Это не работало. Но раньше он работал с сервером NodeJS.   -  person Rishabh Jain    schedule 20.12.2017
comment
Похоже, ваш код на стороне клиента не создает JSON, и с вашим Go все в порядке.   -  person Flimzy    schedule 20.12.2017
comment
@Flimzy это данные моего тела -> let data = {пользователь: пользователь, пароль: пароль}   -  person Rishabh Jain    schedule 20.12.2017
comment
Отправка его как есть выдает 403, но его преобразование в строку и отправка работают.   -  person Rishabh Jain    schedule 20.12.2017
comment
Если вы хотите использовать JSON, вы должны отправить JSON. Я понятия не имею, как Node сериализует произвольный объект. Итак: Просто отправьте JSON (а не случайный мусор).   -  person Volker    schedule 20.12.2017


Ответы (1)


При отправке JSON на любой http-сервер вы всегда должны использовать JSON.stringify().

Невыполнение этого требования приведет к отправке [object Object]... Существуют клиентские библиотеки, которые делают за вас такую ​​тяжелую работу, но за кулисами JSON всегда отправляется в виде строки.


Node.JS обрабатывает это так же... он получает строковое представление, и обычно для входящего запроса запускается что-то вроде синтаксического анализатора тела для извлечения JSON из строки. Так что это может происходить здесь, за кулисами, но это все же происходит.

person Kevin Sandow    schedule 20.12.2017