mirror of
https://github.com/inventree/inventree-app.git
synced 2025-04-28 05:26:47 +00:00
API improvements
- Catch more errors - Use username/password data if token has not been received
This commit is contained in:
parent
c64d4c3ccb
commit
4da4731fb2
71
lib/api.dart
71
lib/api.dart
@ -32,6 +32,13 @@ class InvenTreeAPI {
|
|||||||
address = address + '/';
|
address = address + '/';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO - Better URL validation
|
||||||
|
|
||||||
|
/*
|
||||||
|
* - If not a valid URL, return error
|
||||||
|
* - If no port supplied, append a default port
|
||||||
|
*/
|
||||||
|
|
||||||
_base_url = address;
|
_base_url = address;
|
||||||
_username = username;
|
_username = username;
|
||||||
_password = password;
|
_password = password;
|
||||||
@ -40,9 +47,16 @@ class InvenTreeAPI {
|
|||||||
|
|
||||||
print("Connecting to " + address + " -> " + username + ":" + password);
|
print("Connecting to " + address + " -> " + username + ":" + password);
|
||||||
|
|
||||||
await _tryConnection();
|
bool result = false;
|
||||||
|
|
||||||
await _secureToken();
|
result = await _testConnection();
|
||||||
|
|
||||||
|
if (!result) {
|
||||||
|
print("Could not connect to server");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
result = await _getToken();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool _connected = false;
|
bool _connected = false;
|
||||||
@ -70,27 +84,48 @@ class InvenTreeAPI {
|
|||||||
return _token.isNotEmpty;
|
return _token.isNotEmpty;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Request the raw /api/ endpoing to see if there is an InvenTree server listening
|
// Request the raw /api/ endpoint to see if there is an InvenTree server listening
|
||||||
void _tryConnection() async {
|
Future<bool> _testConnection() async {
|
||||||
|
|
||||||
print("Testing connection to server");
|
print("Testing connection to server");
|
||||||
|
|
||||||
final response = await get("").then((http.Response response) {
|
final response = await get("").then((http.Response response) {
|
||||||
print("response!");
|
|
||||||
print(response.body);
|
final data = json.decode(response.body);
|
||||||
|
|
||||||
|
// We expect certain response from the server
|
||||||
|
if (!data.containsKey("sedrver") || !data.containsKey("version")) {
|
||||||
|
print("Incorrect keys in server response");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
print("Server: " + data["server"]);
|
||||||
|
print("Version: " + data["version"]);
|
||||||
|
|
||||||
}).catchError((error) {
|
}).catchError((error) {
|
||||||
print("Error trying connection");
|
print("Error trying connection");
|
||||||
|
print(error);
|
||||||
|
|
||||||
|
return;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Here we have received a response object which is valid
|
||||||
|
|
||||||
// TODO - Add timeout handler
|
// TODO - Add timeout handler
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Request an API token from the server.
|
// Request an API token from the server.
|
||||||
// A valid username/password combination must be provided
|
// A valid username/password combination must be provided
|
||||||
void _secureToken() async {
|
Future<bool> _getToken() async {
|
||||||
|
|
||||||
|
print("Requesting API token from server");
|
||||||
|
|
||||||
if (_token.isNotEmpty) {
|
if (_token.isNotEmpty) {
|
||||||
print("Discarding old token - " + _token);
|
print("Discarding old token - " + _token);
|
||||||
}
|
}
|
||||||
|
|
||||||
_token = "";
|
_token = "";
|
||||||
|
|
||||||
var response = post(_URL_GET_TOKEN,
|
var response = post(_URL_GET_TOKEN,
|
||||||
@ -102,16 +137,25 @@ class InvenTreeAPI {
|
|||||||
response.then((http.Response response) {
|
response.then((http.Response response) {
|
||||||
if (response.statusCode != 200) {
|
if (response.statusCode != 200) {
|
||||||
print("Invalid status code: " + response.statusCode.toString());
|
print("Invalid status code: " + response.statusCode.toString());
|
||||||
|
return false;
|
||||||
} else {
|
} else {
|
||||||
var _json = json.decode(response.body);
|
var data = json.decode(response.body);
|
||||||
|
|
||||||
if (_json["token"] != null) {
|
if (!data.containsKey("token")) {
|
||||||
_token = _json["token"];
|
print("No token provided in response");
|
||||||
print("Received token: " + _token);
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Save the received token
|
||||||
|
_token = data["token"];
|
||||||
|
print("Received token: " + _token);
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
}).catchError((error) {
|
}).catchError((error) {
|
||||||
print("Error retrieving token");
|
print("Error retrieving token:");
|
||||||
|
print(error);
|
||||||
|
return false;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -174,8 +218,11 @@ class InvenTreeAPI {
|
|||||||
|
|
||||||
var headers = Map<String, String>();
|
var headers = Map<String, String>();
|
||||||
|
|
||||||
|
// Preference authentication token if available
|
||||||
if (_token.isNotEmpty) {
|
if (_token.isNotEmpty) {
|
||||||
headers[HttpHeaders.authorizationHeader] = "Token " + _token;
|
headers[HttpHeaders.authorizationHeader] = "Token " + _token;
|
||||||
|
} else {
|
||||||
|
headers[HttpHeaders.authorizationHeader] = 'Basic ' + base64Encode(utf8.encode('$_username:$_password'));
|
||||||
}
|
}
|
||||||
|
|
||||||
return headers;
|
return headers;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user