当前位置: 首页 > 知识库问答 >
问题:

不确定以Json格式处理Http请求[重复]

须原
2023-03-14

我是科特林语言的新手,并尝试从各种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")
                }
            }
        }
    }
}

问题是,异常被触发,并表示以下内容:明文超文本传输协议流量是不允许的

在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

共有1个答案

闽朝
2023-03-14

cleartextHTTP流量在Android 9及以上版本中默认禁用。

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

添加一个名为network_security_config.xmlatres的文件

<?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> 

在Androidanifest.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>

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

在Androidanifest.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教程中阅读更多关于它的内容。

 类似资料:
  • 通常用于HTTP/HTTPS请求失败/成功等处理. 进程: 主进程​ IncomingMessage是由 EventEmitter响应可读流接口 实例事件 事件: 'data' 用途:响应或回调传送到应用的数据 chunk Buffer - 响应正文的数据块. 事件: 'end' 触发:响应正文已结束时 事件: 'aborted' 触发:正在进行的HTTP事务期间请求已取消时 事件: 'error

  • 并发请求处理 我创建了一个服务器,并使用s.listenandserve()来处理请求。据我所知,这些请求是同时送达的。我使用一个简单的处理程序来检查它: 我看到,如果我发送了几个请求,我将看到所有的“1”出现,只有在一秒钟后所有的“2”出现。但是如果删除Hibernate行,我会看到程序在完成前一个请求之前从不启动请求(输出为1 2 1 2 1 2...)。所以我不明白,如果它们是并发的还是不是

  • 问题内容: data = { ‘ids’: [12, 3, 4, 5, 6 , …] } urllib2.urlopen("http://abc.com/api/posts/create”,urllib.urlencode(data)) 我想发送POST请求,但是其中一个字段应该是数字列表。我怎样才能做到这一点 ?(JSON?) 问题答案: 如果您的服务器期望POST请求为json,则您需要添加标

  • 我一直试图向facebook发送HTTP POST请求,但没有成功。我从服务器收到以下响应: HTTP/1.1 400不良请求内容-类型:text/html;charset=utf-8日期:2016年12月10日星期六21:28:17 GMT连接:关闭内容-长度:2959 Facebook |错误 抱歉,出了点问题,我们正在修理,会尽快修好的 我的密码 我做错了什么?

  • 我正在使用Java VertX框架,并尝试使用VertX WebClient和一个简单的HTTP请求加载多个JSON对象。我想并行地做这件事,这样可以加快进程。 我有一个endpoint对象: 在另一个类中,我有以下应该并行处理的函数(源代码): 我不知道如何继续下去。VertX WebClient强制我使用异步处理程序,这意味着我不能直接返回JsonObject。

  • 4.8 处理非HTTP GET请求 一般来说,爬虫只会抓取信息展示类的页面,所以基本只会处理HTTP GET方法的数据。但是对于某些场景,模拟POST等方法也是需要的。 0.7.1版本之后,废弃了老的nameValuePair的写法,采用在Request对象上添加Method和requestBody来实现。 Request request = new Request("http://xxx/pat