在 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 发送请求数据

如何通过 Kotlin 在 Android 中使用套接字

如何使用kotlin在Android的firebase中获取child的键值

Android 中的 Firebase 通知 (Kotlin)