flutterfire icon indicating copy to clipboard operation
flutterfire copied to clipboard

[cloud_functions]: No way to define headers like 'Content-Type': 'application/json', to send a POST request

Open uhbsksingh opened this issue 1 month ago • 5 comments

Is there an existing issue for this?

  • [X] I have searched the existing issues.

Which plugins are affected?

Cloud Functions

Which platforms are affected?

iOS

Description

I cannot figure out what is causing the issue. I think it has something to do with sending a POST request with header

'Content-Type': 'application/json'

The cloud function works as expected when sending a POST request from Postman. I sent the parameters in the request body. However, requesting from flutter using await callable.call throws an exception which is not informative. Is there any other way to make such a request?

My log output from

on FirebaseFunctionsException catch (error) {
      print("error.code: ${error.code}");
      print("error.details: ${error.details}");
      print("error.message: ${error.message}");
    }

is

flutter: error.code: internal
flutter: error.details: null
flutter: error.message: INTERNAL

Reproducing the issue

This is my flutter/dart code to call the cloud function.

try {
      final HttpsCallable callable =
          FirebaseFunctions.instanceFor(region: 'us-central1').httpsCallable('addAllocatedPurchase');

      final response = await callable.call(<String, dynamic>{
        'data': {
          'activeCollectionId': activeCollectionId,
          'action': action.toJson(),
          'purchaseBillList': purchaseBillList
              .map((e) => <String, dynamic>{
                    'billID': e.billID,
                    'reference': e.reference,
                    'partner': e.partner.toJson(),
                    'info': {
                      'billDateTime': e.info.billDateTime.toIso8601String(),
                      'dueDateTime': e.info.dueDateTime.toIso8601String(),
                      'dateTime': e.info.dateTime.toIso8601String(),
                      'currency': e.info.currency,
                      'action': e.info.action.toJson(),
                      'paymentTerm': e.info.paymentTerm?.toJson(),
                      'attachments': e.info.attachments,
                      'tags': e.info.tags,
                    },
                    'item': e.item.toJson(),
                    'quantity': e.quantity,
                    'rate': e.rate,
                    'tax': e.tax?.map((k, v) => MapEntry(k, v.toJson())),
                  })
              .toList(),
          'transferEntityDocumentID': transferEntity.documentID,
          'appliedQuantity': appliedQuantity,
          'billItemImageMap': billItemImageMap,
        }
      });
      print(response.data);
    } on FirebaseFunctionsException catch (error) {
      print("error.code: ${error.code}");
      print("error.details: ${error.details}");
      print("error.message: ${error.message}");
    } catch (exception) {
      print('Error: ${exception.toString()}');
      throw exception;
    }

And this is my deployed cloud function

import admin = require("firebase-admin");

interface AllocatedPurchaseDataModel {
    activeCollectionId: string;
    action: string;
    purchaseBillList: AllocatedPurchaseBillDataModel[];
    transferEntityDocumentID:string;
    appliedQuantity: number;
    billItemImageMap: { [key: string]: string[] };
}

export const addAllocatedPurchase =
  onCall<AllocatedPurchaseDataModel, Promise<FunctionResponse>>(
    async ( request: CallableRequest<AllocatedPurchaseDataModel>) => {
      const {
        activeCollectionId,
        action,
        purchaseBillList,
        transferEntityDocumentID,
        appliedQuantity,
        billItemImageMap,
      } = request.data;
      admin.initializeApp();
      const firestore : Firestore= admin.firestore();
      const batch :WriteBatch= firestore.batch();

      try {
        .......
      } catch (exception) {
        throw new HttpsError("unknown", "An error occurred", exception);
      }
    });

Firebase Core version

2.24.2

Flutter Version

3.19.4

Relevant Log Output

No response

Flutter dependencies

Expand Flutter dependencies snippet

Dart SDK 3.3.2
Flutter SDK 3.19.4
easyims_repository 0.0.0

dependencies:
- cache 1.0.0
- cloud_firestore 4.13.6 [cloud_firestore_platform_interface cloud_firestore_web collection firebase_core firebase_core_platform_interface flutter meta]
- cloud_functions 4.7.6 [cloud_functions_platform_interface cloud_functions_web firebase_core firebase_core_platform_interface flutter]
- const_date_time 1.1.0
- equatable 2.0.5 [collection meta]
- excel 4.0.3 [archive xml collection equatable]
- firebase_core 2.32.0 [firebase_core_platform_interface firebase_core_web flutter meta]
- firebase_storage 11.5.6 [firebase_core firebase_core_platform_interface firebase_storage_platform_interface firebase_storage_web flutter]
- flutter 0.0.0 [characters collection material_color_utilities meta vector_math sky_engine]
- json_annotation 4.8.1 [meta]

dev dependencies:
- build_runner 2.4.7 [analyzer args async build build_config build_daemon build_resolvers build_runner_core code_builder collection crypto dart_style frontend_server_client glob graphs http_multi_server io js logging meta mime package_config path pool pub_semver pubspec_parse shelf shelf_web_socket stack_trace stream_transform timing watcher web_socket_channel yaml]
- json_serializable 6.7.1 [analyzer async build build_config collection json_annotation meta path pub_semver pubspec_parse source_gen source_helper]

transitive dependencies:
- _fe_analyzer_shared 67.0.0 [meta]
- _flutterfire_internals 1.3.16 [collection firebase_core firebase_core_platform_interface flutter meta]
- analyzer 6.4.1 [_fe_analyzer_shared collection convert crypto glob meta package_config path pub_semver source_span watcher yaml]
- archive 3.4.9 [crypto path pointycastle]
- args 2.4.2
- async 2.11.0 [collection meta]
- boolean_selector 2.1.1 [source_span string_scanner]
- build 2.4.1 [analyzer async convert crypto glob logging meta package_config path]
- build_config 1.1.1 [checked_yaml json_annotation path pubspec_parse yaml]
- build_daemon 4.0.1 [built_collection built_value crypto http_multi_server logging path pool shelf shelf_web_socket stream_transform watcher web_socket_channel]
- build_resolvers 2.4.2 [analyzer async build collection convert crypto graphs logging package_config path pool pub_semver stream_transform yaml]
- build_runner_core 7.2.11 [async build build_config build_resolvers collection convert crypto glob graphs json_annotation logging meta package_config path pool timing watcher yaml]
- built_collection 5.1.1
- built_value 8.8.1 [built_collection collection fixnum meta]
- characters 1.3.0
- checked_yaml 2.0.3 [json_annotation source_span yaml]
- clock 1.1.1
- cloud_firestore_platform_interface 6.0.10 [_flutterfire_internals collection firebase_core flutter meta plugin_platform_interface]
- cloud_firestore_web 3.8.10 [_flutterfire_internals cloud_firestore_platform_interface collection firebase_core firebase_core_web flutter flutter_web_plugins js]
- cloud_functions_platform_interface 5.5.28 [firebase_core flutter meta plugin_platform_interface]
- cloud_functions_web 4.9.6 [cloud_functions_platform_interface firebase_core firebase_core_web flutter flutter_web_plugins]
- code_builder 4.9.0 [built_collection built_value collection matcher meta]
- collection 1.18.0
- convert 3.1.1 [typed_data]
- crypto 3.0.3 [typed_data]
- dart_style 2.3.4 [analyzer args collection path pub_semver source_span]
- fake_async 1.3.1 [clock collection]
- file 7.0.0 [meta path]
- firebase_core_platform_interface 5.0.0 [collection flutter flutter_test meta plugin_platform_interface]
- firebase_core_web 2.17.0 [firebase_core_platform_interface flutter flutter_web_plugins meta web]
- firebase_storage_platform_interface 5.1.3 [_flutterfire_internals collection firebase_core flutter meta plugin_platform_interface]
- firebase_storage_web 3.6.17 [_flutterfire_internals async firebase_core firebase_core_web firebase_storage_platform_interface flutter flutter_web_plugins http js meta]
- fixnum 1.1.0
- flutter_test 0.0.0 [flutter test_api matcher path fake_async clock stack_trace vector_math leak_tracker_flutter_testing async boolean_selector characters collection leak_tracker leak_tracker_testing material_color_utilities meta source_span stream_channel string_scanner term_glyph vm_service]
- flutter_web_plugins 0.0.0 [flutter characters collection material_color_utilities meta vector_math]
- frontend_server_client 3.2.0 [async path]
- glob 2.1.2 [async collection file path string_scanner]
- graphs 2.3.1 [collection]
- http 1.2.1 [async http_parser meta web]
- http_multi_server 3.2.1 [async]
- http_parser 4.0.2 [collection source_span string_scanner typed_data]
- io 1.0.4 [meta path string_scanner]
- js 0.6.7 [meta]
- leak_tracker 10.0.0 [clock collection meta path vm_service]
- leak_tracker_flutter_testing 2.0.1 [flutter leak_tracker leak_tracker_testing matcher meta]
- leak_tracker_testing 2.0.1 [leak_tracker matcher meta]
- logging 1.2.0
- matcher 0.12.16+1 [async meta stack_trace term_glyph test_api]
- material_color_utilities 0.8.0 [collection]
- meta 1.11.0
- mime 1.0.4
- package_config 2.1.0 [path]
- path 1.9.0
- petitparser 6.0.2 [meta]
- plugin_platform_interface 2.1.7 [meta]
- pointycastle 3.9.0 [collection convert js]
- pool 1.5.1 [async stack_trace]
- pub_semver 2.1.4 [collection meta]
- pubspec_parse 1.2.3 [checked_yaml collection json_annotation pub_semver yaml]
- shelf 1.4.1 [async collection http_parser path stack_trace stream_channel]
- shelf_web_socket 1.0.4 [shelf stream_channel web_socket_channel]
- sky_engine 0.0.99
- source_gen 1.5.0 [analyzer async build dart_style glob path source_span yaml]
- source_helper 1.3.4 [analyzer collection source_gen]
- source_span 1.10.0 [collection path term_glyph]
- stack_trace 1.11.1 [path]
- stream_channel 2.1.2 [async]
- stream_transform 2.1.0
- string_scanner 1.2.0 [source_span]
- term_glyph 1.2.1
- test_api 0.6.1 [async boolean_selector collection meta source_span stack_trace stream_channel string_scanner term_glyph]
- timing 1.0.1 [json_annotation]
- typed_data 1.3.2 [collection]
- vector_math 2.1.4
- vm_service 13.0.0
- watcher 1.1.0 [async path]
- web 0.5.1
- web_socket_channel 2.4.0 [async crypto stream_channel]
- xml 6.5.0 [collection meta petitparser]
- yaml 3.1.2 [collection source_span string_scanner]

Additional context and comments

No response

uhbsksingh avatar Jun 10 '24 12:06 uhbsksingh