首页 > 解决方案 > Flutter http_auth headers 包含“carrier return”和“new line”字符(\r\n)

问题描述

我目前正在尝试使用颤振并尝试使用 http 包。当我请求需要授权标头(授权:基本)的资源时,我按如下方式创建请求:

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

void request() {
    http.get('http://<my_url>', headers: {'Authorization': 'Basic <hash>'}).then( (resp) {
       print('response status: ${resp.statusCode} ${resp.reasonPhrase}');
    }
}

在执行此请求时,我正在查看通过 Wireshark 发送的请求,并注意到它在末尾包含回车符 (\r) 和换行符 (\n): Wireshark 的快照

调用我的请求函数后,我在打印语句中收到 401 Unauthorized 消息。当我在 Postman 中调用相同的请求时,一切都很好。

我假设我的身份验证失败,因为每个标题条目末尾的这些字符 (\r\n)。任何人都可以帮助我还是我做错了什么?

PS.:我也尝试过 http_auth 包,但它也失败了。

import 'package:http_auth/http_auth.dart' as http_auth;

void request(String user, String password) {
    http_auth.BasicAuthClient(user, password).get('http://<my_url>', headers: {'Authorization': 'Basic <hash>'}).then( (resp) {
       print('response status: ${resp.statusCode} ${resp.reasonPhrase}');
    }
}

标签: flutterhttp-headersflutter-dependencies

解决方案


这些\r\n角色注定要在那里。它们是标题之间的行分隔符。如果您从数据包中捕获线路字节,curl --user foo:bar www.dart.dev您将看到完全相同的内容。

您会注意到 Dart 已将标头名称小写为authorizationas 根据 RFC 完全有效。但是,这有时会发现一些(错误地)区分标题名称大小写的服务器。

再次尝试您的邮递员(或带有手动创建的小写标题的 curl)authorization。如果服务器不接受,请联系服务器维护人员。


推荐阅读