Я расширяю класс http BaseClient во Flutter, чтобы добавить общие заголовки для всех вызовов API. Вот мой класс:
import 'dart:convert';
import 'package:http/http.dart';
class MyApiClient extends BaseClient {
final Map<String, String> defaultHeaders;
final Client _client = Client();
MyApiClient({this.defaultHeaders = const {}});
@override
Future<StreamedResponse> send(BaseRequest request) {
print('base request is****$request');
return _client.send(request);
}
@override
Future<Response> get(url, {Map<String, String> headers}) {
if(headers != null)
headers.addAll(defaultHeaders);
for (var value in defaultHeaders.values) print('Default headers are $value');
return _client.get(url, headers: headers);
}
@override
Future<Response> post(url, {Map<String, String> headers, body, Encoding encoding}) {
headers.addAll(defaultHeaders);
return _client.post(url, headers: headers);
}
@override
Future<Response> patch(url, {Map<String, String> headers, body, Encoding encoding}) {
headers.addAll(defaultHeaders);
return _client.patch(url, headers: headers);
}
@override
Future<Response> put(url,
{Map<String, String> headers, body, Encoding encoding}) {
headers.addAll(defaultHeaders);
return _client.put(url,
headers: headers, body: body);
}
@override
Future<Response> head(url, {Map<String, String> headers}) {
headers.addAll(defaultHeaders);
return _client.head(url, headers: headers);
}
@override
Future<Response> delete(url, {Map<String, String> headers}) {
headers.addAll(defaultHeaders);
return _client.delete(url, headers: headers);
}
}
В appConstants.dart
я создаю экземпляр MyApiClient
и инициализирую его после успешного входа в систему. Поскольку я хочу передать токен в заголовках всех вызовов API и получаю токен только после успешного входа в систему.
appConstants.dart
MyApiClient myApiClient;
void initializeMyApiClient(String token) {
Map<String, String> headers = {"Authorization" : "Bearer $token"};
myApiClient= new MyApiClient(defaultHeaders: headers);
}
Я вызываю initializeMyApiClient('$token')
сразу после успешного входа. И затем, когда я вызываю другой API с помощью myApiClient, я получаю внутреннюю ошибку сервера 500:
final response = await myApiClient.get("$baseUrl/api/info");
, тогда как когда я использую http-клиент напрямую, я получаю ответ об успешном выполнении.
Что я делаю не так? Пожалуйста, помогите.
import 'dart:convert';
import 'package:http/http.dart' show Client;
Client client = Client();
Map<String, String> headers = {"Authorization" : "Bearer $token"};
final response = await client.get("$baseUrl/api/info", headers: headers);