当前位置: 首页 > 知识库问答 >
问题:

React Native Android Fetch连接到本地API失败

谢鸿
2023-03-14

我在react原生Android应用程序中使用FetchAPI向本地API发出请求。我通常从react web apps的http://localhost:8163.

我正在调试模式下在物理设备上测试我的应用程序。我在某个地方读到,react native无法像web应用程序一样查询localhost。显然,您必须使用http://10.0.2.2:[PORT\u NUMBER\u HERE]/是的别名`http://127.0.0.1:根据Android仿真器码头的数据,这里有[端口号]。我不确定这是否是我在物理设备上测试时应该做的。

我的获取代码如下所示:

fetchToken() {
    fetch('http://10.0.2.2:8163/extension/auth', {
        method: 'GET',
        headers: {
            'Accept': 'application/json',
            'Content-type': 'application/json'
        }
    })
    .then((response)) => console.log('successful fetchToken response: ', response.json()))
    .catch((error) => console.log('fetchToken error: ', error))
    .done();
}

请求总是挂起一段时间,然后到达catch块,出现无帮助的错误TypeError:networkrequest失败(…) 。检查本地API的日志,他们根本不注册请求。

所以我不知道我是否正确地查询我的本地API来获取我想要的资源,如果我是,我不知道为什么抓取失败。


共有3个答案

傅志用
2023-03-14

就我而言,我试图向http://localhost:3000使用axios,但每次我得到网络错误作为响应。然后我发现我需要向http://10.0.2.2:3000如果是android模拟器。对于iOS模拟器,它可以与http://localhost:3000

使用

http://10.0.2.2:3000

而不是

http://localhost:3000

更好的选择是将计算机的本地服务器端口映射到设备中的同一端口

  1. 请参阅已连接设备的列表。它可以是模拟器或真实设备
$ adb devices                                   

List of devices attached
emulator-5554   device <--- emulator
2681523e        device <-- real device
$ adb -s emulator-5554 reverse tcp:3000 tcp:3000

$ adb -s 2681572e reverse tcp:3000 tcp:3000 

你完蛋了。

艾骏喆
2023-03-14

运行以下命令以访问localhost或127.0.0.1或计算机的ip

adb -s <device_name> reverse tcp:backend_port tcp:backend_port

例子:

adb -s emulator-5554 reverse tcp:3000 tcp:3000

现在,您可以在组件中使用如下所示。

import React from 'react';
import {View,Image,TextInput, TouchableOpacity, StyleSheet, ImageBackground, AsyncStorage} from 'react-native';
import {Text,Button} from 'native-base';
    export class Login extends React.Component{
    constructor(props){
        super(props);
        this.state={username:'',password:''}
      }
      login = () =>{
        fetch('http://localhost:3000/users',{
          method:'POST',
            headers:{
              'Accept':'application/json',
              'Content-Type':'application/json'
            },
            body:JSON.stringify({
              username:this.state.username,
              password:this.state.password
            })
        })
        .then((response)=>response.json())
        .then((res)=>{
          if(res.success===true){
            var username=res.message;
            AsyncStorage.setItem('username',username);
            this.props.navigation.navigate('app');
            alert("Login success");
          } else{
            alert("Invalid Credentials");
          }
        })
        .done();
      }
    render(){
      return (
    <View style={styles.content}>
                <Text style={styles.logo}>- WELCOME -</Text>
                <View>
                  <TextInput underlineColorAndroid='transparent' style={styles.input} placeholder="Username"
                  onChangeText={(username)=>this.setState({username})}
                  value={this.state.username}>
                  </TextInput>
                  <TextInput secureTextEntry={true} underlineColorAndroid='transparent' style={styles.input} placeholder="Password"
                  onChangeText={(password)=>this.setState({password})}
                  value={this.state.password}>
                  </TextInput>
                </View>
                <TouchableOpacity onPress={this.login} style={styles.buttonContainer}>
                  <Text style={styles.buttonText}>LOGIN</Text>
                </TouchableOpacity>
              </View>
    );
    }
    }
    const styles = StyleSheet.create({
      container:{
        flex:1,
      },
      content:{
        opacity:0.9,
        backgroundColor:'white',
        borderWidth:2,
        margin:10,
        alignItems: 'center',
      },
      logo:{
        justifyContent: 'center',
        alignItems: 'center',
        fontSize:45,
        color:'black',
        textShadowColor:'gray',
        textShadowRadius:10
      },
      input:{
        borderRadius:10,
        padding:10,
        color:'black',
        borderWidth:2,
        borderColor:'lightgray',
        width:200,
        margin:5
      },
      buttonContainer:{
        margin:10,
        padding:10,
        justifyContent: 'center',
        alignItems: 'center',
      },
      buttonText:{
        borderRadius:100,
        padding:10,
        backgroundColor:'magenta',
        color:'white',
        textAlign:'center',
        width:100
      }

    });

输出:

巫马磊
2023-03-14

您无法访问本地开发服务器,因为ADB尚未转发该端口。当您运行react native run android时,react native会将端口8081映射到USB上的移动设备。当您断开USB连接时,您将无法再刷新或热重新加载代码。因此,在这种情况下,您可以做两件事,要么像React Native一样映射本地服务器端口,要么使用本地IP地址。

>

这只有在你使用Android6.0时才有效。要使用ADB转发端口,请在终端中运行以下命令:

adb reverse tcp:8163 tcp:8163

这将把您的本地8163端口映射到手机的8163端口。您将能够通过这种方式访问您的开发服务器。

使用本地IP地址

您还可以在React Native development应用程序上使用您的本地IP重新加载它们,而无需USB。摇动您的设备或长按菜单按钮打开开发者菜单。打开Dev Settings,然后点击Debug server host

你应该很乐意接受这个。

 类似资料:
  • 所以我正在开发一个Android应用程序,它必须与我编码的API进行交互。目前我只是在本地运行API。我已经测试了所有的路线,它们都可以工作。 现在我想在我的Android应用程序上向这个API发送请求。为此,我使用一个类,它扩展了来管理每个请求(如果你问的话,我可以给你看代码)。我已经添加了

  • > 我在Linux机器上安装了Spark。版本为spark-1.6.2-bin-hadoop2.6.tgz. 然后使用。/sbin/start-all.sh启动Spark 我尝试在Eclipse中运行javaWordCount.java示例。但总是失败。有人能帮我吗? 例外情况如下:

  • 问题内容: 由于wamp服务器,我试图将我的android应用程序连接到本地主机url,但它不起作用。我的目标是获取json数据并解析这些数据。对于我的测试,我使用的是设备而不是模拟器,并且使用AndroidManifest.xml中的权限: 我的网址看起来像这样: 我试过了 : 但是到目前为止,它从未起作用: 然后我尝试了在互联网上找到的json url测试:http : //headers.j

  • 我试图连接到一个名为的数据库。所有凭据都位于PHP文件名中,格式为 我正试图用这个连接到数据库 我得到这个错误: 注意:第6行的未定义变量:DB_HOST in/home/content/06/8274306/html/beta/mysuperscript.php 注意:未定义变量:第6行 /home/content/06/8274306/html/beta/mysuperscript.phpDB

  • 当我使用此配置(连接到本地DB)时-一切正常: 我唯一更改的是另一台机器的IP,而我总是得到相同的错误: 这是我得到的错误: 最后一个成功发送到服务器的数据包是在0毫秒前。驱动程序没有从服务器接收到任何数据包。在Sun.Reflect.NativeConstructorAccessorImpl.NewInstance0(原生方法)在Sun.Reflect.NativeConstructorAcce

  • 我目前正在做一个小项目,我需要将kafka集群连接到mongodb,以便将发布到kafka主题的消息存储在mongodb数据库中。我目前有一个本地kafka集群,一个sping引导生产者向一个主题发布消息,一个spinger引导消费者在本地使用这些消息。我也在本地安装了mongob指南针……我一直在看教程,我发现我必须使用某种接收器连接器(mongob连接器)来做我想做的事情,但大多数示例都是基于