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)