【问题标题】:Angular2 http GET with Body?Angular2 http GET 与正文?
【发布时间】:2016-05-13 02:03:00
【问题描述】:

我正在从我的 Angular2 站点查询一些弹性搜索服务器。为了提高安全性,我们希望锁定对 GET 请求的访问。 Elasticsearch 支持带有 body 的 GET,但我在使用 Angular2 的 http 类时遇到了麻烦。

this.http.post(SearchEndpoint, q.BuildPayload(), { method: 'GET' })

由于http.get 没有body 参数,我正在尝试使用post 方法。以前我会省略 { method: 'GET' } 的 RequestOptionsArgs 并且 POST 将成功通过正文。通过在第三个参数中指定方法,http 类会从请求中删除正文。

是否可以在 Angular 2 中使用 body 发出 GET 请求?

【问题讨论】:

标签: get angular


【解决方案1】:

我认为原始 XHR 对象不允许这样做。引用规范(见https://xhr.spec.whatwg.org/):

4.5.6 send() 方法

客户端。发送([body = null])

发起请求。可选参数提供请求正文。

如果请求方法是 GET 或 HEAD,则忽略该参数。

send(body) 方法必须运行以下步骤:

  • 如果状态未打开,则抛出 InvalidStateError 异常。

  • 如果设置了 send() 标志,则抛出 InvalidStateError 异常。

  • 如果请求方法是GET或HEAD,则设置body为null。

Postman github 中的这个讨论也可以帮助你:https://github.com/postmanlabs/postman-app-support/issues/131

如果要查询 ElasticSearch 服务器,可以使用 POST 请求。这是一个示例:

POST http://localhost:9200/myindex/mytype/_search?pretty=true
Content-Type: application/json

{
  "query": {
    "match": {
      "somefield": "some value"
    }
  }
}

希望对你有帮助, 蒂埃里

【讨论】:

  • 我认为你应该使用 URLSearchParams 作为文档建议这里,但我还不太确定 angular.io/docs/ts/latest/guide/server-communication.html [参见 app/wiki/wikipedia.service.ts]
  • 感谢您的评论,但我认为您建议的代码添加查询参数而不是有效负载 ;-) URLSearchParams 可用于定义有效负载(一种 url 编码形式)但关于这个问题,问题位于底层 XHR 对象中,在 GET 方法的情况下将主体设置为 null...
  • 我们最终做的是使用 Nginx 将特定路由上的 POST 请求重写为 GET 请求,它可以确保主体仍然存在。允许 POST 请求的问题是您可以使用 POST 请求而不是 GET 请求来管理弹性搜索。
【解决方案2】:

FWIW,我很想知道为什么这在https://github.com/whatwg/fetch/issues/83 中是可取的。目前还没有基于浏览器的 API 支持此功能,但我们可以在 fetch() 中将其作为一个功能提供,前提是有足够令人信服的论据(以及实现者的兴趣)。

【讨论】:

  • 我们正在使用弹性搜索。我们所有的请求都通过用户浏览器和弹性搜索服务器之间的反向代理。为了安全起见,我们希望只允许 get 请求到达弹性搜索服务器,并将其锁定在反向代理的上游是最直接的方法。但是如果用户不能在 get 中提交查询,我们就不能这样锁定它。
猜你喜欢
  • 1970-01-01
  • 2017-12-14
  • 2016-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多