2017-02-01 54 views
3

當我試圖得到一些數據與網頁API的參數(類型DateTime),我得到響應,出現錯誤404:沒有HTTP資源發現,請求URI匹配 - 網頁API +角

消息 : 「找不到與請求URI相匹配的HTTP資源'http://localhost:53544/api/reservations/GetReservationByDate?date=Tue 2017年1月31日16:00:00 GMT + 0100'。」 MessageDetail : 「不提供控制器名稱找到路由匹配請求的URI 'http://localhost:53544/api/reservations/GetReservationByDate?date=Tue 2017年1月31日16:00:00 GMT + 0100'」

我使用AngularJS這一點。在其他控制器中,我有參數的方法,但都沒有DateTime。這可能是問題嗎?這之前,我有錯誤

400錯誤的請求

和配置路由幫助我。

這是我的代碼 - 在控制器方法:

[HttpGet] 
[ActionName("GetReservationByDate")] 
[ResponseType(typeof(Reservation))] 
public IHttpActionResult GetReservationByDate(DateTime date) 
{ 
    var reservation = db.Reservations.Where(d => d.Date.Equals(date)); 
    if (reservation == null) 
    { 
     return NotFound(); 
    } 
    return Ok(reservation); 
} 

RouteConfig.cs:

config.Routes.MapHttpRoute(
    name: "CustomApi", 
    routeTemplate: "api/Reservations/GetReservationByDate/{date}", 
    defaults: new { date = RouteParameter.Optional} 
); 

config.Routes.MapHttpRoute(
    name: "DefaultApi", 
    routeTemplate: "api/{controller}/{action}/{id}", 
    defaults: new { id = RouteParameter.Optional } 
); 
從AngularJS

和方法:

this.GetReservation = function (date) { 
    var promise = $http({ 
     method: 'GET', 
     url: 'api/reservations/GetReservationByDate?date=' + date, 
     config: { 
      params: { 
       "date": date 
      } 
     } 
    }) 
    .then(function (response) { 
     return response; 
    }, 
    function (response) { 
     return response; 
    }); 
    return promise; 
} 

我嘗試了不同的組合,與FromUriFromBody,但結果總是相同的。

回答

0

您需要設置控制器和操作的默認值,因爲路徑模板中不包含模板參數。

config.Routes.MapHttpRoute(
    name: "CustomApi", 
    routeTemplate: "api/Reservations/GetReservationByDate/{date}", 
    defaults: new { controller = "Reservations", action = "GetReservationByDate", date = RouteParameter.Optional} 
); 

更新的動作,允許不良數據

[HttpGet] 
[ActionName("GetReservationByDate")] 
[ResponseType(typeof(Reservation))] 
public IHttpActionResult GetReservationByDate(DateTime? date) {  
    if(date.HasValue) { 
     var reservation = db.Reservations.Where(d => d.Value.Date.Equals(date)).ToList(); 
     if (reservation.Count == 0) { 
      return NotFound(); 
     } 
     return Ok(reservation); 
    } 
    return BadRequest(); 
} 

也可以嘗試格式化日期客戶端,以確保它在正確的格式

this.GetReservation = function (date) { 
    var jsonDate = date.toJSON(); 
    var promise = $http({ 
     method: 'GET', 
     url: 'api/reservations/GetReservationByDate?date=' + jsonDate, 
     config: { 
      params: { 
       "date": jsonDate 
      } 
     } 
    }) 
    .then(function (response) { 
     return response; 
    }, 
    function (response) { 
     return response; 
    }); 
    return promise; 
} 
+0

我改變它像發送這個,但然後顯示錯誤400錯誤的請求: 消息 : 「該請求無效。」 MessageDetail : 「參數字典中的ServiceSchedule.Controllers中的方法'System.Web.Http.IHttpActionResult GetReservationByDate(System.DateTime)'中的非可爲空類型'System.DateTime'的參數'date' .ReservationsController'。可選參數必須是引用類型,可爲空類型,或者聲明爲可選參數。「 – ryckoshet

+0

對。我知道這意味着什麼。因爲date參數是可選的,所以它意味着可能沒有提供日期(因此爲空),但由於它是DateTime,因此操作中的參數不可空。按照異常消息中的說明「可選參數必須是引用類型,可爲空類型,或者聲明爲可選參數。」 – Nkosi

+0

解決方案是什麼?更改參數的類型..? – ryckoshet

相關問題