2017-08-27 103 views
1

我發現一個「get」路由將匹配HTTP GET和HTTP POST請求。 例如:爲什麼Golang grpc-gateway的GET路由匹配POST請求?

rpc aaa(User) returns (User) { 
    option (google.api.http) = { 
    get: "/api/v1/aaa" 
}; 

它匹配二者curl -v -X GET -k https://127.0.0.1/api/v1/aaacurl -v -X POST -k https://127.0.0.1/api/v1/aaa

我想知道是否有可能嚴格匹配所有路線,包括方法?

回答

1

簡短回答

這是因爲您沒有指定請求的內容類型。

龍答案

通過規範,它允許您與您的Content-Type: application/x-www-url-encoded要求GET編碼成一個POST方法。

因此,請求的內容類型爲application/x-www-url-encoded時,grpc-gateway中的請求路由表會嘗試從POST方法回退到GET

ref。 https://groups.google.com/d/msg/grpc-io/Xqx80hG0D44/1gwmwBcnNScJ

「(注)URL的長度的限制(去/更長的URL)。它是由某些瀏覽器和代理enfoced。如果你的GET請求超過限制,瀏覽器可能會拒絕給他們,你可能改爲使用內容類型爲application/x-www-form-urlencoded的POST請求。如果POST + URL已被映射到另一個後端函數,則應將「X-HTTP-Method-Override:GET」頭添加到覆蓋HTTP方法並獲得正確的映射

+0

謝謝Yugui。它解釋了grpc-gateway的行爲,因爲它來自規範 – pellucid

+0

但是,它非常混亂。總是有長處的限制。如果api的URL長度可能超過允許值,api設計者需要注意。這不應該是grpc-gateway的責任。如果我在.proto文件中定義了「get」,那麼只有「get」請求才能夠到達它。 – pellucid

相關問題