使用Dart向Flask后端发送POST请求时仅返回OPTIONS 200问题
问题解决:Flutter发送POST请求仅触发Flask的OPTIONS请求
核心原因
浏览器(或Flutter Web环境下的HTTP客户端)会发送OPTIONS预飞行请求验证跨域权限,你的Flask后端未配置CORS(跨域资源共享)支持,导致预请求通过后,实际POST请求未被正确处理。而curl直接发送POST,不会触发预请求,因此能正常工作。
解决方案
1. 给Flask添加CORS支持
首先安装flask-cors包:
pip install flask-cors
然后在Flask应用中配置CORS,有两种方式:
- 全局配置(开发环境推荐):允许所有域名的跨域请求
from flask import Flask from flask_cors import CORS from flask_restful import Api, Resource app = Flask(__name__) CORS(app) # 全局开启CORS api = Api(app) # 你的RegisterResource类及其他代码保持不变
- 针对单个路由配置:仅允许特定域名或路由的跨域请求
from flask_cors import cross_origin from flask_restful import Resource class RegisterResource(Resource): @cross_origin() # 给POST方法添加CORS支持 def post(self): # 原POST方法代码不变 arguments = reqparse.RequestParser() arguments.add_argument('email', type=str, required=True, help="Email is required") arguments.add_argument('password', type=str, required=True, help="Password is required") user_data = arguments.parse_args() if User.find_user(user_data['email']): return {"error": "User already exists"}, 409 user = User(**user_data) user.save_user() return {"message": "User created successfully"}, 201
2. Flutter端调试优化
在createUser方法中添加日志,方便排查后续问题:
import 'dart:convert'; import 'package:http/http.dart' as http; void createUser({required String email, required String password}) async{ final Map<String, String> headers = {'Content-Type': 'application/json'}; Map<String, String> data = { "email": email, "password": password, }; try { final response = await http.post(Uri.parse("http://localhost:5000/register"), headers: headers, body: json.encode(data)); // 添加日志打印 print('请求状态码: ${response.statusCode}'); print('响应内容: ${response.body}'); } on Exception catch (e) { print('请求异常: $e'); rethrow; } }
配置完成后重启Flask服务,再调用Flutter的createUser方法,即可触发预期的POST请求。
内容的提问来源于stack exchange,提问作者Rafael_O
相关产品推荐
相关产品推荐

