我尝试在React Native中向远程服务器发出请求,但总是得到TypeError: Network request failed
;我尝试了不同的URL,发现如果我向http://rap2api.taobao.org/app/mock/3008/GET/api/creations
之类的某个http网址发出请求,它总是失败;
如果我向https://facebook.github.io/react-native/movies.json
之类的某个https网址发出请求,它会起作用;
如果我向http://localhost:3002/list
这样的http localhost URL发出请求,它也可以。
componentDidMount() {
console.log("_fetchData");
this._fetchData()
}
_fetchData = () => {
fetch('http://rap2api.taobao.org/app/mock/3008/GET/api/creations')
.then((response) => response.json())
.then((responseJson) => {
console.log('responseJson',responseJson)
})
.catch((error) => {
console.error(error);
});
}
我在线检查了很多参考文献,并猜测它是关于Info.plist doc中的设置。我试着做一些修改,如:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>localhost</key>
<dict>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
</dict>
<key>rap2api.taobao.org</key>
<dict>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSIncludesSubdomains</key>
<true/>
</dict>
</dict>
</dict>
或
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
但是,它们都不起作用,在向http URL请求时仍然会出现相同的错误。我确信API很好,因为我在Web应用程序上尝试并成功获得响应。有什么问题?
答案 0 :(得分:2)
来自https://facebook.github.io/react-native/docs/network.html:
默认情况下,iOS会阻止任何未使用SSL加密的请求。如果需要从明文URL(以http开头的URL)获取,则首先需要添加App Transport Security异常。如果您提前知道需要访问哪些域,则为这些域添加例外更安全;如果直到运行时才知道域,则可以完全禁用ATS。但请注意,从2017年1月起,Apple的App Store审核将需要合理的理由来禁用ATS。有关详细信息,请参阅Apple的文档。
从iOS 10.0及更高版本以及macOS 10.12及更高版本开始,支持以下子项:
NSAllowsArbitraryLoadsForMedia
NSAllowsArbitraryLoadsInWebContent
NSRequiresCertificateTransparency
NSAllowsLocalNetworking
注意:有两个“允许任意加载”键,它们使用不同的命名模式。注意使用...... ForMedia和...... InWebContent正确。
您可以尝试显式设置NSAllowsArbitraryLoadsForMedia和NSAllowsArbitraryLoadsInWebContent。
还要确保在Xcode中清理和重建项目,以便更新的plist设置包含在您的包中。