如何从 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.
重做应用程序
所以,第一个不太明显的注意事项是:
- Android 模拟器的 flutter 本地主机是 10.0.2.2!哇!
- flutter for iOS 模拟器的本地主机是 locahost,或 127.0.0.1,或
localhost ...我之前读到IP地址在应用程序开发中是首选。
- 真实设备的本地主机要复杂得多。我什至没有打扰,至少现在是这样。
谢谢https://medium.com/@podcoder/connecting-flutter-application-to-localhost-a1022df63130
我不确定这是否是任何 .NET 开发人员首先考虑的事情...对我来说,这是我在失败 3 天后搜索的最后一件事!
我自己在上面代码中的失败,这在我发布的代码中并不明显,是我创建了一个 Controller,而不是 APIController。如上所述,这是我的第一次尝试,开始时我没有注意到其中的区别。
PS:因为一试就爱上了VS Code中的Flutter,现在知道不是功夫不够,而是Java的设计34=] 曾经让我失望!
我正在构建一个带有用户身份验证的 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.
重做应用程序所以,第一个不太明显的注意事项是:
- Android 模拟器的 flutter 本地主机是 10.0.2.2!哇!
- flutter for iOS 模拟器的本地主机是 locahost,或 127.0.0.1,或 localhost ...我之前读到IP地址在应用程序开发中是首选。
- 真实设备的本地主机要复杂得多。我什至没有打扰,至少现在是这样。
谢谢https://medium.com/@podcoder/connecting-flutter-application-to-localhost-a1022df63130
我不确定这是否是任何 .NET 开发人员首先考虑的事情...对我来说,这是我在失败 3 天后搜索的最后一件事!
我自己在上面代码中的失败,这在我发布的代码中并不明显,是我创建了一个 Controller,而不是 APIController。如上所述,这是我的第一次尝试,开始时我没有注意到其中的区别。
PS:因为一试就爱上了VS Code中的Flutter,现在知道不是功夫不够,而是Java的设计34=] 曾经让我失望!