簡體   English   中英

在URL中使用斜杠“/”路由參數

[英]Route parameter with slash “/” in URL

我知道你可以在路由屬性中應用通配符來允許/例如日期輸入,例如:

[Route("orders/{*orderdate}")]

通配符的問題僅適用於URI中的最后一個參數。 如果要擁有以下URI,如何解決問題:

[Route("orders/{orderdate}/customers")]

更新:

我知道通過重構代碼來解決問題的選擇很少,所以請不要提供類似的解決方案:

  1. 將路線模板更改為[Route("orders/customers/{orderdate}")]
  2. 將日期更改為其他格式(例如"dd-mm-yyyy"

@bet ..我認為genericUriParserOptions不再適用於.net 4.5或更高版本..

另外,正如@JotaBe所建議的那樣 ,您可能需要正確解碼網址請求。 在大多數情況下, %2F將自動轉換為斜杠'/' 因此,如果你需要逃避它,你需要首先解碼'%'字符..所以你的URL:看起來像: www.domain.com/api/orders/23%252F06%252F2015/customers

請注意,字符'%252F'將轉換為實際'%2F'

編輯

好的,這是完整的解決方案(試過它並為我工作):

  1. 假設你有一個像這樣的API端點:

     [Route("orders/{date}/customers")] public HttpResponseMessage Get(string date) { } 
  2. web.config中,您需要將requestPathInvalidCharacters設置為empty,告訴asp.net允許所有請求

     <system.web> <httpRuntime targetFramework="4.5" requestPathInvalidCharacters=""/> </system.web> <system.webServer> <security> <requestFiltering allowDoubleEscaping="true" /> </security> </system.webServer> 
  3. 當客戶端向API發送請求時,您需要確保像這樣轉義'%'

    www.domain.com/api/orders/23%252F06%252F2015/customers

  4. 然后,您需要解碼請求

     [Route("orders/{date}/customers")] public HttpResponseMessage Get(string date) { DateTime actualDate = DateTime.Parse(System.Net.WebUtility.UrlDecode(date)); // date is 23/06/2015 } 

如@AlexeiLevenkov的評論所述,這是錯誤的:

您不能在URL中有一個接受正斜杠的參數,因為這是一個分隔每個URL片段的特殊符號。 因此,只要在URL中包含此符號,就會有新的片段,並且單個參數不能包含多個片段。

如果您想了解更多詳情,請閱讀本文 ,但這些是最相關的摘錄:

  • URL路徑在第一個完成? #在網址中找到。 因此,斜杠僅在出現之前的URL路徑部分或其中一個符號中創建片段。
  • 從3.4節開始:查詢組件由第一個問號(“?”)字符表示,並以數字符號(“#”)字符或URI的末尾結束。

因此,查詢字符串可以包含正斜杠, / ,如果需要的話,他們不會在所有定義路徑段。

這些是問題的一些解決方案:

  • 包括日,月和年的片段,如下所示: [Route("orders/{month}/{day}/{year}/customers")]然后在服務器端創建日期
  • 要求用戶使用不同的分隔符,如破折號或點,這不會產生問題,在字符串處接收它並自行解析(或使用您自己的自定義綁定器來支持該格式)
  • 使用URL Rewrite擴展名在URL到達路由系統之前更改URL,並按照上一個解決方案中的說明解析它(這需要在IIS中托管)
  • 接收它作為查詢字符串,即這樣的東西:'?date = 02/03 / 2015'(你最好編碼)

注意:您的原始問題是“查詢字符串”,而我對編碼的評論是指查詢字符串,它是問號后面的URL的最后一段(如果存在), like &id=27 我更正了你的問題,所以它沒有提到“查詢字符串”,這不是你需要的正確名稱

您可以使用以下URI [Route("orders/{DD:int}/{MM:int}/{YY:int}}/customers")]然后使用自定義模型綁定器來獲取DD/MM/YY和將它們轉換為您可以在動作方法中綁定的日期。

您可以選擇如何處理約束(更嚴格地使用正則表達式)或使用驗證並返回400(如果不匹配)。

更簡單的方法是采用Day/Month/Year並將其放在代碼中。

這是一個處理模型綁定的鏈接。

C#有自己的方法,它跳過轉義序列的規則,方法的名稱是Uri.UnescapeDataString( 你的查詢字符串參數你可以在獲取參數值時使用它

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM