Сделать HTTP-запрос при нажатии кнопки в Kotlin

Я хочу сделать запрос в приложении для Android, когда нажимается кнопка. В Python я мог бы так:

import requests params = { 'param1':some_string, 'param2':some_int, 'param3':another_string } requests.post("https://some.api.com/method/some.method", params=params) 

Я хотел бы сделать то же самое в Котлине, когда я нажимаю кнопку. Я попробовал tp сделать это с помощью Fuel и khhtp, но не преуспел – приложение разбилось, как только я нажал кнопку, отвечающую за отправку запроса.

UPD: то, что я использовал:

AndroidManifest.xml

 ... <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> ... 

build.gradle

 dependencies { ... compile 'com.github.jkcclemens:khttp:0.1.0' ... } 

MainActivity.kt

 fun request(){ var message = "message" var uid = "123456" //I wanted to use it as int, but mapOf didn't allow me var token = "token" val payload = mapOf("token" to token, "user_id" to uid, "message" to message) get("https://some.api.com/method/some.method", params=payload) val popup = Toast.makeText(this,"Message sent!",Toast.LENGTH_LONG) popup.show() } 

activity_main.xml

 <Button ... android:onClick="request" /> 

Это пример с khhtp, тот, у которого топливо исчезло.

UPD2. Часть выхода Logcat:

введите описание изображения здесь введите описание изображения здесь

Вам просто нужно посмотреть на трассировку стека, чтобы найти проблему. Код генерирует исключение NetworkOnMainThreadException . Это происходит, когда вы пытаетесь получить доступ к сети из основного потока (часто называемого UI) Android. У этого вопроса есть несколько хороших ответов на эту проблему, однако вместо того, чтобы пытаться использовать AsyncTask обязательно прочитайте документацию выбранной сетевой библиотеки и посмотрите, как сделать вызов в другом потоке.

Я не уверен, что это корень вашей проблемы, но ваша подпись метода запроса должна быть:

 fun request(view: View) { } 

Как отвечали другие участники, ваш код вызывает сетевую операцию в основном потоке, поэтому он сбой. Вы можете избежать этого либо с помощью Kotlin Coroutines, либо с помощью методов библиотеки Anko (которая официально поддерживается kotlin для упрощения работы в android). Здесь я просто даю ссылку на то, как сделать вызов Async в Anko .

 doAsync { // Call all operation related to network or other ui blocking operations here. uiThread { // perform all ui related operation here } } 

Чтобы сделать это как Kotlin Coroutines, вы можете сослаться на этот ответ: –

Kotlin Coroutines – правильный путь в Android