用Dart向php发送HTTP请求

时间:2019-08-16 13:13:34

标签: php api post dart

我尝试使用dart将数据发布到php后端。通过某种方式使用ajax,我可以获得响应,但是使用dart,它显示 <b>Notice</b>: Trying to get property 'email' of non-object in <b>D:\xampp\htdocs\PHPBackend\api\login\login_account.php</b> on line <b>23</b><br /> <b>Notice</b>: Trying to get property 'password' of non-object in <b>D:\xampp\htdocs\PHPBackend\api\login\login_account.php</b> on line <b>24</b><br />

这些是我用于登录的php代码。

// login_account.php
$database = new Database();
$db = $database->getConnection();

$login = new Login($db);

$data = json_decode(file_get_contents("php://input"));

$login->email = $data->email;
$login->password = $data->password;

$login->loginAccount();

$login_arr = array(
  "email" => $login->email,
  "password" => $login->password
);

print_r(json_encode($login_arr));
?>
// login.php
function loginAccount(){

    // query to read single record
    $query = "SELECT
    email, password
    FROM
    " . $this->table_name . " WHERE
    email = :email AND password = :password";

    // prepare query statement
    $stmt = $this->conn->prepare( $query );

    // sanitize
    $this->email=htmlspecialchars(strip_tags($this->email));
    $this->password=htmlspecialchars(strip_tags($this->password));

    // bind id of food to be updated
    $stmt->bindParam(":email", $this->email);
    $stmt->bindParam(":password", $this->password);
    die($this->email);
    die($this->password);

    // execute query
    $stmt->execute();

    // get retrieved row
    $row = $stmt->fetch(PDO::FETCH_ASSOC);

    // set values to object properties
    $this->email = $row['email'];
    $this->password = $row['password'];
  }
}

这就是我尝试使用dart获得响应的方法。 emailValuepasswordValue从文本字段中获取。


    var loginObj = new Map<String, dynamic>();
    loginObj['email'] = emailValue;
    loginObj['password'] = passwordValue;

    final response = await http.post(Uri.encodeFull("http://192.168.1.90/phpbackend/api/login/login_account.php"),
        headers: {"Accept": "application/json"},
        body: loginObj);
    print(response.body); // check the status code for the result
    if (response.statusCode == 200) {
    }
  }

2 个答案:

答案 0 :(得分:1)

其他信息

有一个dart程序包,为http请求提供了一些帮助程序类。

Github:https://github.com/Ephenodrom/Dart-Basic-Utils

通过以下方式安装:

dependencies:
  basic_utils: ^1.5.1

它也是EZ-Flutter系列的一部分:

Github:https://github.com/Ephenodrom/EZ-Flutter 文件:https://ez-flutter.de/docs

dependencies:
  ez_flutter: ^0.2.5

用法

Map<String, String> headers = {
  "Some": "Header"
};
Map<String, String> queryParameters = {
  "Some": "Parameter"
};

String url = "";
Map payload = "{}";

    Map<String, dynamic> reaponseBody;
    try {
        responseBody = await HttpUtils.postForJson(url, json. encode(payload) ,
        queryParameters: queryParameters, headers: headers);
    } catch (e) {
        // Handle exception, for example if response status code != 200-299
    }
    // do something with the response body

其他信息:

这些都是HttpUtils类中的所有方法。

Future<Map<Response> getForFullResponse(String url,{Map<String, dynamic> queryParameters,Map<String, String> headers});
Future<Map<String, dynamic>> getForJson(String url,{Map<String, dynamic> queryParameters,Map<String, String> headers});
Future<String> getForString(String url,{Map<String, dynamic> queryParameters,Map<String, String> headers});
Future<Map<Response> postForFullResponse(String url, String body,{Map<String, String> queryParameters,Map<String, String> headers});
Future<Map<String, dynamic>> postForJson(String url, String body,{Map<String, String> queryParameters,Map<String, String> headers});
Future<String> postForString(String url, String body,{Map<String, String> queryParameters,Map<String, String> headers});
Future<Response> putForFullResponse(String url, String body,{Map<String, String> queryParameters,Map<String, String> headers});
Future<Map<String, dynamic>> putForJson(String url, String body,{Map<String, String> queryParameters,Map<String, String> headers});
Future<String> putForString(String url, String body,{Map<String, String> queryParameters,Map<String, String> headers});
Future<Response deleteForFullResponse(String url,{Map<String, String> queryParameters,Map<String, String> headers});
Future<Map<String, dynamic>> deleteForJson(String url,{Map<String, String> queryParameters,Map<String, String> headers});
Future<String> deleteForString(String url,{Map<String, String> queryParameters,Map<String, String> headers});
Map<String, dynamic> getQueryParameterFromUrl(String url);
String addQueryParameterToUrl(String url, Map<String, dynamic> queryParameters);

答案 1 :(得分:0)

我可以在Dart代码中看到您正在尝试直接发送Map对象,而不是先将其转换为例如JSON。

要转换为JSON,可以使用dart:convert包和以下方法:

public class OasisBot : ActivityHandler
    {
        private IConfiguration _config;
        private ILogger<OasisBot> _logger;
        public OasisBot(IConfiguration config, ILogger<OasisBot> logger)
        {
            _config = config;
            _logger = logger;
        }
        protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)
        {
            try
            {

                var requestJson = JsonConvert.SerializeObject(turnContext.Activity);
                _logger.LogInformation("Request Object:" + requestJson.ToString());