简体   繁体   中英

Cast Error during HTTP Post Request to Google Route API,

This is the first time I am trying to use an HTTP Rest API with Post request, I am trying to use google Route API to compute direction, I follow the body from the google documentation however I keep getting this error _CastError

Exception has occurred. _CastError (type '_Map<String, Map<String, Map<String, double>>>' is not a subtype of type 'String' in type cast)

This is the first time I am trying a post request so I have no idea what is wrong here' the code I use

import 'dart:async';
import 'dart:ffi';

import 'package:http/http.dart' as http;
import 'package:flutter/material.dart';
import 'package:flutter_polyline_points/flutter_polyline_points.dart';
import 'dart:convert' as convert;

class RouteAPI {
  final String key = 'API_KEY_HERE';
  Future<Void> getRoute() async {
    final String Url =
        'https://routes.googleapis.com/directions/v2:computeRoutes?KEY=$key';
    var response = await http.post(Uri.parse(Url), body: {
      "origin": {
        "location": {
          "latLng": {
            "latitude": -6.2425120808113315,
            "longitude": 106.85152720596324
          }
        },
      },
      "destination": {
        "location": {
          "latLng": {
            "latitude": -6.2425120808113315,
            "longitude": 106.85152720596324
          }
        },
      },
      "intermediates": {
        "location": {
          "latLng": {
            "latitude": -6.178359098658539,
            "longitude": 106.79219133887105
          }
        },
      },
      "travelMode": "DRIVE",
      "routingPreference": "TRAFFIC_AWARE",
      "polylineQuality": "HIGH_QUALITY",
      "polylineEncoding": "ENCODED_POLYLINE",
      //"departureTime": "",
      "computeAlternativeRoutes": "FALSE",
      "routeModifiers": {
        "avoidTolls": false,
        "avoidHighways": false,
        "avoidFerries": false
      },
      "languageCode": "en-US",
      "units": "IMPERIAL"
    });
    var json = convert.jsonDecode(response.body);
    print(json.toString());
    return json;
  }
}

I tried to send a post body to request an encoded polyline from google route API

Don't include API keys directly in your project, use environment variables, once someone has your API key, this can end bad with a lot of debt. Make sure you reset your key. flutter_dotenv.

You also need to include your API key in your request header, from what I read. Compute a route docs

You're receiving a type error because you're not encoding your body JSON into a string.

convert.jsonEncode({"example": "example"})

You then aren't setting the content type header to let the API know what kind of data you're sending, and the API Key, along with the field mask header.

headers: {
"Content-Type": "application/json",
"X-Goog-Api-Key": "API_KEY",
"X-Goog-FieldMask": "routes.duration,routes.distanceMeters,routes.polyline.encodedPolyline"};

I've replaced your response section for you.

var response = await http.post(Uri.parse(url),
  body: convert.jsonEncode({
    "origin": {
      "location": {
        "latLng": {
          "latitude": -6.2425120808113315,
          "longitude": 106.85152720596324
        }
      },
    },
    "destination": {
      "location": {
        "latLng": {
          "latitude": -6.2425120808113315,
          "longitude": 106.85152720596324
        }
      },
    },
    "intermediates": {
      "location": {
        "latLng": {
          "latitude": -6.178359098658539,
          "longitude": 106.79219133887105
        }
      },
    },
    "travelMode": "DRIVE",
    "routingPreference": "TRAFFIC_AWARE",
    "polylineQuality": "HIGH_QUALITY",
    "polylineEncoding": "ENCODED_POLYLINE",
    //"departureTime": "",
    "computeAlternativeRoutes": "FALSE",
    "routeModifiers": {
      "avoidTolls": false,
      "avoidHighways": false,
      "avoidFerries": false
    },
    "languageCode": "en-US",
    "units": "IMPERIAL"
  }),
  headers: {
    "Content-Type": "application/json",
    "X-Goog-Api-Key": "API_KEY",
    "X-Goog-FieldMask": "routes.duration,routes.distanceMeters,routes.polyline.encodedPolyline"
  });

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM