Выполнение POST-запроса на Flutter с использованием пакета http - PullRequest
0 голосов
/ 12 октября 2019

Я пытаюсь достичь этой конечной точки при использовании флаттера. https://docs.particle.io/reference/device-cloud/api/#generate-an-access-token

Я работаю над POSTMAN и curl

curl version: 
    curl https://api.particle.io/oauth/token \
       -u particle:particle \
       -d grant_type=password \
       -d "my.email@gmail.com" \
       -d "my_password"

Почтальон: Authorisation Body

Как на curl, так и на почтальоне, я получаю ответ с токеном доступа.

Но когда я пытаюсь реализовать это на Flutter, я получаю сообщение об ошибке. Вот мой код на флаттер.

Future<Response> getPublicKey() async {
LoginRequestModel requestModelBody = LoginRequestModel(grantType: "password",
    username: "my.email@gmail.com", password: "my_password");
Map<String, dynamic> requestBody = requestModelBody.toJson();
String bodyString = json.encode(requestBody);
//    String formBody = Uri.encodeQueryComponent(bodyString);
print("Body string: "+bodyString);
String url = "https://api.particle.io/oauth/token";
String credentials = "particle:particle";

Map<String, String> headers = {
  HttpHeaders.contentTypeHeader: "application/x-www-form-urlencoded",
  HttpHeaders.authorizationHeader: "Authorization $credentials",
};

return await post(url, headers: headers, body: bodyString);

}

Оператор печати, распечатывающий строку текста, выводит:

{"grant_type":"password","username":"my.email@gmail.com","password":"my.email@gmail.com"}

Это ошибка, которую я получаю обратно:

{"error":"invalid_request","error_description":"Invalid or missing grant_type parameter"}

Я предполагаю, что я неправильно использую кодировку формы, но я не могу понять, как правильно кодировать тело.

Вопрос: Как попасть в конечную точку REST, задокументированную здесь , используя флаттер?

1 Ответ

0 голосов
/ 12 октября 2019

Существует отличный веб-сайт для преобразования curl команд в код Dart.

Вставка вашей команды curl дает:

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

void main() async {
  var uname = 'particle';
  var pword = 'particle';
  var authn = 'Basic ' + base64Encode(utf8.encode('$uname:$pword'));

  var data = {
    'grant_type': 'password',
    'my.email@gmail.com': '',
    'my_password': '',
  };

  var res = await http.post('https://api.particle.io/oauth/token', headers: {'Authorization': authn}, body: data);
  if (res.statusCode != 200) throw Exception('post error: statusCode= ${res.statusCode}');
  print(res.body);
}

Сравнение с вашим скриншотом Почтальона кажетсячтобы указать, что ваша команда curl на самом деле не верна, поэтому я бы изменил ее на:

  var data = {
    'grant_type': 'password',
    'username': 'my.email@gmail.com',
    'password': 'my_password',
  };
...