通过 Fetch React Native Post Request 引发网络请求失败

Posted

技术标签:

【中文标题】通过 Fetch React Native Post Request 引发网络请求失败【英文标题】:React Native Post Request via Fetch throws Network Request Failed 【发布时间】:2016-04-06 19:53:12 【问题描述】:

我遇到了以下错误。 目前我正在使用 React Native 开发一个 android 应用程序,因此我计划使用 fetch 为我做一个发布请求。

fetch("https://XXreachable-domainXX.de/api/test", 
            method: "post",

            body: JSON.stringify(
                param: 'param',
                param1: 'param',

            )
        
    )
        .then((response) = > response.json()
    )
    .
    then((responseData) = > 
        ToastAndroid.show(
        "Response Body -> " + JSON.stringify(responseData.message), ToastAndroid.SHORT
    )
)
    .
    catch((error) = > 
        console.warn(error);
)
    ;

应用现在抛出错误:

TypeError:网络请求失败

当我将代码更改为 GET-Request 时,它工作正常,在带有 window.alert() 作为返回的浏览器中,它很酷,而且 Chrome 扩展 Postman 也可以正确返回数据。

【问题讨论】:

请参考下面的链接:github.com/facebook/react-native/issues/… 如果有人在 ios 上遇到这个问题,请确保您使用的是 https 而不仅仅是 http。默认设置仅支持 https。 如何更改设置以支持 HTTP? 您需要批准info.plist 中的域。 ***.com/questions/38418998/… 即使一个人不在线,显示网络请求失败的红屏看起来不太好,有没有办法以自己的方式处理它,比如警报之类的...... 【参考方案1】:

这个 React Native 的错误是相当无用的,所以你需要先得到实际的底层错误。最直接的方法是编写一个小型原生程序,该程序将使用HttpsURLConnection 执行相同的查询。

对我来说,实际错误是java.security.cert.CertPathValidatorException: Trust anchor for certification path not found. 有一个众所周知的解决方案:https://developer.android.com/training/articles/security-ssl.html#MissingCa

这也很可能是您的情况,因为浏览器和邮递员对请求没有问题。要检查它运行openssl s_client -connect XXreachable-domainXX.de:443 -showcerts。如果有证书错误,请先修复它们,这样可以节省您编写本机程序的时间。

编辑:实际上,查看所有底层 android 错误的最简单方法是在终端中运行“adb logcat”

【讨论】:

【参考方案2】:

在设备上使用 Windows OS/php 内置服务器/react-native Android 进行开发:

检查服务器本地IP地址(ipconfig),例如172.16.0.10 在 react-native fetch 中使用此 URL 和正确的端口 (fetch('http://172.16.0.10:8000/api/foo)) 使用此特定 IP 而不是本地主机运行 PHP 内置服务器:php -S 172.16.0.10:8000 ... 关闭专用网络的 Windows 防火墙

这为我解决了 Android 手机和本地服务器之间的连接问题。

【讨论】:

只是将localhost 切换为我的本地IP 就可以了,也许是解析localhost 的错误?【参考方案3】:

我在 android 模拟器上做同样的事情时遇到了一个大问题。在 iOS 上,必须在 info.plist 中批准域。需要明确的是,我试图登录到我的 .NET Web 托管 API。

解决方法是确保帖子数据已参数化。(我很确定这是一个词)

export const loginUser = ( userName, password ) => 
const data = `UserName=$userName&Password=$password&grant_type=password`
    return (dispatch) => 
        dispatch( type: LOGIN_USER )

        fetch(URL_LOGIN, 
            method: 'POST',
            headers: 
                'Accept': 'application/json',
                'Content-Type': 'application/json',
            ,
            body: data
            // body: 

            //     UserName: userName,
            //     Password: password,
            //     grant_type: 'password'

            // 

        )
            .then((response) =>  
                loginUserSuccess(dispatch, response)
            )
            .catch((response) => 
                loginUserFailed(dispatch, response)
            )
    ;
;

【讨论】:

【参考方案4】:

检查以下两种情况

    错误的端点 互联网连接:真实设备和虚拟设备

第二个原因已经吃了2个小时了。

【讨论】:

那应该是一个评论。这不是问题的答案。 这不是答案【参考方案5】:

如果您遇到此错误并且确定一切正常并且您正在运行模拟器,只需关闭模拟器并再次启动它。

它现在应该运行了。

这通常发生在您将系统休眠一段时间后

【讨论】:

【参考方案6】:

如果您在模拟器上遇到此问题,请确保您也在设备上对其进行测试。它很可能不会在那里发生。

只是让您知道,如果您可以解决它,就没有什么可担心的。

【讨论】:

【参考方案7】:

由于证书过期,我在 Android 上遇到了这个问题。我收到的错误消息是com.android.org.bouncycastle.jce.exception.ExtCertPathValidatorException: Could not validate certificate: Certificate expired at Fri Sep 29 16:33:39 EDT 2017 (compared to Fri Dec 08 14:10:58 EST 2017)

我可以使用digicert.com 确认这一点。

不幸的是,我确实不得不深入研究 React Native 代码并调试包 (index.android.bundle) 中的 XHR 代码,以便找到错误消息和有问题的 URL,因为它在我的一些日志记录代码中,我显然也没有登录到控制台。 :)

this GitHub issue comment 帮助了我。

【讨论】:

【参考方案8】:

步骤 1> 在 AndroidManifest.xml 中添加 android:usesCleartextTraffic="true" 行,例如:

// 添加这一行 ... 第二步> 从您的 android 文件夹中删除所有调试文件夹..

【讨论】:

【参考方案9】:

以上答案都没有帮助我。 问题是headers:

旧标题:

fetch(API_HOST, 
                method: 'POST',
                headers: 
                    Accept: 'application/json'
                ,
                body: JSON.stringify(data),

更新标题:

fetch(config.API_HOST, 
                method: 'POST',
                headers: 
                    Accept: 'application/json',
                    'Content-Type': 'application/json'  // I added this line
                ,
                body: JSON.stringify(data),

【讨论】:

遇到了同样的问题。这解决了它!谢谢 太棒了,抓住......你拯救了我的一天。谢谢!干得好。

以上是关于通过 Fetch React Native Post Request 引发网络请求失败的主要内容,如果未能解决你的问题,请参考以下文章

React Native / Expo:Fetch 抛出“网络请求失败”

react-native——fetch

无法读取未定义的 React-Native Firebase React-native-fetch-blob 的属性“DocumentDir”

使用授权标头的react-native fetch有时会返回401

React Native之Fetch简单封装获取网络状态

稀饭react native 实战系列教程之影片数据获取并解析