我是后端开发的新手。我尝试开发一个烧瓶休息的api。我遵循了文档并制作了建议的最小 api,即返回一个 jsonized 字典。使用邮递员、curl 和浏览器,没问题,api 正在运行并响应我的请求。
但是,从我的反应本机应用程序中,我总是收到Netwrok错误。
我尝试了很多东西:
- 烧瓶的多个 IP 地址 serveur
- 使用 axios的不同方式
- 不同的操作系统:win10、ubuntu
- 不同的端点:/、/api、/test
- 编写 API 的不同方式(flask-restful 类、flask 应用程序函数......
- 来自网络文档的操纵:我的设备的开发模式,Chrome 开发工具(端口转发(
- 我要求一个 React 本机开发人员检查我的客户端代码,据他说没有错,
精度 :
- Python 代码在 Conda 虚拟 env
下运行 appli 在 Node JS 和 Expo 下运行
- 我的应用程序和我的 API 的容器文件夹处于同一级别
- 烧瓶服务器没有响应 404 或其他什么,它根本没有响应,React Native 中返回的错误是网络错误
- 取决于 URL, 网络错误立即发生或在 2 分钟延迟后发生
- flask 在由 Postman、curl、Chrome 调用时显示请求和状态,但当我从 React 本机应用程序按下按钮时没有反应
这是我的python代码之一:
from flask import (Flask, jsonify)
# from flask_restful import Resource, Api
from flask_cors import CORS, cross_origin
app = Flask(__name__)
CORS(app)
@app.route("/api", methods=["GET"])
def get():
return jsonify(hello='bouh !')
if __name__ == '__main__':
app.run(host="0.0.0.0", port=5000, debug=True)
这是客户端代码:
import React, {Component} from 'react';
import { View, Button } from 'react-native';
import axios from 'axios';
import { sharedStyles } from '../../SHARED/_shared';
var url = "http://192.168.1.16:5000/api";
export default class PrevCommune extends Component {
constructor(props){
super(props);
this.navigation=this.props.navigation;
};
getAxios=()=>{
axios.get(`${url}`).then((response)=>{
console.log("succes axios :",response);
}).catch((error)=>{
console.log("fail axios :", error);
});
};
getFetch=()=>{
fetch(url).then((response)=>{
console.log("succes fetch :",response)
}).catch((error)=>{
console.log("fail fetch :",error)
})
}
render(){
return (
<View style={sharedStyles.mainContainer}>
<Button onPress={()=>this.getAxios()} title={"get axios"}></Button>
<Button onPress={()=>this.getFetch()} title={"get fetch"}></Button>
</View>
);
};
};
以及请求返回的行:
fail axios : [Error: Network Error]
fail fetch : [TypeError: Network request failed]
我在烧瓶 api 上看到了很多 tutos、视频、文章,但我没有找到我错的地方。如果您有任何想法,请告诉我!我认为客户端和服务器代码都可以,问题似乎是我的请求被某些东西阻止了。
已解决:问题是我的防火墙...谢谢里卡多的 CORS 文档 =(
对我有用的是在 react native 的 api 调用中将 localhost 的 IP 地址更改为我的网络 IP,然后使用以下命令启动烧瓶应用程序。
flask run --host=0.0.0.0