0

简而言之,我想print在我的控制台中添加我的应用程序请求的任何 Http 请求,而不是print command在每次调用之后放置,例如:

假设我有服务,http.Client.get我还有另外 100 个这样的服务。

我现在正在做的是等待每个服务的响应,然后像这样打印它 print('response is ' + response.body);

我想要实现的是,print在我提出每个请求后,它会自动为我打印出来,而无需我写 100 次,你会推荐任何好的架构师吗?

希望我能很好地清除这个想法。

4

3 回答 3

0

好吧,这是我最后的方法。因为每个人都在寻求用抽象来制作它,或者说是包装;首先,如果包装 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);

在这种情况下,我不必担心其他任何事情,当您需要更改一件事时,您只需在一个地方进行更改,并且每件事都将保持不变并按您的意愿工作,而无需进行制动更改做你要求的一切。

于 2021-05-09T08:23:20.220 回答
0

您可以尝试使用http_interceptor包,它允许您从 http 请求中捕获所有请求和响应(更改标头、参数等。)

于 2020-05-27T11:21:11.000 回答
0
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)
于 2021-05-08T15:14:25.807 回答