【问题标题】:Unsertain On Handing Http Requests as Json Format [duplicate]不确定以 Json 格式处理 Http 请求 [重复]
【发布时间】:2022-01-13 03:58:34
【问题描述】:

我是 Kotlin 语言的新手,并尝试从各种 YouTube 教程和其他在线文章中学习。我从视频中学到了什么,并按照步骤使用免费的 API 货币汇率创建了一个简单的货币转换器。下面是获取汇率结果的函数。

private fun getApiResult(){

     var baseCurrency = "EUR"
     var convertedToCurrency = "USD"
     var conversionRate = 0f

    if(et_firstConversion != null && et_firstConversion.text.isNotEmpty() && et_firstConversion.text.isNotBlank()){

        val API = "http://data.fixer.io/api/latest?access_key=a22e608d4311d9ade9221a2abadb111e&symbols=$convertedToCurrency,AUD,CAD,PLN,MXN&format=1"

        if(baseCurrency == convertedToCurrency){
            Toast.makeText(applicationContext,"Cannot convert the same currency", Toast.LENGTH_SHORT).show()
        } else {
            GlobalScope.launch(Dispatchers.IO){
                try {
                    val apiResult = URL(API).readText()
                    val jsonObject = JSONObject(apiResult)

                    conversionRate = jsonObject.getJSONObject("rates").getString(convertedToCurrency).toFloat()

                    Log.d("Main", "$conversionRate")
                    Log.d("Main", apiResult)

                    withContext(Dispatchers.Main){
                        val text = ((et_firstConversion.text.toString().toFloat()) * conversionRate).toString()
                        et_secondConversion?.setText(text)
                    }
                } catch (e:Exception){
                    Log.e("Main", "$e")
                }
            }
        }
    }
}

问题是异常被触发并显示以下内容:cleartext http traffic is not permitted

在 Manifest.xml 中,我设置了以下内容:

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

免费 API 对免费用户非常严格,不允许使用 Https。我也不确定编码(它的实现方式)是否正在以正确的方式实现我想要实现的目标。感谢您对代码提出任何建议/改进。

Android 5.0 API 21

【问题讨论】:

  • 添加堆栈跟踪。

标签: android json kotlin url


【解决方案1】:

cleartext 在 Android 9 及更高版本中默认禁用 HTTP 流量。

要使任何http 网址正常工作,您必须添加网络安全配置。

res &gt; xml &gt; network_security_config.xml处添加一个名为network_security_config.xml的文件

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">data.fixer.io</domain>
    </domain-config>
</network-security-config> 

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest ...>
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <application
        ...
        android:networkSecurityConfig="@xml/network_security_config">
        ...
    </application>
</manifest>

您还可以将整个应用设置为在任何域上使用cleartext HTTP。为此,在application 标签中将android:usesCleartextTraffic 设置为true

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest ...>
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <application
        ...
    android:usesCleartextTraffic="true">
        ...
    </application>
</manifest>

您可以在此 codelabs 教程中了解更多信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-15
    • 2017-08-03
    • 1970-01-01
    • 1970-01-01
    • 2020-09-06
    • 2012-11-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多