我不太确定哪一方是问题的原因,但似乎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,
})
})