React Native fetch()不能正常工作

时间:2018-01-03 14:30:31

标签: javascript android react-native fetch

我正在尝试调用fetch()函数。

它适用于iOS但不能在Android上运行。

fetch('https://admin.leanpoint.com/Api/User/Login?user=srinu@mainpoint.dk', { 
  method: 'POST', 
  headers: {
    'Authorization': 'Basic c3JpbnVAbWFpbnBvaW50LmRrOnNhaWJhYmE='
  },
})
.then((res) => {
  res.json().then((json) => {
    alert(JSON.stringify(json))
  })
})
.catch((err) => {
  alert(JSON.stringify(err))
})

在iOS上,它会输入.then()但在Android上输入.catch()err{}

它也不适用于仿真器和真实设备。

感谢任何帮助。 ^ _ ^

  

使用Axios的错误日志

当我使用fetch()时,它会使用{}输入.catch()

我尝试使用Axios,如下所示。

axios.post('https://admin.leanpoint.com/Api/User/Login?user=srinu@mainpoint.dk', null, {
      headers: {
        'Authorization': 'Basic c3JpbnVAbWFpbnBvaW50LmRrOnNhaWJhYmE='
      },
      timeout: 2000
    })
    .then((res) => {
      console.log(res.data)
    })
    .catch((err) => {
      console.log(err)
    })

它会返回如下错误。

{ [Error: Network Error]
  config:
   { adapter: [Function: xhrAdapter],
     transformRequest: { '0': [Function: transformRequest] },
     transformResponse: { '0': [Function: transformResponse] },
     timeout: 2000,
     xsrfCookieName: 'XSRF-TOKEN',
     xsrfHeaderName: 'X-XSRF-TOKEN',
     maxContentLength: -1,
     validateStatus: [Function: validateStatus],
     headers:
      { Accept: 'application/json, text/plain, */*',
        'Content-Type': 'application/x-www-form-urlencoded',
        Authorization: 'Basic c3JpbnVAbWFpbnBvaW50LmRrOnNhaWJhYmE=' },
     method: 'post',
     url: 'https://admin.leanpoint.com/Api/User/Login?user=srinu@mainpoint.dk',
     data: null },
  request:
   { UNSENT: 0,
     OPENED: 1,
     HEADERS_RECEIVED: 2,
     LOADING: 3,
     DONE: 4,
     readyState: 4,
     status: 0,
     timeout: 2000,
     withCredentials: true,
     upload: {},
     _aborted: false,
     _hasError: true,
     _method: 'POST',
     _response: 'java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.',
     _url: 'https://admin.leanpoint.com/Api/User/Login?user=srinu@mainpoint.dk',
     _timedOut: false,
     _trackingName: 'unknown',
     _incrementalEvents: false,
     responseHeaders: undefined,
     _requestId: null,
     _cachedResponse: undefined,
     _headers:
      { accept: 'application/json, text/plain, */*',
        'content-type': 'application/x-www-form-urlencoded',
        authorization: 'Basic c3JpbnVAbWFpbnBvaW50LmRrOnNhaWJhYmE=' },
     _responseType: '',
     _sent: true,
     _lowerCaseResponseHeaders: {},
     _subscriptions: [] },
  response: undefined }

8 个答案:

答案 0 :(得分:4)

这项工作, android \ app \ src \ main \ AndroidManifest.xml

<application
      ......
      android:usesCleartextTraffic="true"
      ......>

答案 1 :(得分:1)

第二个日志指向您的错误。问题是SSL证书。有关解决方案,请参阅此文章:

Trust Anchor not found for Android SSL Connection

答案 2 :(得分:1)

我已使用以下解决方案解决了这个问题。

在Android 9(Pie)中,我们需要将 networkSecurityConfig 设置为AndroidManifast.xml

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

    </application>
</manifest>

现在在 value / xml 文件夹中创建一个名称为 network_security_config.xml 的新xml资源文件。此配置适用于应用程序的基本配置或默认安全配置,并禁用所有明文流量。

<network-security-config>
  <domain-config cleartextTrafficPermitted="false">
    <domain includeSubdomains="true">172.16.33.1</domain>
  </domain-config>
</network-security-config>

有关更多信息,请检查以下链接

https://codelabs.developers.google.com/codelabs/android-network-security-config/#3

https://developer.android.com/training/articles/security-config

https://medium.com/@son.rommer/fix-cleartext-traffic-error-in-android-9-pie-2f4e9e2235e6

答案 3 :(得分:1)

这对我有用

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">



<application android:usesCleartextTraffic="true" tools:targetApi="28" />

答案 4 :(得分:0)

“我是蝙蝠侠”提出了使用Axios的好建议。 Axios有很多更简单,并且发现它们在ios / android上都能保持一致,而不是使用这些奇怪的错误。以下是直接从其github发出POST请求的示例:

    axios.post('/user', {
    firstName: 'Fred',
    lastName: 'Flintstone'
  })
  .then(function (response) {
    console.log(response);
  })
  .catch(function (error) {
    console.log(error);
  });

答案 5 :(得分:0)

你可以在异常回溯中看到java CertPathValidatorException阻止网络请求并检查与android相关的this答案

答案 6 :(得分:0)

由于@mohsenomidi,此错误是由于http请求而发生的。将此行添加到AndroidManifest.xml

中的android:usesCleartextTraffic="true"<application/>
<manifest xmlns:tools="http://schemas.android.com/tools"> .... 
    <application 
        android:usesCleartextTraffic="true" > ... 
    </application> 
</manifest>

https://github.com/facebook/react-native/issues/24627#issuecomment-492159371

答案 7 :(得分:0)

如果您在互联网连接图标附近看到<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="3.0.0-preview8.19405.11" />,则可能是由于Android模拟器中的互联网问题所致。然后,您应该将网络的DNS地址更改为8.8.8.8。您应该看到此答案以了解如何:https://stackoverflow.com/a/49332186/6170191