如何在Flutter上使用Json Body进行HTTP发布

时间:2019-03-05 06:29:26

标签: dart flutter

我正在尝试从API获取数据。我需要在没有标题的邮递员中从正文传递值:不显示application / JSON数据。

final response = await http.post(
      "http://192.168.10.25:8080/Login/validateusername",
    body: {"username": "user@PYA"},
      headers: {'Content-Type': 'application/json'},
    );

错误消息:

E/flutter (28851): [ERROR:flutter/shell/common/shell.cc(184)] Dart Error: Unhandled exception:
E/flutter (28851): Bad state: Cannot set the body fields of a Request with content-type "application/json".

enter image description here

6 个答案:

答案 0 :(得分:0)

使用http dart软件包

var data = {username:"username",password:"password"};
 http.Response response = await http.post(
        "yourApiroute",
        headers: {'Content-Type': 'application/x-www-form-urlencoded'},
        body: {"username": data.phone, "password": data.password});

答案 1 :(得分:0)

添加内容类型application/json

Future<String> apiRequest(String url, Map jsonMap) async {
  HttpClient httpClient = new HttpClient();
  HttpClientRequest request = await httpClient.postUrl(Uri.parse(url));
  request.headers.set('content-type', 'application/json');
  request.add(utf8.encode(json.encode(jsonMap)));
  HttpClientResponse response = await request.close();
  // todo - you should check the response.statusCode
  String reply = await response.transform(utf8.decoder).join();
  httpClient.close();
  return reply;
}

答案 2 :(得分:0)

var json = jsonCodec.encode(data);
    print("json=$json");
    var url = "http:yourAPIrouter.com/etc";
    var response = await http.post(
      url,
      headers:{ "Accept": "application/json" } ,
      body: { "json": '$json'},
      encoding: Encoding.getByName("utf-8")
    );
  

不要忘记在邮递员中添加密钥"json"

enter image description here

答案 3 :(得分:0)

使用内容类型“ application / json”将主体简单编码为json对象

http.Response response = await http.post( uri , headers: headers, body: JsonEncoder().convert(body));

答案 4 :(得分:0)

我做的差不多。但是,我尝试避免像您的情况那样进行后端操作。我只是做了一个最小的php请求,所以我不会浪费或耐心地学习开发用户管理控制器所需的内容。

但是,我遇到了Flutter独自无法解决的一些局限性和问题。经过一番否认,我尝试了一下。 Lumen是Laravel框架的简化版本,提供了一些教程和一些过去的经验,我最终意识到API应该承载大多数身份验证,而不是应用程序本身。我离题了。

在我的情况下,http帖子的功能代码为:

Future<Post> createPost() async {
final url = "http://localhost:8000/api/login";
Map<String, String> body = {
  'user': user.text,
  'pass': pass.text,
};
await http.post(url, body: body);
print(body);

return http.;

}

我首先将其转换为地图。与解析json相比,我更喜欢这种方法,因为如果需要添加更多变量,只需将地图放大即可。

我只是有一个问题:您的http://192.168.10.25:8080/Login/validateusername是什么样的?我认为无需指定您的身体解析的信息类型。

答案 5 :(得分:0)

另一种简单的方法如下

import 'package:http/http.dart' as http;

String body = json.encode({
    'foo': 'bar',
    'complex_foo' : {
        'name' : 'test'     
    }
});

http.Response response = await http.post(
    url: 'https://example.com',
    headers: {"Content-Type": "application/json"},
    body: body,
);