我不太确定哪一方是问题的原因,但似乎Gin收到了请求,但不允许来自android应用的请求.我试图POST到的端点与一个具有类型字段的整体模型相关,而该类型字段"告诉"Gin哪些是必需的字段(我的工作流对于我的系统的这一部分来说有点复杂).在android端,我有一个对应于这个整体模型的模型,因为我在应用程序中使用它来做一些东西.以前,我只需要从服务器获取与整体模型相关的数据.现在,我正在为它执行POST.服务器型号的android副本如下所示:

@Entity(tableName = "thing", indices = [Index(value = ["id"], unique = true)])
data class Thing(
    @PrimaryKey(autoGenerate = false) @ColumnInfo(name = "id") var id: String,
    @SerializedName("CreatedAt") @ColumnInfo(name = "created_at") var created_at: String,
    @ColumnInfo(name = "name") var name: String,
    @ColumnInfo(name = "type_id") var type_id: String,
    @ColumnInfo("type") var type: ThingType? = null,
    @ColumnInfo(
        name = "some_field_1",
        defaultValue = "0"
    ) var some_field_1: Float = 0.0f,
    @ColumnInfo(
        name = "some_field_2",
        defaultValue = "0"
    ) var some_field_2: Float = 0.0f,
    @ColumnInfo(
        name = "some_field_3",
        defaultValue = "0"
    ) var some_field_3: Float = 0.0f,
    @ColumnInfo(
        name = "some_field_4",
        defaultValue = "0"
    ) var some_field_4: Float = 0.0f,
    @ColumnInfo(
        name = "some_field_5",
        defaultValue = "0"
    ) var some_field_5: Float = 0.0f,
    @ColumnInfo(
        name = "parent_id",
        defaultValue = "0"
    ) var parent_id: String
)

然后,这是整体式服务器模型的一个片段:

type Thing struct {
    gorm.Model
    ID            string    `gorm:"primarykey; size:40;" json:"id"`
    Name          string    `json:"name"`
    TypeId        string    `gorm:"size:40; index; not null" json:"type_id"`
    Type          Type      `gorm:"foreignKey:TypeId; constraint:OnUpdate:CASCADE,OnDelete:CASCADE" json:"type"`
    SomeField1    float32   `json:"some_field_1"`
    SomeField2    float32   `json:"some_field_2"`
    SomeField3    float32   `json:"some_field_3"`
    SomeField4    float32   `json:"some_field_4"`
    SomeField5    float32   `json:"some_field_5"`
    ParentId      float32   `json:"parent_id"`
}

然后I POST a Thing使用Retrofit,如下所示:

@POST("/thing_info")
suspend fun postThingInfo(
    @HeaderMap headers: Map<String, String>,
    @Body data: Thing
): Response<Thing>

val thing =
    Thing(
        "",
        "",
        name = binding.txtName.text.toString(),
        type_id = typeId,
        some_field_1 = binding.txtSomeField1.text.toString()
            .toFloat(),
        some_field_2 = binding.txtSomeField2.text.toString()
            .toFloat(),
        some_field_3 = binding.txtSomeField3.text.toString()
            .toFloat(),
        parent_id = parentId,
    )

//then the usual Retrofit boilerplate

使用这些代码,我只看到请求得到201,但没有错误,即使我为进程中出现的每个错误对象返回了一些东西.

以下是Golang代码btw:

ginGine.POST("/thing_info", func(ctx *gin.Context) {
    errMsg := clnHelpers.ValidateAccessToken(ctx.GetHeader("access_token"))

    if errMsg != "" {
        ctx.JSON(http.StatusBadRequest, gin.H{
            "error": errMsg,
        })
        return
    }

    var thing_info models.Thing

    err := ctx.ShouldBind(&thing_info)
    if err != nil {
        ctx.JSON(http.StatusBadRequest, gin.H{
            "error": err.Error(),
        })
        return
    }

    data := &pb.ThingInfo{
        Name:                        thing_info.Name,
        TypeId:                      thing_info.TypeId,
        //other field association
    }

    res, err := srvClient.service.CreateThingInfo(ctx, &pb.CreateThingInfoRequest{
        ThingInfo: data,
    })

    if err != nil {
        ctx.JSON(http.StatusBadRequest, gin.H{
            "error": err.Error(),
        })
        return
    }

    ctx.JSON(http.StatusCreated, gin.H{
        "thing_info": res.ThingInfo,
    })
})

推荐答案

终于找到了这个问题的答案,我认为它与gorm有关.因此,在我的实际Android模型中,我添加了created_at,因为我需要它来进行Android端的一些排序.因为它是一个自动按gorm相加的字段,所以我认为在POSTThing求值时不需要给它赋值,我甚至不需要将其传递给Postman.起初,我只是向它传递一个空字符串,但它不喜欢.然后我想,有了

var thing_info models.ThingInfo

err := ctx.ShouldBind(&thing_info)
if err != nil {
    ctx.JSON(http.StatusBadRequest, gin.H{
        "error": err.Error(),
    })
    return
}

在我的代码中,会把错误带回给我,就像我之前遇到的所有其他错误一样.但它没有,不知何故,之前的错误没有被归还给我.然后我插入了一个很好的OL‘

fmt.Printf("thing_info bind err: %v\n", err)

在那个if语句中,最后得到了一个错误(讽刺的是很高兴找到一个错误).看起来又一次,尽管created_at是一个gorm加的字段,但它试图将我从Android应用程序传递的空字符串转换为日期和时间.经过一些测试后,它似乎传递了一个看起来像2023-08-07T4:46:00Z的字符串是可以接受的,幸运的是,gorm似乎忽略了这个值,并且放入了记录的实际创建日期-时间.

Android相关问答推荐

listOf(listOf(字符串))在lazyArchitect(lazyStream)中合成

使用不同的Google帐户登录

无法理解Kotlin Coroutines and Flows中的J.C.编程行为

编写Landscape BoxWithRequests具有错误的高度.(aspectRatio matchHeight约束第一次未按预期工作)

如何制作带有图标和文本的Fab

房间@嵌入式VS一对一关系

在Jetpack Compose中从LazyColumn中删除项目时发生IndexOutOf边界异常

使用lazyColumn迁移paging3的旧代码

Android Compose - 为什么 Canvas 中的drawText在底部被切断而不是在顶部?

如何在卡片视图右侧添加箭头

DatePickerDialog (Android/Kotlin) 的两个问题

Android Studio:按下前缀键:切换 Logcat 格式

React Native Android 应用程序在调试模式下运行良好,但当我们发布 apk 时,它会生成旧版本的应用程序

如何添加到先前预填充的 Room 数据库?

如何在 react native 应用程序中显示复选框?当它在 android 模拟器中可见时

如何使用 ConstraintLayout 链接两个文本

为什么按钮没有拉伸到屏幕边缘?

如何在 Android Studio 中使用 Github Copilot?

react-native-config 在发布版本中不起作用

如何在android studio 2021.1中使用谷歌库以外的库