1

我试图在使用颤振时达到这个终点。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"

邮差: 授权 身体

在 curl 和 postman 上,我都会收到带有访问令牌的响应。

但是当我尝试在 Flutter 上实现这一点时,我收到了错误响应。这是我在 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"}

我猜我的表单编码错误,但我无法找出正确的方式来形成编码主体。

问题:如何使用 Flutter访问此处记录的 REST 端点?

4

1 回答 1

1

有一个很棒的网站可以将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);
}

与您的 Postman 屏幕截图相比,似乎表明您的 curl 命令实际上并不正确,因此我将其更改为:

  var data = {
    'grant_type': 'password',
    'username': 'my.email@gmail.com',
    'password': 'my_password',
  };
于 2019-10-12T15:35:45.107 回答