2016-01-07 68 views
0

解析爲REST API我在噴霧下面的代碼來解析由用戶調用REST服務:路徑在噴霧

val route = { 
    pathPrefix("v0") { 
    pathPrefix("pets") { 
     pathEndOrSingleSlash { 
     pathEnd { 
      get { 
      complete("/v0/pets") 
      } 
     } ~ 
     get { 
      complete("/v0/pets/") 
     } 
     } ~ 
     parameters('id ?) { 
     id => 
      get { 
      complete("/v0/pets?id=" + id) 
      } 
     } 
    } 
    } 
} 

的問題是預期它不表現。 我從代碼預期以下行爲:

http://127.0.0.1/v0/pets => /v0/pets 
http://127.0.0.1/v0/pets/ => /v0/pets/ 
http://127.0.0.1/v0/pets?id=1234 = > /v0/pets?id=Some(1234) 

不過,我得到以下結果查詢:

http://127.0.0.1/v0/pets => /v0/pets 
http://127.0.0.1/v0/pets/ => /v0/pets 
http://127.0.0.1/v0/pets?id=1234 => /v0/pets 

回答

1
pathPrefix("v0") { 
    pathPrefix("pets") { 
    pathEndOrSingleSlash { 
     get { 
     } 
    } 
    } 
} 

比賽http://127.0.0.1/v0/pets?id=1234

這就是爲什麼

GET /v0/pets?id=1234 
^ ^^^ 
|___|___|__|____ get 
    | | | 
    | | | 
    | | |__ pathEndOrSlash 
    | | 
    | |__ pathPrefix("pets") 
    | 
    |__ pathPrefix("v0") 

您需要攔截parameter。嘗試

val route = { 
    pathPrefix("v0") { 
    pathPrefix("pets") { 
     parameters('id ?) { 
     id => 
      get { 
      complete("/v0/pets?id=" + id) 
      } 
     } ~ 
     pathEndOrSingleSlash { 
     pathEnd { 
      get { 
      complete("/v0/pets") 
      } 
     } ~ 
     get { 
      complete("/v0/pets/") 
     } 
     } 
    } 
    } 
} 
+0

感謝@ gabriele-petronella的回覆。但是使用您的建議解決方案,最後兩條路徑永遠不會執行。他們兩個只是通過第一個路徑執行,並打印輸出爲/ v0/pets /?id = None – Chuchu

+0

哦,是的,我的不好,id的選擇性使它無論如何都進入了第一條路徑。 mfirry的解決方案是要走的路。 –

2

這裏的一個問題是,由於id被聲明爲optionalparameter路線處理存在和缺乏這種兩個(和正在處理v0/pets)。

這樣做的一種方法(我也假設你只想處理get請求)。

你基本上只是在你parameter路線聲明id不可選

val route = get { 
    pathPrefix("v0") { 
    pathPrefix("pets") { 
     pathEnd { 
     parameter('id) { id => 
      complete("/v0/pets?id=" + id) 
     } ~ complete("/v0/pets") 
     } ~ 
     pathSingleSlash { 
     complete("/v0/pets/") 
     } 
    } 
    } 
} 

另一種方式基本上就是利用了這一id是一個可選參數,所以你只要模式匹配的Option

val route = { 
    pathPrefix("v0") { 
    pathPrefix("pets") { 
     pathEnd { 
     get { 
      parameters('id ?) { id => 
      id match { 
       case Some(id) => complete("/v0/pets?id=" + id) 
       case None => complete("/v0/pets") 
      } 
      } 
     } 
     } ~ 
     pathSingleSlash { 
     get { 
      complete("/v0/pets/") 
     } 
     } 
    } 
    } 
}