Maison > développement back-end > Golang > La connexion Web Flutter obtient des options mais ne sera pas publiée

La connexion Web Flutter obtient des options mais ne sera pas publiée

王林
Libérer: 2024-02-05 23:39:12
avant
807 Les gens l'ont consulté

flutter web 登录获得选项但不会发布

Contenu de la question

J'ai une application que je suis en train de créer et je n'ai pas changé le code de connexion depuis un an, après la mise à jour de ma page de connexion Flutter, elle demandera des OPTIONS et le serveur API go renvoie 200. Auparavant, le journal OPTIONS n'apparaissait pas sur le serveur. Cela se produit lors du développement et de la production. Mon client Linux se connecte correctement.

J'ai apporté des modifications CORS ici mais cela n'a eu aucun effet. Les requêtes GET fonctionnent correctement, mais aucune requête POST n'atteint jamais le serveur.

C'est mon erreur :

ClientException: XMLHttpRequest error., uri=https://api.mydomain.com/login
Copier après la connexion

Ceci est mon code côté serveur.

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
}))
Copier après la connexion

Voici mes informations de connexion Flutter :

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;
}
Copier après la connexion

Ma page de connexion

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);
        },
      );
    }
  }
}
Copier après la connexion


Réponse correcte


Selon la documentation d'Access-Control-Allow-Origin, la réponse d'origine doit être soit une seule URL (c'est-à-dire le demandeur), soit un seul caractère . *

Essayez un changement :

AllowedOrigins:   []string{"https://*, http://*"},
Copier après la connexion

à

AllowedOrigins:   []string{"*"},
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal