Flutter 2.10.5
Tools • Dart 2.16.2 • DevTools 2.9.2
バックエンド
Laravel Framework 8.83.11
PHP 8.0.17
Flutterのchopperを使用してpostリクエストをしたいです。
パラメーターにList<APICustomerOrderItem> customer_order_items
というリストがあるのですが、バックエンド側ではただのString型のInstance of 'APICustomerOrderItem'
になってしまいます。
FlutterでパラメーターにListが含まれている場合どのように値を渡したら良いでしょうか?
よろしくお願いします。
Requestログ
=========HTTP Request logging========= baseUrl: http://localhost/api url: /customer_orders/create parameter: {customer_name: 〇〇, kana: 〇〇, send_id: 2, postal_code: null, address: null, address_second: null, phone: 〇〇, shop: 118, staff: 1, customer_order_items: [Instance of 'APICustomerOrderItem']} method: POST headers: {Authorization: 〇〇} body: null multipart: false parts: [] ======================================
customer_order_service.dart
import 'package:chopper/chopper.dart'; import '../model_response.dart'; import '../../config/settings.dart'; import 'customer_order_model.dart'; import 'customer_order_model_converter.dart'; part 'customer_order_service.chopper.dart'; @ChopperApi() abstract class CustomerOrderService extends ChopperService { @Post(path: '/api/customer_orders/create') Future<Response<Result<APICustomerOrderQuery>>> queryCustomerOrder( @QueryMap() Map<String, dynamic> params, ); static CustomerOrderService create(String apiToken) { final client = ChopperClient( baseUrl: Settings.apiUrl, interceptors: [ HttpLoggingInterceptor(), (Request request) async { return applyHeader(request, 'Authorization', 'Bearer $apiToken'); }, (Request request) async { print(""" =========HTTP Request logging========= baseUrl: ${request.baseUrl} url: ${request.url} parameter: ${request.parameters} method: ${request.method} headers: ${request.headers} body: ${request.body} multipart: ${request.multipart} parts: ${request.parts} ====================================== """); return request; }, (Response response) async { print(""" =========HTTP Response logging========= url: ${response.base.request!.url} status: ${response.statusCode} headers: ${response.headers} body: ${response.body} ====================================== """); return response; }, ], converter: CustomerOrderModelConverter(), errorConverter: const JsonConverter(), services: [ _$CustomerOrderService(), ], ); return _$CustomerOrderService(client); } }
customer_order_model_converter.dart
import 'dart:convert'; import 'package:chopper/chopper.dart'; import '../model_response.dart'; import 'customer_order_model.dart'; class CustomerOrderModelConverter implements Converter { @override Request convertRequest(Request request) { print('request: ' + request.toString()); final req = applyHeader( request, contentTypeKey, jsonHeaders, override: false, ); return encodeJson(req); } Request encodeJson(Request request) { final contentType = request.headers[contentTypeKey]; if (contentType != null && contentType.contains(jsonHeaders)) { print('request.body: ' + request.body.toString()); return request.copyWith(body: json.encode(request.body)); } return request; } Response<BodyType> decodeJson<BodyType, InnerType>(Response response) { final contentType = response.headers[contentTypeKey]; var body = response.body; // print(contentType); if (contentType != null && contentType.contains(jsonHeaders)) { body = utf8.decode(response.bodyBytes); } // print('body:' + body.toString()); try { final mapData = json.decode(body); if (mapData['status'] != null) { return response.copyWith<BodyType>( body: Error(Exception(mapData['status'])) as BodyType); } print('mapData: ' + mapData.toString()); final apiQuery = APICustomerOrderQuery.fromJson(mapData); print('apiQuery:' + apiQuery.toString()); return response.copyWith<BodyType>(body: Success(apiQuery) as BodyType); } catch (e) { chopperLogger.warning(e); return response.copyWith<BodyType>( body: Error(e as Exception) as BodyType); } } @override Response<BodyType> convertResponse<BodyType, InnerType>(Response response) { return decodeJson<BodyType, InnerType>(response); } }
customer_order_model.dart
import 'package:json_annotation/json_annotation.dart'; part 'customer_order_model.g.dart'; @JsonSerializable() class APICustomerOrderQuery { factory APICustomerOrderQuery.fromJson(Map<String, dynamic> json) => _$APICustomerOrderQueryFromJson(json); Map<String, dynamic> toJson() => _$APICustomerOrderQueryToJson(this); APICustomerOrder customer_order; List<APICustomerOrderItem> customer_order_items; int status_code; String message; APICustomerOrderQuery({ required this.customer_order, required this.customer_order_items, required this.status_code, required this.message, }); } @JsonSerializable() class APICustomerOrder { factory APICustomerOrder.fromJson(Map<String, dynamic> json) => _$APICustomerOrderFromJson(json); Map<String, dynamic> toJson() => _$APICustomerOrderToJson(this); int id; int status; String customer_name; String kana; int send_id; String postal_code; String address; String address_second; String phone; int payment; DateTime deadline; int shop; int staff; String memo; DateTime created_at; DateTime updated_at; APICustomerOrder({ required this.id, required this.status, required this.customer_name, required this.kana, required this.send_id, required this.postal_code, required this.address, required this.address_second, required this.phone, required this.payment, required this.deadline, required this.shop, required this.staff, required this.memo, required this.created_at, required this.updated_at, }); } @JsonSerializable() class APICustomerOrderItem { factory APICustomerOrderItem.fromJson(Map<String, dynamic> json) => _$APICustomerOrderItemFromJson(json); Map<String, dynamic> toJson() => _$APICustomerOrderItemToJson(this); int product_id; int item; int quantity; APICustomerOrderItem({ required this.product_id, required this.item, required this.quantity, }); }
まだ回答がついていません
会員登録して回答してみよう