第一次使用 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'});