2017-10-20 19 views
5

Tôi đã (OData) truy vấn params quy định tại tuyến đường của tôi như vậy:akka http không xử lý các thông số có dấu hiệu đô la đúng cách?

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

Tôi có xử lý từ chối sau đây để xử lý tất cả các thông số không hợp lệ (handleAll):

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

Vấn đề là khi gọi với những điều sau đây

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

các paramRejections trong xử lý sự từ chối có 2 mục, cả cho $ đầu, thay vì một cho $ đầu và một cho $ bỏ qua.

Dường như liên quan đến ký hiệu đô la trên các thông số, vì khi tôi xóa những thứ này hoạt động như mong đợi. Đây có phải là sự cố đã biết hoặc có giải pháp thay thế không (không bao gồm xóa ký hiệu đô la)? Lưu ý, có vẻ như nó chỉ là trình xử lý từ chối có vấn đề với nhiều tham số bắt đầu bằng ký hiệu đô la, vì dòng này trong tuyến đường chỉ định chính xác hàng đầu và bỏ qua các biến khi $ top và $ skip được cung cấp hợp lệ giá trị trong URI:

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

Liệu trăm mã hóa giúp đỡ với vấn đề này? '% 24top =' thay vì '$ top ='. Ký hiệu đô la được dành riêng dưới dạng phân tách phụ và được phân tích cú pháp đúng chỉ khi phần trăm được mã hóa. Nó hoạt động tốt trong bản tái tạo của tôi. –

+0

Không, khách hàng nên được phép sử dụng ký hiệu đô la, theo tiêu chuẩn OData: http://www.odata.org/documentation/odata-version-2-0/uri-conventions/ – Rory

+0

@chunjef không liên quan, tất cả đều quan trọng là paramRejections cung cấp để handleAll là không chính xác, như được mô tả trong câu hỏi của tôi – Rory

Trả lời

1

có một vấn đề với cấu hình cây tuyến đường của bạn, có thể là hai tuyến đường thí sinh được đánh giá và mỗi người tạo ra một MalformedQueryParamRejection cho tham số $top truy vấn.

ParamRejections trong trình xử lý từ chối có 2 mục nhập, cả hai cho $ top, thay vì một cho $ top và một cho $ bỏ qua.

handleAll không thu thập nhiều MalformedQueryParamRejection có nguồn gốc từ cùng một tuyến đường nhưng thu thập từ chối từ các tuyến khác nhau.

paramRejectionsSeq[MalformedQueryParamRejection] nhưng một tuyến đường duy nhất có thể bị từ chối chỉ với một MalformedQueryParamRejection, cụ thể (chỉ) thông số truy vấn đầu tiên không khớp với định dạng được yêu cầu.

Hãy thử nó với một route cấu hình tối thiểu (như trong ví dụ dưới đây) và bạn sẽ trải nghiệm những hành vi đúng:

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

Bạn đúng, có một vấn đề mở để thực hiện hành vi mà tôi yêu cầu; https://github.com/akka/akka-http/issues/1490 – Rory

Các vấn đề liên quan