在Dartpad中如何使用http.Request实现Basic Auth请求?
使用
http.Request()发起带Basic Auth的HTTP请求的正确方式 我在Dartpad中向https://httpbin.org/basic-auth发起Basic Auth请求时,http.get()方法可以成功实现,但使用http.Request()类时遇到编译错误:
- 尝试
request.headers(authHeader)时,报错:'headers' isn't a function or method and can't be invoked. - 尝试
request.headers = authHeader时,报错:The setter 'headers' isn't defined for the class 'Request'.
原来可用的http.get()代码:
import 'dart:convert' as convert; import 'package:http/http.dart' as http; void main(List<String> arguments) async { final url_httpbin = Uri.https('httpbin.org', '/basic-auth/myuser/mypasswd'); var base64Encoder = convert.Base64Encoder(); var creds64 = base64Encoder.convert('myuser:mypasswd'.codeUnits); Map<String, String> authHeader = {'Authorization':'Basic $creds64'}; final response = await http.get(url_httpbin, headers: authHeader); // sending headers with basic auth if (response.statusCode == 200) { final jsonResponse = convert.jsonDecode(response.body); print('Response $jsonResponse'); } else { print('Request failed with status: ${response.statusCode}.'); } }
错误原因
http.Request的headers属性是HttpHeaders类型,而非普通的Map<String, String>,所以不能直接赋值,也不能作为方法调用。需要通过HttpHeaders提供的方法来添加头部信息。
正确实现代码
import 'dart:convert' as convert; import 'package:http/http.dart' as http; void main(List<String> arguments) async { final url_httpbin = Uri.https('httpbin.org', '/basic-auth/myuser/mypasswd'); // 创建Request实例 var request = http.Request('GET', url_httpbin); // 方式1:通过addAll添加头部Map var base64Encoder = convert.Base64Encoder(); var creds64 = base64Encoder.convert('myuser:mypasswd'.codeUnits); Map<String, String> authHeader = {'Authorization':'Basic $creds64'}; request.headers.addAll(authHeader); // 方式2:直接使用HttpHeaders的authorization方法(更简洁) // request.headers.authorization = 'Basic $creds64'; // 创建Client并发送请求 var client = http.Client(); try { var streamedResponse = await client.send(request); var response = await http.Response.fromStream(streamedResponse); if (response.statusCode == 200) { final jsonResponse = convert.jsonDecode(response.body); print('Response $jsonResponse'); } else { print('Request failed with status: ${response.statusCode}.'); } } finally { client.close(); } }
关键说明
http.Request的headers是HttpHeaders对象,需用addAll()方法传入Map<String, String>来批量添加头部,或者直接调用HttpHeaders的属性(如authorization)设置单个头部。- 创建
Request后,需要通过http.Client的send()方法发送请求,得到StreamedResponse,再转换为Response处理响应内容。 - 记得在请求完成后关闭
Client,避免资源泄漏,最好用try/finally包裹。
内容的提问来源于stack exchange,提问作者surfmuggle
相关产品推荐
相关产品推荐

