第一次使用 http.dart 从 c# 模型和 http 调用中学习 flutter
Learning flutter from c# models and http call using http.dart for first time
我正在学习来自 c# 背景和 flutter 的飞镖。我正在学习本教程 https://www.djamware.com/post/5f308ef7185c336b811b362a/flutter-tutorial-consume-crud-rest-api-android-and-ios-apps 但我不知道如何更新
import 'dart:html';
class Players {
final int Id;
final int Type;
final String PlayerLevel;
final String FirstName;
final String Surname;
Players(this.Id, this.Type, this.PlayerLevel, this.FirstName, this.Surname);
factory Players.fromJson(Map<String, dynamic> json) {
return Players(
id: json['id'] as int,
type: json['type'] as String,
PlayerLevel: json['playerlevel'] as String,
FirstName: json['firstname'] as String,
Surname: json['surname'] as String,
);
}
@override
String toString() {
return 'Players{id: $Id, firstName: $FirstName, lastName: $Surname}';
}
}
Flutter http 调用
class ApiService {
final String apiUrl = "https://api-hockeylab.com/api";
final String getAllPlayersEndPoint = "/GetAllPlayers/";
Future<List<Players>> getAllPlayers() async {
final getallPlayersUrl = Uri.parse(apiUrl + getAllPlayersEndPoint);
Response res = await get(getallPlayersUrl);
if (res.statusCode == 200) {
List<dynamic> body = jsonDecode(res.body);
List<Players> players =
body.map((dynamic item) => Players.fromJson(item)).toList();
return players;
} else {
throw "Failed to load cases list";
}
}
}
通常在 c# 中我会做一些简单的事情
public async Task<List<Players>> GetALLPlayers()
{
List<Players> _result = new List<Players>();
EnsureHttpClientCreated();
var uri = new Uri(string.Format(Constants.BaseUrl + Constants.ApiSegmant + Constants.GetAllPlayers, string.Empty));
await AddAuthenicationHeader();
var response = await httpClient.GetAsync(uri);
if (response.IsSuccessStatusCode)
{
var byteArray = await response.Content.ReadAsByteArrayAsync();
var content = Encoding.UTF8.GetString(byteArray, 0, byteArray.Length);
_result = JsonConvert.DeserializeObject<List<Players>>(content);
}
return _result.ToList();
}
我如何在 flutter 中传递默认请求 headers,因为它传递了我的 jwt 身份验证令牌,而且我的 Players 模型在 flutter 中没有正确编译我在上面的 flutter 代码中做错了什么。
private void CreateHttpClient()
{
_httpClientHandler = new HttpClientHandler
{
AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip
};
httpClient = new HttpClient(_httpClientHandler, false)
{
Timeout = _timeout
};
httpClient.DefaultRequestHeaders.UserAgent.ParseAdd(ClientUserAgent);
if (!string.IsNullOrWhiteSpace(Constants.BaseUrl))
{
httpClient.BaseAddress = new Uri(Constants.BaseUrl);
}
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(MediaTypeJson));
}
private void EnsureHttpClientCreated()
{
if (httpClient == null)
{
CreateHttpClient();
}
}
您的工厂构造函数正在尝试使用命名参数调用主构造函数,但它使用的是位置参数。更新了下面的 class(使用 Dart 样式调整)。
class Player {
final int id;
final int type;
final String playerLevel;
final String firstName;
final String surname;
Player(this.id, this.type, this.playerLevel, this.firstName, this.surname);
factory Player.fromJson(Map<String, dynamic> json) {
return Player(
json['id'],
json['type'],
json['playerlevel'],
json['firstname'],
json['surname'],
);
}
@override
String toString() =>
'Players{id: $id, firstName: $firstName, lastName: $surname}';
}
要添加 headers,get
方法采用命名参数 headers
,因此将变为:
await get(url, headers: {'some-header': 'some_value'});
我正在学习来自 c# 背景和 flutter 的飞镖。我正在学习本教程 https://www.djamware.com/post/5f308ef7185c336b811b362a/flutter-tutorial-consume-crud-rest-api-android-and-ios-apps 但我不知道如何更新
import 'dart:html';
class Players {
final int Id;
final int Type;
final String PlayerLevel;
final String FirstName;
final String Surname;
Players(this.Id, this.Type, this.PlayerLevel, this.FirstName, this.Surname);
factory Players.fromJson(Map<String, dynamic> json) {
return Players(
id: json['id'] as int,
type: json['type'] as String,
PlayerLevel: json['playerlevel'] as String,
FirstName: json['firstname'] as String,
Surname: json['surname'] as String,
);
}
@override
String toString() {
return 'Players{id: $Id, firstName: $FirstName, lastName: $Surname}';
}
}
Flutter http 调用
class ApiService {
final String apiUrl = "https://api-hockeylab.com/api";
final String getAllPlayersEndPoint = "/GetAllPlayers/";
Future<List<Players>> getAllPlayers() async {
final getallPlayersUrl = Uri.parse(apiUrl + getAllPlayersEndPoint);
Response res = await get(getallPlayersUrl);
if (res.statusCode == 200) {
List<dynamic> body = jsonDecode(res.body);
List<Players> players =
body.map((dynamic item) => Players.fromJson(item)).toList();
return players;
} else {
throw "Failed to load cases list";
}
}
}
通常在 c# 中我会做一些简单的事情
public async Task<List<Players>> GetALLPlayers()
{
List<Players> _result = new List<Players>();
EnsureHttpClientCreated();
var uri = new Uri(string.Format(Constants.BaseUrl + Constants.ApiSegmant + Constants.GetAllPlayers, string.Empty));
await AddAuthenicationHeader();
var response = await httpClient.GetAsync(uri);
if (response.IsSuccessStatusCode)
{
var byteArray = await response.Content.ReadAsByteArrayAsync();
var content = Encoding.UTF8.GetString(byteArray, 0, byteArray.Length);
_result = JsonConvert.DeserializeObject<List<Players>>(content);
}
return _result.ToList();
}
我如何在 flutter 中传递默认请求 headers,因为它传递了我的 jwt 身份验证令牌,而且我的 Players 模型在 flutter 中没有正确编译我在上面的 flutter 代码中做错了什么。
private void CreateHttpClient()
{
_httpClientHandler = new HttpClientHandler
{
AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip
};
httpClient = new HttpClient(_httpClientHandler, false)
{
Timeout = _timeout
};
httpClient.DefaultRequestHeaders.UserAgent.ParseAdd(ClientUserAgent);
if (!string.IsNullOrWhiteSpace(Constants.BaseUrl))
{
httpClient.BaseAddress = new Uri(Constants.BaseUrl);
}
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(MediaTypeJson));
}
private void EnsureHttpClientCreated()
{
if (httpClient == null)
{
CreateHttpClient();
}
}
您的工厂构造函数正在尝试使用命名参数调用主构造函数,但它使用的是位置参数。更新了下面的 class(使用 Dart 样式调整)。
class Player {
final int id;
final int type;
final String playerLevel;
final String firstName;
final String surname;
Player(this.id, this.type, this.playerLevel, this.firstName, this.surname);
factory Player.fromJson(Map<String, dynamic> json) {
return Player(
json['id'],
json['type'],
json['playerlevel'],
json['firstname'],
json['surname'],
);
}
@override
String toString() =>
'Players{id: $id, firstName: $firstName, lastName: $surname}';
}
要添加 headers,get
方法采用命名参数 headers
,因此将变为:
await get(url, headers: {'some-header': 'some_value'});