How to make HTTP POST request with url encoded body in flutter?

前端 未结 8 1350
南笙
南笙 2020-12-01 03:59

I\'m trying to make an post request in flutter with content type as url encoded. When I write body : json.encode(data), it encodes to plain text.

If I

相关标签:
8条回答
  • 2020-12-01 04:05

    You need to add three additional steps: First, you need to convert the JSON map to a String (using json.encode) Then you need to Uri encode it if you want to send it as application/x-www-form-urlencoded. Lastly, you need to give the parameter that you are posting a name.

    For example (note, this is using the dart:io HttpClient, but it's basically the same):

      Future<HttpClientResponse> foo() async {
        Map<String, dynamic> jsonMap = {
          'homeTeam': {'team': 'Team A'},
          'awayTeam': {'team': 'Team B'},
        };
        String jsonString = json.encode(jsonMap); // encode map to json
        String paramName = 'param'; // give the post param a name
        String formBody = paramName + '=' + Uri.encodeQueryComponent(jsonString);
        List<int> bodyBytes = utf8.encode(formBody); // utf8 encode
        HttpClientRequest request =
            await _httpClient.post(_host, _port, '/a/b/c');
        // it's polite to send the body length to the server
        request.headers.set('Content-Length', bodyBytes.length.toString());
        // todo add other headers here
        request.add(bodyBytes);
        return await request.close();
      }
    

    The above is for the dart:io version (which, of course, you can use in Flutter) If you would like to stick with the package:http version, then you need to tweak your Map a bit. body must be a Map<String, String>. You need to decide what you want as your POST parameters. Do you want two: homeTeam and awayTeam? or one, say, teamJson?

    This code

      Map<String, String> body = {
        'name': 'doodle',
        'color': 'blue',
        'homeTeam': json.encode(
          {'team': 'Team A'},
        ),
        'awayTeam': json.encode(
          {'team': 'Team B'},
        ),
      };
    
      Response r = await post(
        url,
        body: body,
      );
    

    produces this on the wire

    name=doodle&color=blue&homeTeam=%7B%22team%22%3A%22Team+A%22%7D&awayTeam=%7B%22team%22%3A%22Team+B%22%7D

    alternatively, this

      Map<String, String> body = {
        'name': 'doodle',
        'color': 'blue',
        'teamJson': json.encode({
          'homeTeam': {'team': 'Team A'},
          'awayTeam': {'team': 'Team B'},
        }),
      };
    
      Response r = await post(
        url,
        body: body,
      );
    

    produces this on the wire

    name=doodle&color=blue&teamJson=%7B%22homeTeam%22%3A%7B%22team%22%3A%22Team+A%22%7D%2C%22awayTeam%22%3A%7B%22team%22%3A%22Team+B%22%7D%7D

    the package:http client takes care of: encoding the Uri.encodeQueryComponent, utf8 encoding (note that that's the default, so no need to specify it) and sending the length in the Content-Length header. You must still do the json encoding.

    0 讨论(0)
  • 2020-12-01 04:06

    I suggest using the Dio library. It supports a lot with working with APIs.

    With newest Dio version. Simply do the following:

    BaseOptions options = new BaseOptions(
    baseUrl: "https://www.xx.com/api",
    connectTimeout: 5000,
    receiveTimeout: 3000,);
    Dio dio = new Dio(options);
    //
    Map<String, String> params = Map();
    params['username'] = '6388';
    params['password'] = '123456';
    //
    response = await dio.post("/login", data: FormData.fromMap(params));
    
    0 讨论(0)
  • 2020-12-01 04:09

    I came here just trying to make an HTTP POST request. Here is an example of how to do that:

    import 'dart:convert';
    import 'package:http/http.dart';
    
    
    makePostRequest() async {
    
      final uri = 'http://httpbin.org/post';
      final headers = {'Content-Type': 'application/json'};
      Map<String, dynamic> body = {'id': 21, 'name': 'bob'};
      String jsonBody = json.encode(body);
      final encoding = Encoding.getByName('utf-8');
    
      Response response = await post(
        uri,
        headers: headers,
        body: jsonBody,
        encoding: encoding,
      );
    
      int statusCode = response.statusCode;
      String responseBody = response.body;
    }
    
    0 讨论(0)
  • 2020-12-01 04:11

    you need to use json.encode

    example;

    var match = {
      "homeTeam": {"team": "Team A"},
      "awayTeam": {"team": "Team B"}
    };
    var response = await post(Uri.parse(url),
        headers: {
          "Accept": "application/json",
          "Content-Type": "application/x-www-form-urlencoded"
        },
        body: json.encode(match),
        encoding: Encoding.getByName("utf-8"));
    
    0 讨论(0)
  • 2020-12-01 04:11
    Map<String, String> body = {
      'getDetails': 'true'
    };
    
    final response = await 
    http.post("https://example.com/", body: body);
    
    if (response.statusCode == 200) {
    //Your code
    }
    
    0 讨论(0)
  • 2020-12-01 04:12

    On the place of "UserModel" write the name of your model and do not pass String in the body it will create a problem using "Map" as given below.

    static Future<UserModel> performUserLogin(String username, String password) async{
        
            try{
        
              Map<String, String> headers = {"Content-type": "application/json"};
              
        
              Map<String, String> JsonBody = {
                'username':  username,
                'password': password
              };
        
              print("The JSON Object is here $body");
              // make POST request
              final response = await http.post(loginAPIURL,body: JsonBody);
              // check the status code for the result
              int statusCode = response.statusCode;
              print("Login calling $response");
        
        
              if (statusCode == 200){
        
              
        
              }else{
                return null;
                //return UserModel();
                throw Exception("Error in login");
              }
        
            } catch (e) {
              throw Exception(e);
            }
          }
    
    0 讨论(0)
提交回复
热议问题