feat: add ApiService for HTTP POST
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
31
lib/services/api_service.dart
Normal file
31
lib/services/api_service.dart
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
import 'dart:convert';
|
||||||
|
import 'package:http/http.dart' as http;
|
||||||
|
|
||||||
|
class ApiService {
|
||||||
|
final http.Client _client;
|
||||||
|
|
||||||
|
ApiService({http.Client? client}) : _client = client ?? http.Client();
|
||||||
|
|
||||||
|
Future<bool> sendScanData(
|
||||||
|
String url, {
|
||||||
|
required String barcode,
|
||||||
|
required String codeType,
|
||||||
|
}) async {
|
||||||
|
try {
|
||||||
|
final response = await _client
|
||||||
|
.post(
|
||||||
|
Uri.parse(url),
|
||||||
|
headers: {'Content-Type': 'application/json'},
|
||||||
|
body: jsonEncode({
|
||||||
|
'barcode': barcode,
|
||||||
|
'code_type': codeType,
|
||||||
|
'timestamp': DateTime.now().toUtc().toIso8601String(),
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
.timeout(const Duration(seconds: 5));
|
||||||
|
return response.statusCode >= 200 && response.statusCode < 300;
|
||||||
|
} catch (_) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
34
test/services/api_service_test.dart
Normal file
34
test/services/api_service_test.dart
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
import 'package:flutter_test/flutter_test.dart';
|
||||||
|
import 'package:http/http.dart' as http;
|
||||||
|
import 'package:http/testing.dart';
|
||||||
|
import 'package:pad_scanner/services/api_service.dart';
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
group('ApiService', () {
|
||||||
|
test('sendScanData returns true on 200', () async {
|
||||||
|
final client = MockClient((request) async {
|
||||||
|
return http.Response('{"status":"ok"}', 200);
|
||||||
|
});
|
||||||
|
final service = ApiService(client: client);
|
||||||
|
final result = await service.sendScanData(
|
||||||
|
'http://localhost:8000/scan',
|
||||||
|
barcode: '123456',
|
||||||
|
codeType: 'CODE128',
|
||||||
|
);
|
||||||
|
expect(result, isTrue);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('sendScanData returns false on error', () async {
|
||||||
|
final client = MockClient((request) async {
|
||||||
|
return http.Response('error', 500);
|
||||||
|
});
|
||||||
|
final service = ApiService(client: client);
|
||||||
|
final result = await service.sendScanData(
|
||||||
|
'http://localhost:8000/scan',
|
||||||
|
barcode: '123456',
|
||||||
|
codeType: 'CODE128',
|
||||||
|
);
|
||||||
|
expect(result, isFalse);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user