如何从 Flutter 发出 MVC API 请求

How to make an MVC API request from Flutter

我正在构建一个带有用户身份验证的 Flutter 应用程序。它适用于 Firebase。但是,我想再次对 SQL 服务器数据库进行编码。

我现在正在尝试获取从 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。所以我想我可能会遗漏一些 prerequisites/formats.

有人可以指导我如何完成这项工作吗?

谢谢!

您正在将您的请求定向到端口 0,

我没见过,你确定那个端口真的存在吗?

更典型的端口是 80(默认)、8080...

在这个过程中,我发现了一些(我认为)几乎在引入 Flutter 时就应该很明显的事情(取决于你从哪里读到的!)。好吧,让我成为那些试图让它显而易见的人之一:)

Flutter 喜欢 Firebase。因此,现有的针对 MS SQL Server 爱好者的指导非常少。我真的很难在 firebase 中做 queries/views。所以很自然地,我一直在想如何根据我熟悉的基础 SQL 服务器和 mySQL.

重做应用程序

所以,第一个不太明显的注意事项是:

  1. Android 模拟器的 flutter 本地主机是 10.0.2.2!哇!
  2. flutter for iOS 模拟器的本地主机是 locahost,或 127.0.0.1,或 localhost ...我之前读到IP地址在应用程序开发中是首选。
  3. 真实设备的本地主机要复杂得多。我什至没有打扰,至少现在是这样。

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

我不确定这是否是任何 .NET 开发人员首先考虑的事情...对我来说,这是我在失败 3 天后搜索的最后一件事!

我自己在上面代码中的失败,这在我发布的代码中并不明显,是我创建了一个 Controller,而不是 APIController。如上所述,这是我的第一次尝试,开始时我没有注意到其中的区别。

PS:因为一试就爱上了VS Code中的Flutter,现在知道不是功夫不够,而是Java的设计34=] 曾经让我失望!