Котлин отказывается передавать параметр

#json #api #kotlin

Вопрос:

Я выдергиваю волосы с помощью этого, и я надеюсь, что это что-то очевидное, что кто-то сможет сразу заметить.

У меня есть простое приложение, которое позволяет мне и моим детям отслеживать нашу настольную игру (у нас есть трофей и все такое!). Приложение позволяет нам создавать игру, определять игроков и загружать результаты. Красиво и просто.

Я написал простой API для добавления игр непосредственно в базу данных SQL Server через json с помощью дооснащения.

Все это прекрасно работало до сегодняшнего дня. Я хочу знать, кто создает/обновляет игру, поэтому я получаю данные учетной записи Google при запуске приложения. Это работает нормально, и я могу сохранить адрес электронной почты в глобальных переменных в основном действии и прочитать его в действии, создающем игру (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» и я вижу два сообщения, возвращенных в ответ на запрос. Первый пишет модель, включая электронное письмо:

 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 отлично работает. Я попытался передать все параметры, а не использовать значения по умолчанию, и все они передаются просто отлично. Я попытался изменить порядок параметров. Я даже прочитал глобальную переменную в локальную строку на случай, если это что-то странное в том, как управляются глобальные переменные, но она просто отказывается передавать электронное письмо, что заставляет меня думать, что это должно быть что-то простое, что я пропустил.

Кто-нибудь может понять, что я делаю не так?

Комментарии:

1. Просто дикий удар в темноте: может ли где-то быть несоответствие версий, используя более старую версию newGame без этого параметра или более старую версию кода, сериализующую или десериализующую его?

2. Есть ли способ заставить Android Studio обновиться до правильной версии? API не определяет json, он просто обрабатывает его как строку. SQL Server обрабатывает эту строку как json и игнорирует любые элементы, которые ему безразличны. Строка, показанная в профилировщике, однако, не содержит электронной почты, поэтому она выпала где-то между Android и вызовом БД