向Golang API发出发送JSON和严格定义的JSON的请求

向Golang API发出发送JSON和严格定义的JSON的请求,json,go,post,gorilla,mux,Json,Go,Post,Gorilla,Mux,在向Golang API发出POST请求时,如果我发送stringy-fiedJSON数据,它将返回成功,但当我发送JSON数据时,它将返回错误,状态为403 请帮助我理解此行为,以及如何使用POST请求方法发送JSON数据 文件:main.go package main import ( "devmgmtv2/auth" "github.com/gorilla/handlers" "github.com/gorilla/mux" "log" "net/

在向Golang API发出
POST
请求时,如果我发送stringy-fied
JSON
数据,它将返回成功,但当我发送
JSON
数据时,它将返回错误,状态为
403

请帮助我理解此行为,以及如何使用
POST
请求方法发送
JSON
数据

文件: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)
    }
}

将JSON发送到任何http服务器时,始终必须使用
JSON.stringify()

不这样做将导致发送
[object object]
。。。 有一些客户端库为您完成这种繁重的工作,但在幕后JSON总是作为字符串发送



Node.JS以同样的方式处理它。。。它接收字符串表示,通常对传入请求运行类似body的解析器,以从字符串中提取JSON。因此,它可能在幕后发生,但仍然会发生。

当向任何http服务器发送JSON时,您必须始终使用
JSON.stringify()

不这样做将导致发送
[object object]
。。。 有一些客户端库为您完成这种繁重的工作,但在幕后JSON总是作为字符串发送



Node.JS以同样的方式处理它。。。它接收字符串表示,通常对传入请求运行类似body的解析器,以从字符串中提取JSON。因此,它可能在幕后发生,但仍然会发生。

什么是“当我以字符串格式传递JSON时,即原始文本,但当它发送JSON时,它工作”的意思?JSON是一种文本格式,总是以“字符串”或“文本”的形式发送。你到底做了什么?当我在执行JSON.stringify(数据)之后发送数据时,它工作了,但当我按原样发送数据时。它不起作用了。但是它过去与NodeJS服务器一起工作。听起来你的客户端代码没有生成JSON,那么,你的Go也没有问题。@Flimzy这是我的身体数据->让数据={“用户”:用户,“密码”:密码}如果你想使用JSON,你必须发送JSON。我不知道Node如何序列化任意对象。所以:只发送JSON(而不是随机垃圾)。什么是“当我以字符串格式传递JSON(即原始文本)时有效,但当它发送JSON时有效”的意思?JSON是一种文本格式,总是以“字符串”或“文本”的形式发送。你到底做了什么?当我在执行JSON.stringify(数据)之后发送数据时,它工作了,但当我按原样发送数据时。它不起作用了。但是它过去与NodeJS服务器一起工作。听起来你的客户端代码没有生成JSON,那么,你的Go也没有问题。@Flimzy这是我的身体数据->让数据={“用户”:用户,“密码”:密码}如果你想使用JSON,你必须发送JSON。我不知道Node如何序列化任意对象。所以:只需发送JSON(而不是随机垃圾)。