json.Marshal 用于带有 echo 的 http post 请求

我有两个在 localhost 上运行的 golang 服务器。


他们使用不同的端口。


我想在一个向另一个发送 JSON 对象的请求上创建一个发布请求。


我正在使用 echo 框架(如果这很重要)


我得到的错误是当我尝试为 post 对象编组对象时:


2-valued json.Marshal(data) (value of type ([]byte, error)) where single value is expected

服务器 1:


type SendEmail struct {

    SenderName       string `json:"senderName,omitempty" bson:"senderName,omitempty" validate:"required,min=3,max=128"`

    SenderEmail      string `json:"senderEmail" bson:"senderEmail" validate:"required,min=10,max=128"`

    Subject          string `json:"subject" bson:"subject" validate:"required,min=10,max=128"`

    RecipientName    string `json:"recipientName" bson:"recipientName" validate:"required,min=3,max=128"`

    RecipientEmail   string `json:"recipientEmail" bson:"recipientEmail" validate:"required,min=10,max=128"`

    PlainTextContent string `json:"plainTextContent" bson:"plainTextContent" validate:"required,min=10,max=512"`

}


func resetPassword(c echo.Context) error {


email := c.Param("email")

    if email == "" {

        return c.String(http.StatusNotFound, "You have not supplied a valid email")

    }


    data := SendEmail{

        RecipientEmail:   email,

        RecipientName:    email,

        SenderEmail:      “test@test”,

        SenderName:       “name”,

        Subject:          "Reset Password",

        PlainTextContent: "Here is your code to reset your password, if you did not request this email then please ignore.",


    }


// error here

    req, err := http.NewRequest("POST", "127.0.0.1:8081/", json.Marshal(data))


    if err != nil {

        fmt.Println(err)

    }

    defer req.Body.Close()


    return c.JSON(http.StatusOK, email)

}

服务器 2:


e.GET("/", defaultRoute)


func defaultRoute(c echo.Context) (err error) {



    u := SendEmail{}

    if err = c.Bind(u); err != nil {

        return

    }


    return c.JSON(http.StatusOK, u)

}


湖上湖
浏览 111回答 2
2回答

慕仙森

见到 Gopher 总是很高兴。您可能想知道一些事情,Go 支持多值返回,因为一个函数可以返回多个值。byteInfo, err := json.Marshal(data) // has two values returned// check if there was an error returned firstif err != nil{  // handle your error here}现在在你的代码下面的行// error herereq, err := http.NewRequest("POST", "127.0.0.1:8081/", json.Marshal(data))会变成这个// error herereq, err := http.NewRequest("POST", "127.0.0.1:8081/", bytes.NewBuffer(byteInfo))您可以继续使用其余代码。快乐编码!

慕婉清6462132

json.Marshal返回[]byte,error这意味着您将 4 个值传递给http.NewRequest.您应该json.Marshal先调用,然后将结果用于http.NewRequest.body, err := json.Marshal(data)if err != nil { // deal with error}req, err := http.NewRequest("POST", "127.0.0.1:8081/", body)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go