【问题标题】:Response headers in Dart BrowserClientDart BrowserClient 中的响应标头
【发布时间】:2019-08-22 21:53:36
【问题描述】:

我有一个代码,我在其中发布请求,响应代码是 201,使用“Location”创建:新创建资源的“URL”标头。

final Response response = await _http.post(getUri(_url), body: plan);
return _getPlan(response.headers['location']);

其中_http 是来自包http-0.12.0+1 的BrowserClient。但是response.headers['Location'] 是空的。 headers 数组本身只包含一个元素 Content-Type。 在 Chrome 开发人员工具中,我看到所有响应标头,包括 Location。 我究竟做错了什么?如何访问响应标头?

【问题讨论】:

    标签: dart dart-html


    【解决方案1】:

    感谢 Günter Zöchbauer 指出我的答案。如https://stackoverflow.com/a/39021128/1444083 所述,缺少的标头是Access-Control-Expose-Headers(不是Access-Control-Allow-Headers)。

    当我在服务器端使用 Dart Aqueduct 时,我必须将此行添加到 Channel prepare() 方法

    class MyAppChannel extends ApplicationChannel {
      @override
      Future prepare() async {
        // ... some code
        CORSPolicy.defaultPolicy.exposedResponseHeaders.add('location');
      }
    }
    

    所以现在回复包含Access-Control-Expose-Headers: location

    【讨论】:

      【解决方案2】:

      我假设响应错过了标题

      Access-Control-Allow-Headers:location
      

      因此浏览器会阻止 JavaScript (Dart) 访问标头 (CORS)。

      要使标头可用于 JavaScript (Dart),您需要更改服务器以在响应中包含上述标头。

      另见https://stackoverflow.com/a/36281935/217408

      【讨论】:

      • 感谢您的提示。您的回答将我引向了正确的标题。要添加的正确标题是Access-Control-Expose-Headers(不是Access-Control-Allow-Headers)。请参阅下面的答案。
      猜你喜欢
      • 2017-01-13
      • 2017-02-24
      • 2015-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-06
      • 2017-03-05
      相关资源
      最近更新 更多