首页 > 解决方案 > 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 的其余部分都很好地融入其中。我试过传递所有参数而不是使用默认值,它们都被很好地传递了。我试过改变参数的顺序。我什至将全局变量读入本地字符串,以防万一全局变量的管理方式有些奇怪,但它只是拒绝传递电子邮件,这让我认为它一定是我错过的简单事情。

谁能看到我做错了什么?

标签: jsonapikotlin

解决方案


推荐阅读