2016-02-03 73 views
1

我在從我的Angular2站點查詢一些elasticsearch服務器。爲了幫助安全,我們希望鎖定只有GET請求的訪問權限。 Elasticsearch支持GET,但是我在使用Angular2的http類時遇到了麻煩。Angular2 http GET與身體?

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

由於http.get沒有body參數,我想使用POST方法。以前,我會放棄{ method: 'GET' }的RequestOptionsArgs,並且POST將成功與身體結合。通過在第三個參數中指定方法,http類將從請求中移除主體。

是否可以在Angular 2中使用body來發出GET請求?

+0

根據[此Chrome瀏覽器的PostMan應用程序的github錯誤](https://github.com/postmanlabs/postman-app-support/issues/131)Chrome的XHR不允許這種控制,並將始終發送帶空體的GET。我們必須找到另一種保證彈性搜索的方法。 –

回答

6

我認爲生XHR對象不允許這種覆蓋此。引述規範(見https://xhr.spec.whatwg.org/):

4.5.6 send()方法

客戶端。發送([body = null])

發起請求。可選參數提供了請求主體。

如果請求方法是GET或HEAD,則忽略該參數。

的發送(身體)方法必須執行這些步驟:

  • 如果狀態沒有被打開,拋出一個異常InvalidStateError。

  • 如果send()標誌被設置,則拋出一個InvalidStateError異常。

  • 如果請求方法是GET或HEAD,請將body設置爲null。

在郵差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" 
    } 
    } 
} 

希望它可以幫助你, 蒂埃裏

+0

我認爲你應該使用URLSearchParams作爲文檔建議在這裏,但我不太確定,但https://angular.io/docs/ts/latest/guide/server-communication.html [見app/wiki/wikipedia.service .ts] – Ayyash

+0

感謝您的評論,但我認爲你建議的代碼添加查詢參數不是一個有效載荷;-) URLSearchParams可以用來定義一個有效載荷(一個URL編碼形式之一),但對於這個問題,問題是在底層在GET方法的情況下將body設置爲null的XHR對象... –

0

您可能能夠通過使用通用request方法上Http

this.http.request(SearchEndpoint, new RequestOptions({ 
    method: RequestMethod.Get, 
    body: q.BuildPayload() 
})).subscribe(...); 
+0

剛試過這個。它也剝去身體。 –

+0

@CoreyOgburn然後可能不可能,Get請求不應該有一個主體。您可能需要下拉到原始JS(或jQuery ... ew)並原生地發出請求。 – SnareChops

0

FWIW,我會有興趣聽,爲什麼這是https://github.com/whatwg/fetch/issues/83可取的。目前沒有支持這種API的基於瀏覽器的API,但是我們可以在fetch()中給出它作爲一個功能給出足夠令人信服的論點(和實施者的興趣)。

+0

我們正在使用彈性搜索。我們所有的請求都是通過用戶瀏覽器和彈性搜索服務器之間的反向代理進行的。爲了安全起見,我們希望只允許獲取請求來訪問彈性搜索服務器,並且在反向代理上鎖定向上游是最直接的方式。但是如果用戶不能在get中提交查詢,我們不能以這種方式鎖定它。 –