通过Fetch反应本机发布请求引发网络请求失败

问题描述:

我遇到了以下错误。 目前我正在开发一个带有React Native的Android应用程序,因此我打算使用提取功能来为我提供发布请求。当我修改代码,一个GET请求it's做工精细,在浏览器中使用window.alert()作为返回通过Fetch反应本机发布请求引发网络请求失败

TypeError: Network request failed

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); 
}) 
    ; 

的应用程序现在抛出一个错误这很酷,而且Chrome扩展邮差正确返回数据。

+2

如果有人在iOS上遇到这个问题,请确保您使用的不仅仅是http。默认设置仅用于支持https。 – wuliwong

+0

如何更改设置以支持HTTP? – MadPhysicist

+0

您需要批准'info.plist'中的域名。 http://*.com/questions/38418998/react-native-fetch-network-request-failed – nicholas

对此做出何种反应原住民的错误是没有用处,那么您需要首先获得实际的潜在错误。最简单的方法是编写一个小型的本地程序,它只需使用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错误的反应本土的最简单方法就是运行“亚行logcat”在终端

与Windows OS/PHP开发内置的服务器/反应,原生的Android设备上:

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

那固定的Android手机和我的本地服务器之间的连接问题。

+0

只需为本地IP切换'localhost'就行了,也许是解析'localhost'的bug? – xHocquet

我有一个主要问题在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) 
      }) 
    }; 
}; 

检查2案件娄

  1. 错误的终点
  2. 互联网连接:真实设备,虚拟设备

它已经吃了第二个小时的2小时儿子。

+0

这应该是一个评论。这是**不是**问题的答案。 – GhostCat

+0

我不够写评论。所以我提出一个问题。抱歉。 –

如果你有这个错误,你确定一切正常你正在运行一个模拟器,只需关闭你的模拟器并重新启动它。

它现在应该运行。

这通常发生在你已经蛰伏系统一段时间后

如果您在模拟器上这个问题请确保您还测试设备上。这很可能没有发生在那里。

如此您知道,如果您可以解决它,没有什么可担心的。

由于证书已过期,我在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帮助。