我目前正在try 使用Ffltter实现一个API请求.我已经在Postman中实现了Resuest,并try 了所有数据.结果是成功的.然后我试图在我的计划中实现这个要求.然而,我这里有一个问题,这就是为什么我总是得到ResponseCode400.然而,我再也无法解释为什么.我在用这里的FatSecret API元.

根据文档,我用于此请求的代码需要授权头.它由客户ID和客户秘密组成.正文中还包含"GRANT_TYPE":"CLIENT_CREDICATIONS"和"SCOPE":"PRIMILER".

class FatSecretAPI extends ConsumerWidget {
  const FatSecretAPI({super.key});

final String clientId = "...";
final String clientSecret = "...";

  Future<FatSecretToken> fetchAccesToken() async {
    final response = await http
        .post(Uri.parse("https://oauth.fatsecret.com/connect/token"),
        body: {
      "grant_type": "client_credentials",
      "scope": "premier"
    }, headers: {
           HttpHeaders.authorizationHeader: "Basic ${base64.encode(utf8.encode('$clientId:$clientSecret'))};"
    });
    if (response.statusCode == 200) {
      var object = FatSecretToken.fromJson(
          jsonDecode(response.body) as Map<String, dynamic>);
      print(object.accessToken);
      return object;
    } else {
      print(response.statusCode);
      throw Exception("Failed to load token");
    }
  }

  Future<void> loadToken(WidgetRef ref) async {
    final token = await fetchAccesToken();
    ref.read(accesTokenProvider.notifier).state = token.accessToken;
  }
}

class FatSecretToken {
  final String accessToken;
  final String tokenType;
  final int expiresIn;

  FatSecretToken(
      {required this.accessToken,
      required this.tokenType,
      required this.expiresIn});

  factory FatSecretToken.fromJson(Map<String, dynamic> json) {
    return FatSecretToken(
      accessToken: json['access_token'],
      tokenType: json['token_type'],
      expiresIn: json['expires_in'],
    );
  }
}

Json格式的响应实际上应该出现在这里,它包含有关accesToken和令牌类型的信息.

推荐答案

我复制了整个过程,这就是它的工作方式.可能是因为auth标头中的;.这样一来,它的可读性也更好,也更容易为其他目的进行定制.你还应该把秘密外包出go ,这样它们才会更安全.

Future<FatSecretToken> getToken() async {
    final basicAuth =
        'Basic ' + base64Encode(utf8.encode('$clientId:$clientSecret'));

    final headers = <String, String>{
      'Authorization': basicAuth,
      // 'Content-Type': 'application/x-www-form-urlencoded',
    };

    final body = <String, String>{
      'grant_type': 'client_credentials',
      'scope': 'premier barcode',
    };

    final response = await http.post(
      Uri.parse('https://oauth.fatsecret.com/connect/token'),
      headers: headers,
      body: body,
    );

    if (response.statusCode == 200) {
      final object = FatSecretToken.fromJson(
          jsonDecode(response.body) as Map<String, dynamic>,
      );
      return object;
    } else {
      throw Exception('Failed to get token: ${response.reasonPhrase}');
    }
  }

Flutter相关问答推荐

Flutter FireRestore:如何从特定/实际领域获取数据

Flutter bloc -如何使用BlocBuilder?

如何从外部控制有状态窗口小部件本身?

Flutter -使用最小高度展开

ProviderContainer和GoRouter

Android上火焰瓷砖之间的线条飘动

在Flutter 中每次点击按钮时都很难调用自定义函数

如何让经过Firebase身份验证的用户能够将Zip文件上载到Firebase云存储?

参数类型';List<;Dynamic&>不能分配给参数类型';List<;SingleChildWidget&>';

Flutter 渲染HTML和数学(LaTeX和Katex)

如何在Flutter中将背景 colored颜色 更改为黑色?

构建上下文不能跨异步间隙使用

Dart/Flutter 泛型:类型 '(SearchFilterItemModel) => String' 不是类型 '(SearchFilterItemModel) => String' 的子类型

如何从flutter连接PostgreSQL数据库?

不使用 GlobalKey 仍然收到 GlobalKey 被多次使用的错误

通过点击缩略图加载全屏图像

Firestore:缓存和读取数据

Flutter:font_awesome_icon pro 版报错?如何设置 font_awesome 克隆仓库的路径?

TextSpan 避免符号字符串组上的换行符

在列表视图Flutter 中 Select 下一个单选按钮时单选按钮更改