网络安全配置:未指定网络安全配置,使用平台默认值。错误响应代码:400。

24

我正在尝试连接以下任意一个地方并获取JSON数据:

https://content.guardianapis.com/search?q=debate&tag=politics/politics&from-date=2014-01-01&api-key=test
https://content.guardianapis.com/search?q=debates&api-key=test
https://content.guardianapis.com/search?api-key=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx

这三个网站我可以通过浏览器访问,但是当我尝试通过一个安卓应用程序访问它们时,我会收到以下错误信息:

NetworkSecurityConfig: No Network Security Config specified, using platform default
Error response code: 400

我已将以下内容添加到 manifest.xml 文件中:

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

我还添加了以下内容到manifest.xml文件中:

android:networkSecurityConfig="@xml/network_security_config"

并创建了res/xml/network_security_config.xml文件,其中包含:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config>
        <domain includeSubdomains="true">content.guardianapis.com</domain>>
    </domain-config>

将错误更改为:

D/NetworkSecurityConfig: Using Network Security Config from resource network_security_config debugBuild: true
Error response code: 400

我知道它缺失了:

<trust-anchors>
    <certificates src="@raw/my_ca"/>
</trust-anchors>

但是我不知道证书在哪里或者是什么,也不确定是否需要。

不太清楚发生了什么事情,任何帮助都将不胜感激。

此外,我可以成功连接并从此URL获取JSON:-

https://earthquake.usgs.gov/fdsnws/event/1/query?format=geojson&eventtype=earthquake&orderby=time&minmag=6&limit=10

我得到的只有这个:

No Network Security Config specified, using platform default

购买时未出现错误400,而是显示200,这让我觉得有些奇怪,但不确定问题出在哪里。


除非出于某种原因要限制应用程序可以访问的URL,否则您实际上不需要创建自定义网络安全配置-默认配置几乎总是足够的。唯一需要的情况是如果您的服务具有不受信任的证书,但在如今几乎免费的Let's Encrypt的情况下,这基本上不会发生。 - Gabe Sechan
在应用程序标签中添加以下内容:-android:usesCleartextTraffic="true" - Chirag Nahar
谢谢,我开始时没有它,只是为了尝试让它工作,我添加了网络安全。 - Markus
请分享设备操作系统、型号以及 API 使用情况,即调用 API 方法的代码位置。谢谢。 - Quick learner
修改为usesCleartextTraffic="true"后,仍然出现相同的400错误代码。 - Markus
请研究此链接:https://developer.android.com/training/articles/security-config - Al-Amin
4个回答

73

尝试这些解决方案

解决方案1)

将以下属性添加到 AndroidManifest.xml 中的<application标记中:

android:usesCleartextTraffic="true"

解决方案2)

app/src/main/AndroidManifest.xml文件中的<application标签中添加android:networkSecurityConfig="@xml/network_security_config"

<application
        android:name=".ApplicationClass"
        android:allowBackup="true"
        android:hardwareAccelerated="false"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:largeHeap="true"
        android:networkSecurityConfig="@xml/network_security_config"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

app/src/main/res/xml/ 中有相应的 network_security_config.xml

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true" />
</network-security-config>

输入图片说明

请参考这个答案获取更多信息:Download Manger not working in Android Pie 9.0 (Xiaomi mi A2)


1
抱歉,还是没有运气。我在想这可能与我向服务器发出请求的方式有关。这只是一个简单的GET请求,所以我不确定为什么会出现问题。我会进一步调查的。 - Markus
你能详细解释一下这些解决方案的含义吗? - Shachar Har-Shuv
作为一名专注于iOS开发的人,你觉得那个长路径位置是必要的吗?你提供了Android指南中缺失的细节,真是帮了我大忙。谢谢! - David

17

修改后的答案 从代码中删除 <domain includeSubdomains="true">secure.example.com</domain>

使用以下内容:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true" />
</network-security-config>

并且它适用于任何URL或IP地址。

尝试设置cleartextTrafficPermitted=false

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
       <domain includeSubdomains="true">secure.example.com</domain>
    </domain-config>
</network-security-config>

1
谢谢回复。我仍然遇到以下问题:从资源network_security_config使用网络安全配置debugBuild: true,错误响应代码:400。 - Markus
@Markus,你是怎么解决的?我在我的一个项目中也遇到了同样的问题。这可能与服务器有关。因为我曾经在另一个项目中使用相同的解决方案来解决这个问题。请告诉我一声。 - Insane Developer
问题最终是由于我的URL字符串请求信息出现错误,导致了400错误。一旦我纠正了我的URL API请求字符串,它就正常工作了。 - Markus
但是,我的URL是正确的,我已经努力解决了,但是无法解决。因此,我尝试了我正在添加的代码作为答案。它适用于任何URL或IP。 - Insane Developer
我的意思是URL请求中出现了错误,网站无法理解该请求,因此返回了400错误。 - Markus
关于URL,它被设置为cleartextTrafficPermitted="false"。我已经编辑了答案。现在它可以正常工作了。 - android developer

2
我也遇到了同样的问题,尝试了很多解决方案(添加配置等),但它们对我没有用。我仔细检查了我的代码,发现我编写的访问节点的代码有问题。不是语法错误,而是节点名称不匹配。

0
打开位于app/src/main文件夹下的AndroidManifest.xml文件,在application标签内添加以下代码行
android:networkSecurityConfig="@xml/network_security_config"

现在,你需要在 app/src/main/res/xml 这个位置创建一个名为 network_security_config.xml 的文件,并将以下代码添加到该文件中。
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true" />
</network-security-config>

如果你已经做过这个了,那就确保你的文件中有上面的代码。如果你的文件中包含有域名的话,就删除那一行。
Remove <domain includeSubdomains="true">secure.etc.com</domain> from the code.

我还做了另一件事,我从我的AndroidManifest.xml文件中删除了这行代码。
android:usesCleartextTraffic="true" 

这将在您的活动标签中显示。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接