2017-10-20 163 views
5

我已經(OData的)查詢參數在我的路線定義,像這樣:阿卡HTTP不處理與美元符號正確的參數?

parameters(('$top.as[Int].?, '$skip.as[Int].?)) { (top, skip) => 

我有以下的拒絕處理程序來處理所有無效的參數(handleAll):

RejectionHandler.newBuilder() 
    .handleAll[MalformedQueryParamRejection] { paramRejections => 
    // paramRejections is a Seq[MalformedQueryParamRejection] 
    ... 
    } 

的問題是,當調用以下

some-endpoint?$top=invalid&$skip=invalid 

在拒絕處理的paramRejections有2項,爲$頂部,而不是一個$頂部,一個爲$跳過。 ,

似乎與美元符號存在params,因爲當我刪除這個事情按預期工作。這是一個已知的問題或是否有可用的解決方法(不包括移除美元符號)?

請注意,它似乎是它唯一的拒絕處理程序,它具有以美元符號開頭的多個參數的問題,因爲在$ top和$ skip提供有效的情況下,路徑中的此行正確指定top並跳轉到變量值的URI:

parameters(('$top.as[Int].?, '$skip.as[Int].?)) { (top, skip) => 
+0

請問這個問題百分號編碼的幫助? '%24top ='而不是'$ top ='。美元符號被保留爲子分隔符並且只有在編碼百分比時才被正確解析。在我的複製中它工作得很好。 –

+0

不可以,客戶應該被允許使用美元符號,根據OData標準:http://www.odata.org/documentation/odata-version-2-0/uri-conventions/ – Rory

+0

@chunjef這是不相干的,所有重要的是提供給handleAll的參數拒絕是不正確的,如我的問題 – Rory

回答

1

沒有您的路由樹配置出現問題,可能有兩個候選路線進行評估和每一個生產MalformedQueryParamRejection$top查詢參數。

拒絕處理程序中的paramRejections有兩個條目,既用於$ top,也用於$ top而另一個用於$ skip。

handleAll不收集多個MalformedQueryParamRejection源自相同的路線,但它會從不同途徑蒐集拒絕。

paramRejectionsSeq[MalformedQueryParamRejection],但一條路由可能會被拒絕,只有一個MalformedQueryParamRejection,具體來說(僅)第一個查詢參數不符合所需的格式。

以最小route配置嘗試(如下面的例子),你會體驗到正確的行爲:

val route = get { 
    parameters(('$top.as[Int].?, '$skip.as[Int].?)) { 
    (top, skip) => complete(s"$top, $skip") 
    } 
} 
+0

你是對的,有一個公開的問題來實現我所需要的行爲; https://github.com/akka/akka-http/issues/1490 – Rory