从ANGULAR到GO =>状态代码:422不可处理实体的Http请求

问题描述 投票:-1回答:1

我正在以某种方式获得http 422响应:状态代码:422 Unprocessable Entity

fmt.Println(c)的控制台消息是:

&{{0xc04227c1c0 -1 200} 0xc0421b2100 0xc042086d10 [] [0x8fdc00 0x8fe950 0x97e310 0x97cf80] 3 0xc0421ea5a0 map [] []}

地图应该填写myEmail和myPassword,但它没有。请帮帮我。

身体有什么问题,还是与网络api有关?

这是我的http请求:

this.http.post('http://localhost:8080/api/v1/users', {'email': 'myEmail', 'password': 'myPassword'}, httpOptions)
          .subscribe(data => {
          console.log('register___', data);
      });

这是httpOptions:

const httpOptions = {
    headers: new HttpHeaders({ 'Content-Type': 'application/json'
        , 'Access-Control-Allow-Origin': '*'
        , 'Access-Control-Allow-Headers': 'access-control-allow-origin, access-control-allow-headers'})
};

这是我正在使用的go web Api:

package main

import (
    "fmt"

    "github.com/gin-gonic/gin"
    "github.com/jinzhu/gorm"
    _ "github.com/mattn/go-sqlite3"
)

type Users struct {
    email string `gorm:"not null" form:"email" json:"email"`
    password  string `gorm:"not null" form:"password" json:"password"`
}

func InitDb() *gorm.DB {
    // Openning file
    db, err := gorm.Open("sqlite3", "./data.db")
    // Display SQL queries
    db.LogMode(true)

    // Error
    if err != nil {
        panic(err)
    }
    // Creating the table
    if !db.HasTable(&Users{}) {
        db.CreateTable(&Users{})
        db.Set("gorm:table_options", "ENGINE=InnoDB").CreateTable(&Users{})
    }

    return db
}

func Cors() gin.HandlerFunc {
    return func(c *gin.Context) {
        c.Writer.Header().Add("Access-Control-Allow-Origin", "http://localhost:4200")
        c.Next()
    }
}

func main() {
    r := gin.Default()

    r.Use(Cors())

    v1 := r.Group("api/v1")
    {
        v1.POST("/users", PostUser)
        v1.OPTIONS("/users", OptionsUser)
        v1.GET("/users", GetUsers)
        v1.GET("/users/:id", GetUser)
        v1.PUT("/users/:id", UpdateUser)
        v1.DELETE("/users/:id", DeleteUser)
    }

    r.Run(":8080")
}

func PostUser(c *gin.Context) {

    fmt.Println("___herewego___")
    db := InitDb()
    defer db.Close()

    var user Users
    c.Bind(&user)
    fmt.Println(c)
    fmt.Println("_____")
    fmt.Println(user)

    if user.email != "" && user.password != "" {
        fmt.Println("geldim gördüm gidiyorum.....................")
        // INSERT INTO "users" (name) VALUES (user.Name);
        db.Create(&user)

        // Display error
        c.JSON(201, gin.H{"success": user})
    } else {
        // Display error
        c.JSON(422, gin.H{"error": "Fields are empty"})
    }

    // curl -i -X POST -H "Content-Type: application/json" -d "{ \"email\": \"Thea\", \"password\": \"Queen\" }" http://localhost:8080/api/v1/users
}

func GetUsers(c *gin.Context) {
    // Connection to the database
    db := InitDb()
    // Close connection database
    defer db.Close()

    var users []Users
    // SELECT * FROM users
    db.Find(&users)

    // Display JSON result
    c.JSON(200, users)

    // curl -i http://localhost:8080/api/v1/users
}

func GetUser(c *gin.Context) {
    // Connection to the database
    db := InitDb()
    // Close connection database
    defer db.Close()

    email := c.Params.ByName("email")
    var user Users
    // SELECT * FROM users WHERE id = 1;
    db.First(&user, email)

    if user.email != "" {
        // Display JSON result
        c.JSON(200, user)
    } else {
        // Display JSON error
        c.JSON(404, gin.H{"error": "User not found"})
    }

    // curl -i http://localhost:8080/api/v1/users/1
}

func UpdateUser(c *gin.Context) {
    // Connection to the database
    db := InitDb()
    // Close connection database
    defer db.Close()

    // Get id user
    email := c.Params.ByName("email")
    var user Users
    // SELECT * FROM users WHERE id = 1;
    db.First(&user, email)

    if user.email != "" && user.password != "" {

        if user.email != "" {
            var newUser Users
            c.Bind(&newUser)

            result := Users{
                email: newUser.email,
                password:  newUser.password,
            }

            // UPDATE users SET email='newUser.email', password='newUser.password' WHERE id = user.Id;
            db.Save(&result)
            // Display modified data in JSON message "success"
            c.JSON(200, gin.H{"success": result})
        } else {
            // Display JSON error
            c.JSON(404, gin.H{"error": "User not found"})
        }

    } else {
        // Display JSON error
        c.JSON(422, gin.H{"error": "Fields are empty"})
    }

    // curl -i -X PUT -H "Content-Type: application/json" -d "{ \"email\": \"Thea\", \"password\": \"Merlyn\" }" http://localhost:8080/api/v1/users/1
}

func DeleteUser(c *gin.Context) {
    // Connection to the database
    db := InitDb()
    // Close connection database
    defer db.Close()

    // Get id user
    email := c.Params.ByName("email")
    var user Users
    // SELECT * FROM users WHERE id = 1;
    db.First(&user, email)

    if user.email != "" {
        // DELETE FROM users WHERE id = user.Id
        db.Delete(&user)
        // Display JSON result
        c.JSON(200, gin.H{"success": "User #" + email + " deleted"})
    } else {
        // Display JSON error
        c.JSON(404, gin.H{"error": "User not found"})
    }

    // curl -i -X DELETE http://localhost:8080/api/v1/users/1
}

func OptionsUser(c *gin.Context) {

    c.Writer.Header().Set("Access-Control-Allow-Methods", "DELETE,POST, PUT")
    c.Writer.Header().Set("Access-Control-Allow-Headers",   "access-control-allow-headers,access-control-allow-origin,content-type")
    c.Next()
}
angular typescript go gin
1个回答
0
投票

您需要导出数据结构中的字段:

type Users struct {
    Email string `gorm:"not null" form:"email" json:"email"`
    Password  string `gorm:"not null" form:"password" json:"password"`
}

它们目前尚未导出,因此仅对您的包装可见。这意味着编组/解组数据结构的包将无法查看字段。

© www.soinside.com 2019 - 2024. All rights reserved.