在 kotlin (Android ) 中发送获取请求
Posted
技术标签:
【中文标题】在 kotlin (Android ) 中发送获取请求【英文标题】:Send get request in kotlin (Android ) 【发布时间】:2020-09-27 07:06:58 【问题描述】:我需要在安卓应用中发送http get请求。
...
import java.net.HttpURLConnection
import java.net.URL
...
fun sendGet(view: View)
val url = URL("http://www.google.com/")
with(url.openConnection() as HttpURLConnection)
requestMethod = "GET" // optional default is GET
println("\nSent 'GET' request to URL : $url; Response Code : $responseCode")
inputStream.bufferedReader().use
it.lines().forEach line ->
println(line)
清单
<uses-permission android:name="android.permission.INTERNET" />
<application
然后我按发送请求按钮应用程序崩溃。
日志
2020-06-08 13:37:58.832 7039-7039/com.example.remote E/AndroidRuntime: 致命异常: main 进程:com.example.remote,PID:7039 java.lang.IllegalStateException:无法执行 android:onClick 的方法 在 androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:402) 在 android.view.View.performClick(View.java:7357) 在 android.view.View.performClickInternal(View.java:7334) 在 android.view.View.access$3600(View.java:808) 在 android.view.View$PerformClick.run(View.java:28200) 在 android.os.Handler.handleCallback(Handler.java:907) 在 android.os.Handler.dispatchMessage(Handler.java:99) 在 android.os.Looper.loop(Looper.java:223) 在 android.app.ActivityThread.main(ActivityThread.java:7478) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:549) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:941) 引起:java.lang.reflect.InvocationTargetException 在 java.lang.reflect.Method.invoke(本机方法) 在 androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:397) 在 android.view.View.performClick(View.java:7357) 在 android.view.View.performClickInternal(View.java:7334) 在 android.view.View.access$3600(View.java:808) 在 android.view.View$PerformClick.run(View.java:28200) 在 android.os.Handler.handleCallback(Handler.java:907) 在 android.os.Handler.dispatchMessage(Handler.java:99) 在 android.os.Looper.loop(Looper.java:223) 在 android.app.ActivityThread.main(ActivityThread.java:7478) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:549) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:941) 原因:java.io.IOException:不允许到 www.google.com 的明文 HTTP 流量 在 com.android.okhttp.HttpHandler$CleartextURLFilter.checkURLPermitted(HttpHandler.java:127) 在 com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:462) 在 com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:411) 在 com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:542) 在 com.example.remote.MainActivity.sendGet(MainActivity.kt:24) 在 java.lang.reflect.Method.invoke(本机方法) 在 androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:397) 在 android.view.View.performClick(View.java:7357) 在 android.view.View.performClickInternal(View.java:7334) 在 android.view.View.access$3600(View.java:808) 在 android.view.View$PerformClick.run(View.java:28200) 在 android.os.Handler.handleCallback(Handler.java:907) 在 android.os.Handler.dispatchMessage(Handler.java:99) 在 android.os.Looper.loop(Looper.java:223) 在 android.app.ActivityThread.main(ActivityThread.java:7478) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:549) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:941)
【问题讨论】:
您是否也可以使用 Logcat 中显示的日志来编辑问题,告诉您崩溃的原因。 查看How to fix 'android.os.NetworkOnMainThreadException'? 【参考方案1】:试试这个,
fun sendGet()
try
//disable the strict mode otherwise perform this operation on netWork Thread
val policy = StrictMode.ThreadPolicy.Builder().permitAll().build()
StrictMode.setThreadPolicy(policy)
// GET Request
val request = "http://www.google.com/"
val url = URL(request)
val conn = url.openConnection()
conn.doOutput = true
// Get the response
val rd = BufferedReader(InputStreamReader(conn.getInputStream()))
var line: String
var sResult = ""
while (rd.readLine().also line = it != null)
// Process line...
sResult = "$sResult$line "
rd.close()
Log.e("RESULT", sResult)
catch (e: Exception)
println("Error $e")
【讨论】:
2020-06-08 21:20:03.696 16271-16271/com.example.remote I/System.out:错误 java.io.FileNotFoundException:google.com 正确粘贴您的 GET 请求 URL,而不是 google.com 谢谢。我尝试向 iplogger 发送请求。它正在工作! 爱你!你让我开心) 不客气。如果您的问题已解决,请也投赞成票。以上是关于在 kotlin (Android ) 中发送获取请求的主要内容,如果未能解决你的问题,请参考以下文章
使用 Kotlin 的 Firebase 云消息传递 Android
如何纠正 android kotlin 发送格式错误的 JSON
android-kotlin JsonObject JsonArray 通过 POST 发送请求数据