json - Kotlin 拒绝传递参数
问题描述
我正在用这个拔掉我的头发,我希望这是一件显而易见的事情,有人可以立即发现。
我有一个简单的应用程序,可以让我和我的孩子跟踪我们的棋盘游戏(我们有奖杯和一切!)。该应用程序允许我们创建游戏,定义玩家并上传分数。很好很简单。
我编写了一个简单的 API,通过 json 使用改造将游戏直接添加到 SQL Server 数据库中。
直到今天,这一切都运行良好。我想知道是谁创建/更新了游戏,以便在应用启动时获取 Google 帐户详细信息。这很好用,我可以将电子邮件地址存储在 Main Activity 的全局变量中,然后在创建游戏的 Activity (CreateNewGame) 中读回它。
我已经设置了一个接口来进行调用,并且我有定义 json 的模型。存储过程获取 json 并在内部处理它(是的,我知道,不是很安全,但它是我和我的孩子,而不是公共应用程序)。
问题是正在拨打电话并创建游戏,但电子邮件地址未通过。
该模型如下所示:
data class newGame(
var gamename: String? = null,
var email: String? = null,
var event_id: Int? = 0,
var gamedate: String? = "1900-01-01",
var players: ArrayList<Player> = ArrayList()
) {
data class Player(
var player: String? = null,
var player_id: Int? = 0,
var score: Int? = 0,
var points: Int? = 0
)
}
我的界面是:
interface CreateGame {
@POST("games?apitoken=xxxx")
fun addNewGame(
@Query("operation") operation: String,
@Body newGame: newGame
): Call<gameEvent>
companion object {
fun create(): CreateGame {
val retrofit = Retrofit.Builder()
.addConverterFactory(GsonConverterFactory.create())
.baseUrl(BaseURL)
.build()
return retrofit.create(CreateGame::class.java)
}
}
}
我从按钮侦听器调用的函数中调用它:
var gm: newGame = newGame(
gamename = GamesList.text.toString(),
email = GameTrackerApplication.currentUser
)
Log.d(GameTrackerApplication.TAG, "Creating game for ${gm.email!!}")
//Add the game
CreateGame.create().addNewGame("game", gm).enqueue(object: Callback<gameEvent> {
override fun onFailure(call: Call<gameEvent>, t: Throwable) {
Log.d(GameTrackerApplication.TAG, "ERROR:: ${t.localizedMessage!!}")
t.printStackTrace()
}
override fun onResponse(call: Call<gameEvent>, response: Response<gameEvent>) {
Log.d(GameTrackerApplication.TAG, gm.toString())
Log.d(GameTrackerApplication.TAG, response.body()?.APIResult!![0].toString())
var ev = response.body()?.APIResult!![0]
var EventID: Int? = ev.games[0].event_id
Log.d(GameTrackerApplication.TAG, "Event: ${EventID.toString()}")
val intent = Intent(this@AddNewGame, Scorecard::class.java)
intent.putExtra("EventID",EventID.toString())
startActivity(intent)
}
})
我可以在设置游戏类“为 tim@gmail.com 创建游戏”后立即在 logcat 中看到消息,并且可以看到 onResponse 中返回的两条消息。第一个编写模型,包括电子邮件:
2021-09-16 11:07:36.092 27486-27486/? D/GameTrackerTAG: newGame(gamename=Ticket To Ride, email=tim@gmail.com, event_id=0, gamedate=1900-01-01, players=[Player(player=Tim, player_id=0, score=0, points=0), Player(player=Cin, player_id=0, score=0, points=0)])
第二个写入来自数据库的响应:
2021-09-16 11:07:36.092 27486-27486/? D/GameTrackerTAG: Result(developer_message=, games=[Game(event_date=2021-09-16, event_id=223, game_event_player_id=758, game_name=Ticket To Ride, player_id=1, player_name=Tim, score=0), Game(event_date=2021-09-16, event_id=223, game_event_player_id=759, game_name=Ticket To Ride, player_id=2, player_name=Cin, score=0)], id=200, status_message=Success, user_message=Success)
所以我可以看到事件是在数据库中创建的。但是,当我运行 SQL 探查器时,我看到:
正如您在屏幕截图中看到的,参数“email”不存在!
完整的调用是:
exec dbo.NewEvent @NewGame=N'{"event_id":0,"gamename":"Ticket To Ride","gamedate":"1900-01-01","players":[{"player":"Tim","player_id":0,"score":0,"points":0},{"player":"Cin","player_id":0,"score":0,"points":0}]}'
我看不出是什么阻止了它的提供,因为 json 的其余部分都很好地融入其中。我试过传递所有参数而不是使用默认值,它们都被很好地传递了。我试过改变参数的顺序。我什至将全局变量读入本地字符串,以防万一全局变量的管理方式有些奇怪,但它只是拒绝传递电子邮件,这让我认为它一定是我错过的简单事情。
谁能看到我做错了什么?
解决方案
推荐阅读
- python - 有关解析/替换错误的更多信息
- go - 如何访问 map[string]interface {}?
- google-cloud-platform - 如何在谷歌云中打开“http://localhost:8081/”?
- java - 我想跳过预期 JSON 文件中的一些键,以便与 JSON 响应进行比较
- google-sheets - 具有挑战性的 importxml 任务
- python - 比使用带有 JSON 的 python 管理数据更快的方法
- python - Scipy odeint。引力运动
- ssh - 在 Vagrant 中将文件从访客传输到主机
- android - Jetpack Compose 显示错误的颜色
- jupyter-lab - 如何解决 jupyter lab http://localhost:888/api/kernels?403(禁止)