我有一個正在建立的應用程序,並且一年內沒有更改登入代碼,更新後我的flutter 登入頁面將請求OPTIONS且go API 伺服器回傳200。以前,伺服器中沒有出現 OPTIONS 日誌。這種情況發生在開發和生產。我的 Linux 用戶端登入正常。
我在這裡進行了 CORS 更改,但沒有效果。 GET 請求工作正常,但從來沒有 POST 請求到達伺服器。
這是我的錯:
ClientException: XMLHttpRequest error., uri=https://api.mydomain.com/login
這是我的伺服器端程式碼。
r := chi.NewRouter() r.Use(middleware.RequestID) r.Use(middleware.Logger) r.Use(middleware.Recoverer) r.Use(middleware.URLFormat) r.Use(render.SetContentType(render.ContentTypeJSON)) r.Use(cors.Handler(cors.Options{ AllowedOrigins: []string{"https://*, http://*"}, AllowedMethods: []string{"GET", "POST", "PUT", "DELETE", "OPTIONS"}, AllowedHeaders: []string{"Accept", "Origin", "Authorization", "Content-Type", "X-CSRF-Token", "X-Requested-With"}, ExposedHeaders: []string{"Link"}, AllowCredentials: false, MaxAge: 300, // Maximum value not ignored by any of major browsers }))
這是我的顫振登入資訊:
Future<bool> login(String email, String password, String fcmToken) async { try { var response = await http.post( Uri.parse("$_baseUrl/login"), headers: <String, String>{ 'Content-Type': 'application/json; charset=UTF-8', }, body: jsonEncode( <String, String>{ 'business_email': email, 'password': password, 'token': fcmToken, }, ), ); if (response.statusCode == 200) { String jwt = response.body; await storage.write(key: 'jwt', value: jwt); return true; } } catch (e) { logger.d(e); return false; } return false; }
我的登入頁面
class Login extends StatefulWidget { const Login({ Key? key, }) : super(key: key); @override State<Login> createState() => _LoginState(); } class _LoginState extends State<Login> { @override void initState() { WidgetsBinding.instance.addPostFrameCallback( (_) => showSnackBar(context), ); super.initState(); } final GlobalKey<FormState> _formKey = GlobalKey(); final FocusNode _focusNodePassword = FocusNode(); final TextEditingController _controllerUserEmail = TextEditingController(); final TextEditingController _controllerPassword = TextEditingController(); bool _obscurePassword = true; bool isLoading = false; String? fcmToken = ''; @override Widget build(BuildContext context) { var model = LoginModel( authenticationService: Provider.of(context, listen: false), ); return Scaffold( body: Form( key: _formKey, child: SingleChildScrollView( padding: const EdgeInsets.all(30.0), child: Column( children: [ const SizedBox( height: 20, ), SizedBox( //height: 20, width: double.infinity, child: Text( 'exactCASE', textAlign: TextAlign.center, style: Theme.of(context).textTheme.headlineLarge, )), const SizedBox(height: 30), isLoading ? const Center(child: CircularProgressIndicator()) : Text( 'Login to your account', style: Theme.of(context).textTheme.labelMedium, ), const SizedBox(height: 20), TextFormField( controller: _controllerUserEmail, keyboardType: TextInputType.name, decoration: InputDecoration( labelText: 'Email', prefixIcon: const Icon(Icons.person_outline), border: OutlineInputBorder( borderRadius: BorderRadius.circular(10), ), enabledBorder: OutlineInputBorder( borderRadius: BorderRadius.circular(10), ), ), onEditingComplete: () => _focusNodePassword.requestFocus(), validator: (String? value) { if (value == null || value.isEmpty) { return "Please enter your email"; } return null; }, ), const SizedBox(height: 10), TextFormField( controller: _controllerPassword, focusNode: _focusNodePassword, obscureText: _obscurePassword, keyboardType: TextInputType.visiblePassword, decoration: InputDecoration( labelText: "Password", prefixIcon: const Icon(Icons.password_outlined), suffixIcon: IconButton( onPressed: () { setState(() { _obscurePassword = !_obscurePassword; }); }, icon: _obscurePassword ? const Icon(Icons.visibility_outlined) : const Icon(Icons.visibility_off_outlined)), border: OutlineInputBorder( borderRadius: BorderRadius.circular(10), ), enabledBorder: OutlineInputBorder( borderRadius: BorderRadius.circular(10), ), ), validator: (String? value) { if (value == null || value.isEmpty) { return "Please enter password."; } return null; }, ), const SizedBox(height: 30), Column( children: [ FilledButton( style: FilledButton.styleFrom( minimumSize: const Size.fromHeight(50), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(20), ), ), onPressed: () { if (_formKey.currentState?.validate() ?? false) { _login(context, model, _controllerUserEmail.text, _controllerPassword.text); } }, child: const Text("Login"), ), ], ), ], ), ), ), ); } @override void dispose() { _focusNodePassword.dispose(); _controllerUserEmail.dispose(); _controllerPassword.dispose(); super.dispose(); } Future<void> _login(BuildContext context, LoginModel model, String email, String password) async { final navigator = Navigator.of(context); if (defaultTargetPlatform != TargetPlatform.linux && defaultTargetPlatform != TargetPlatform.windows) { fcmToken = await FirebaseMessaging.instance.getToken(); } setState( () { isLoading = true; }, ); fcmToken ??= ''; var loginSuccess = await model.login(email, password, fcmToken!); if (loginSuccess) { navigator.pushNamed(RoutePaths.homeTabs); } else { setState( () { isLoading = false; final snackBar = SnackBar( content: const Text('Login Failed!'), action: SnackBarAction( label: 'OK', onPressed: () {}, )); ScaffoldMessenger.of(context).showSnackBar(snackBar); }, ); } } }
根據 的文檔Access-Control-Allow-Origin 來源回應應該是單一URL(即請求者)或單個字元*
。
嘗試改變:
AllowedOrigins: []string{"https://*, http://*"},
至
AllowedOrigins: []string{"*"},
以上是flutter web 登入取得選項但不會發布的詳細內容。更多資訊請關注PHP中文網其他相關文章!