Warm tip: This article is reproduced from serverfault.com, please click

其他-如何从Flutter发出MVC API请求

(其他 - How to make an MVC API request from Flutter)

发布于 2020-12-01 06:44:49

我正在使用用户身份验证构建Flutter应用程序。它与firebase一起正常工作。但是,我想再次对它编码SQL Server数据库。

我现在正想从MVC应用程序返回用户令牌。这是我的控制器中的代码:

Public Function AuthenticateUsers(ByVal APIKey As String, ByVal Password As String, ByVal ReturnSecureToken As Boolean) As JsonResult

        Dim Users As Object

        If String.IsNullOrEmpty(APIKey) Or String.IsNullOrEmpty(Password) Then
            Users = "missing parameters"
        Else
            If APIKey = "mambo" AndAlso Password = "mambo@email.com" Then
                Users = GetUsers()
            Else
                Users = "Invalid credentials"
            End If
        End If

        Return Json(Users, JsonRequestBehavior.AllowGet)

    End Function

    Private Function GetUsers() As List(Of UserModel)

        Dim usersList = New List(Of UserModel) From {
            New UserModel With {
                .idToken = 200,
                .localId = "localId",
                .expiresIn = "3600"
            }
        }

        Return usersList

    End Function

控制器的结果

这是负责Flutter应用中身份验证的代码部分:

  Future<void> _authenticate(
      String email, String password, String urlSegment) async {
    // final url =
    //     'https://www.googleapis.com/identitytoolkit/v3/relyingparty/$urlSegment?key=LONGKEY';

    final url = 'https://localhost:12345/Member/AutheticateUsers';
    try {
      final response = await http.post(
        url,
        body: json.encode(
          {
            'APIKey': email.trim(),
            'Password': password.trim(),
            'ReturnSecureToken': true,
          },
        ),
      );
      final responseData = json.decode(response.body);
      if (responseData['error'] != null) {
        throw HttpException(responseData['error']['message']);
      }
      _token = responseData['idToken'];
      _userId = responseData['localId'];
      _expiryDate = DateTime.now().add(
        Duration(
          seconds: int.parse(
            responseData['expiresIn'],
          ),
        ),
      );
      _autoLogout();
      notifyListeners();
      final prefs = await SharedPreferences.getInstance();
      final userData = json.encode(
        {
          'token': _token,
          'userId': _userId,
          'expiryDate': _expiryDate.toIso8601String(),
        },
      );
      prefs.setString('userData', userData);
    } catch (error) {
      print(error);
      throw error;
    }
   }

我已经注释掉了可以成功验证Firebase并重写URL以重定向到我的MVC应用程序的那行。

所以现在的问题是我收到请求被拒绝的错误。这是我第一次尝试让外部应用程序调用API。所以我想我可能会缺少一些先决条件/格式。

有人可以指导我如何进行这项工作。

谢谢!

Questioner
Hannington Mambo
Viewed
0
21.1k 2020-12-14 17:20:06

在这个过程中,我发现了一些(我认为)几乎在引入抖动时就显而易见的事情(取决于你从何处读取!)。好吧,让我成为那些想让它变得显而易见的人之一:)

Flutter Flutter 爱火力。因此,对于MS SQL Server爱好者来说,现有的指导很少。我真的很难在firebase中进行查询/查看。因此,很自然地,我一直想知道如何才能以我熟悉的理由SQL Server和mySQL重做该应用程序。

因此,第一个不太明显的注释是:

  1. Android模拟器中flutter的localhost是10.0.2.2!哇!
  2. 对于iOS模拟器,在flutter中的localhost是locahost或127.0.0.1或localhost ...我早些时候读过,IP地址是应用程序开发中的首选。
  3. 真实设备的本地主机要复杂得多。至少到目前为止,我什至没有打扰。

谢谢https://medium.com/@podcoder/connecting-flutter-application-to-localhost-a1022df63130

我不确定这是否是任何.NET开发人员都会考虑的第一件事...对我来说,这是三天失败后我搜索的最后一件事!

我在上面的代码中遇到的我自己的失败(在我发布的代码中不会很明显)是我创建了一个Controller,而不是APIController。如前所述,这是我的第一项努力,当我开始这样做时,我没有注意到其中的区别。

PS:因为在尝试它的那一刻我就爱上了VS Code中的Flutter,所以我现在知道这并不是不费吹灰之力,而是曾经让我失望的Android中的Java设计!