Flutter curl POST请求 [英] Flutter curl POST request

查看:152
本文介绍了Flutter curl POST请求的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当我通过将curl转换为JSON在FLutter中发送POST请求时遇到问题.我是Flutter的新手,我正在尝试将数据发送到互联网.这是我的卷发:

I am facing issue when sending POST request in FLutter by transforming curl into JSON. I am new to Flutter and I am trying to send data to the internet. Here is my curl:

curl -X POST http://my-server/api/order \
    -d api_key='My API key' \
    -d phone='Mobile Phone' \
    -d street='Street Name'\
    -d moderation_required=no

这是我编写的Flutter代码:

and here is my Flutter code which I have written:

import 'dart:convert';

import 'package:flutter/material.dart';
import 'model/orderTaxi_model.dart';
import 'package:http/http.dart' as http;

Future<Data> createOrder(String street) async {
  final http.Response response = await http.post(
    'http://XXX.XXX.XXX.XXX/api/order',
    headers: <String, String>{
      'Content-Type': 'application/json; charset=UTF-8',
    },
    body: jsonEncode(<String, String>{
      'api_key': 'My api Key',
      'phone': '1234',
      'street': street,
      'moderation_required': 'yes',
    }),
  );
  if (response.statusCode == 201) {
    return Data.fromJson(json.decode(response.body));
  } else {
    throw Exception('Failed to order Taxi');
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final TextEditingController _controller = TextEditingController();
  Future<Data> _futureOrder;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Post Request'),
      ),
      body: Container(
          alignment: Alignment.center,
          padding: const EdgeInsets.all(8.0),
          child: (_futureOrder == null)
              ? Column(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: <Widget>[
                    TextField(
                      controller: _controller,
                      decoration: InputDecoration(hintText: 'Enter Street'),
                    ),
                    RaisedButton(
                      child: Text('Place Order'),
                      onPressed: () {
                        setState(() {
                          _futureOrder = createOrder(_controller.text);
                        });
                      },
                    )
                  ],
                )
              : FutureBuilder<Data>(
                  future: _futureOrder,
                  builder: (context, snapshot) {
                    if (snapshot.hasData) {
                      return Text(snapshot.data.phone);
                    } else if (snapshot.hasError) {
                      return Text('${snapshot.error}');
                    }
                    return CircularProgressIndicator();
                  },
                )),
    );
  }
}

作为参考,我正在使用此网站 https://flutter.dev/docs/cookbook/networking/send-data .如果有人可以帮助我解决此问题,我将不胜感激.我不知道我在哪里做错.也许我的错误是我正在转换HTTP.响应dart对象吗?

As my reference, I am using this website https://flutter.dev/docs/cookbook/networking/send-data. I will appreciate it if anyone could assist me to solve this issue. I don't know where I am doing a mistake. Maybe my mistake is when I am transforming HTTP.Response to dart object ?

推荐答案

在curl中, -d 表示url编码形式参数.在您的Dart代码中,您发送的是JSON字符串.

In curl -d means a url encoded form parameter. In your Dart code, you are instead sending a JSON string.

删除所有对JSON的引用,并让http客户端对表单进行编码(如果您传入 Map< String,String> .它将执行此操作.

Remove all references to JSON and let the http client encode the form (which it will do if you pass in a Map<String, String>.

  final http.Response response = await http.post(
    'http://xxx.yyy/api/order',
    headers: <String, String>{
      // no! let http set the content type itself -'Content-Type': 'application/json; charset=UTF-8',
    },
    body: <String, String>{
      'api_key': 'My api Key',
      'phone': '1234',
      'street': street,
      'moderation_required': 'yes',
    },
  );

这篇关于Flutter curl POST请求的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆