You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 09:15:55