Flutter автоматически печатает любой HTTP-запрос

Короче я хочу print в моей консоли любой запрос Http, который запрашивает мое приложение, не помещая print command после каждого звонка, например:

скажем, у меня есть служба с http.Client.get и у меня есть еще 100 таких сервисов.

сейчас я жду ответа в каждой службе, а затем распечатываю его вот так print('response is ' + response.body);.

то, что я хочу добиться, это то, что будет автоматически распечатано для меня без написания print 100 раз после каждого моего запроса, порекомендуете ли вы следовать любому хорошему архитектору?

надеюсь, я хорошо прояснил идею.

4 ответа

Решение

ну вот мой последний подход к этому. ибо каждый стремится сделать это с помощью абстракции или, скажем, упаковки; Первое, что я сделал, это любезно, если я обернул класс HTTP и везде использовал мой класс вместо исходного класса Http.

поэтому код будет таким

      class MHttpClient {
  final http.Client client;
  final SharedPreferences sharedPreferences;
  MHttpClient(this.client, this.sharedPreferences);

  Future<http.Response> get(
      {String path = "", Map<String, String> extraHeders}) async {
    printWrapped('get Path: $path');
    final response = await client.get(
      Uri.parse(getBaseURL() + Version + path),
      headers: getHeaders(extraHeaders: extraHeders),
    );
    printWrapped("get response : \n" + utf8.decode(response.bodyBytes));
    return response;
  }

  Future<http.Response> post(
      {String body = "",
      String path = "",
      Map<String, String> extraHeders}) async {
    printWrapped('sended body: \n');
    printWrapped(' ${json.decode(body)}');
    final response = await client.post(
      Uri.parse(getBaseURL() + Version + path),
      body: body,
      headers: getHeaders(extraHeaders: extraHeders),
    );
    printWrapped("post response : \n" + utf8.decode(response.bodyBytes));
    return response;
  }

  Future<http.Response> put({String body = "", String path = ""}) async {
    printWrapped('put body: \n ${json.decode(body)}');
    final response = await client.put(
      Uri.parse(getBaseURL() + Version + path),
      body: body,
      headers: getHeaders(),
    );
    printWrapped(utf8.decode(response.bodyBytes));
    return response;
  }

  Future<http.Response> putImage({File image, String path = ""}) async {
    printWrapped('Image Path: $path');
    final response = await http.put(
      Uri.parse(path),
      headers: getImageHeaders(),
      body: image.readAsBytesSync(),
    );
    return response;
  }

  String getBaseURL() {
    if (Foundation.kDebugMode)
      return BaseURLSTAGING;
    else
      return BaseURL;
  }

  String getApiKey() {
    if (Foundation.kDebugMode)
      return ApiKeyStaging;
    else
      return ApiKey;
  }

  String getToken() {
    String cashedToken = sharedPreferences.getString(CACHED_TOKEN);
    if (cashedToken == null) cashedToken = "";
    return cashedToken;
  }

  Map<String, String> getHeaders({Map extraHeaders}) {
    Map<String, String> headers = {
      'Content-Type': 'application/json; charset=UTF-8',
      'x-api-key': getApiKey(),
      HttpHeaders.authorizationHeader: 'Bearer ' + getToken(),
    };
    if (extraHeaders == null || extraHeaders.isEmpty)
      return headers;
    else {
      headers.addAll(extraHeaders);
      return headers;
    }
  }

  Map<String, String> getImageHeaders() {
    return <String, String>{'Content-Type': 'image/png'};
  }

  void printWrapped(String text) {
    final pattern = RegExp('.{400}'); // 800 is the size of each chunk
    pattern.allMatches(text).forEach((match) => developer.log(match.group(0)));
  }
}

а затем я использовал MHttpClient еще где

      final MHttpClient client;
final response = await client.get(path: path);

и в этом случае мне не нужно беспокоиться ни о чем другом, и когда вам нужно изменить что-то одно, вы измените его только в одном месте, и все останется таким же и будет работать так, как вы хотите, без торможения изменений, которые вам нужно делать все, что вы просили.

Вы можете попробовать пакет http_interceptor, который позволяет вам перехватывать все запросы и ответы от ваших HTTP-запросов (изменять заголовки, параметры и т. Д.)

Я добился этого, сохранив все то же самое, но по-другому, сначала создайте свой собственный класс http, который будет выглядеть так:

    class MHttpClient {
  final http.Client client;
  MHttpClient(this.client);

  Future<http.Response> get({String path = ""}) async {
    final response =
        await client.get(BaseURL + path, headers: <String, String>{
      'Content-Type': 'application/json; charset=UTF-8',
      'x-api-key': ApiKey,
    });

    print('statusCode : ' + response.statusCode.toString());

    if (response.statusCode == 200) {
      print('response body : ${response.body}');
      try {
        json.decode(response.body);
        print('trying to decode  Respose Body result is : success');
      } catch (Ex) {
        print("Exepition with json decode : $Ex");
      }
    }
    return response;
  }
}

а затем используйте свой собственный класс как обычный http-класс

final MHttpClient client;
client.get(path: basicInfoPath);
      If you add LogInterceptor, Request and Response URLs and request body are printed. Try ...

final logInterceptor = LogInterceptor(
        requestBody: true,
        responseBody: true,
        error: false,
        requestHeader: true,
        responseHeader: true);

..interceptors.add(logInterceptor)
Другие вопросы по тегам