ASP.NET Web API'sinde FromBodyve FromUriözniteliklerine neden ihtiyaç duyulur?
Öznitelikleri kullanma ve kullanmama arasındaki farklar nelerdir?
ASP.NET Web API'sinde FromBodyve FromUriözniteliklerine neden ihtiyaç duyulur?
Öznitelikleri kullanma ve kullanmama arasındaki farklar nelerdir?
Yanıtlar:
ASP.NET Web API bir denetleyicide bir yöntem çağırdığında, parametreler için değer ayarlaması gerekir; bu işlem parametre bağlama olarak adlandırılır .
Web API varsayılan olarak parametreleri bağlamak için aşağıdaki kuralları kullanır:
Parametre "basit" bir türse , Web API değeri URI'den almaya çalışır . Basit türler arasında .NET ilkel türleri (int, bool, double vb.), Ayrıca TimeSpan, DateTime, Guid, ondalık ve dize ve ayrıca bir dizeden dönüştürebilen bir tür dönüştürücüsü olan herhangi bir tür bulunur.
Karmaşık türler için Web API , ortam türü biçimlendirici kullanarak ileti gövdesindeki değeri okumaya çalışır .
Bu nedenle, yukarıdaki varsayılan davranışı geçersiz kılmak ve Web API'sını URI'den karmaşık bir tür okumaya zorlamak istiyorsanız, [FromUri]niteliği parametreye ekleyin . Web API'sini istek gövdesinden basit bir tür okumaya zorlamak için,[FromBody] niteliği parametreye .
Bu nedenle, sorunuzu yanıtlamak için Web API'sındaki [FromBody]ve [FromUri]özniteliklerinin ihtiyacı, gerekirse, yukarıda açıklanan varsayılan davranışı geçersiz kılmaktır. Bir denetleyici yöntemi için her iki özelliği de kullanabileceğinizi, ancak burada gösterildiği gibi yalnızca farklı parametreler için kullanabileceğinizi unutmayın .
Google "web api parametre bağlama" yaparsanız web üzerinde çok daha fazla bilgi vardır .
JustGetItgibi birden çok özellik eklemek için aynı amaca hizmet eden denilen bir özellik yapabilir miyim merak ediyorum[FromBody, FromQuery]
Varsayılan davranış:
Parametre ise ilkel tipi ( int, bool, double, ...), Web API çalışır gelen değeri elde etmek URI HTTP isteğinin.
İçin karmaşık türleri (örneğin kendi nesne: Person), Web API çalışır değeri okumak için vücudun HTTP isteğinin.
Yani, eğer varsa:
... hiçbir özellik eklemenize gerek yoktur (ne ne [FromBody]de[FromUri] ).
Eğer bir varsa Ama, ilkel tip içinde vücutta , ardından eklemek zorunda[FromBody] senin WebAPI denetleyici yönteminde ilkel tip parametre önünde. (Çünkü WebAPI, HTTP isteğinin URI'sinde ilkel türleri arar.)
Eğer bir varsa Veya, karmaşık türü sizin de URI , ardından eklemek gerekir[FromUri] . (Varsayılan olarak, WebAPI, HTTP isteğinin gövdesinde varsayılan olarak karmaşık türler arar.)
İlkel tipler:
public class UsersController : ApiController
{
// api/users
public HttpResponseMessage Post([FromBody]int id)
{
}
// api/users/id
public HttpResponseMessage Post(int id)
{
}
}
Karmaşık tipler:
public class UsersController : ApiController
{
// api/users
public HttpResponseMessage Post(User user)
{
}
// api/users/user
public HttpResponseMessage Post([FromUri]User user)
{
}
}
HTTP isteğinizde yalnızca bir parametre gönderdiğiniz sürece çalışır . Birden çok gönderirken , tüm parametrelerinize sahip olan özel bir model oluşturmanız gerekir:
public class MyModel
{
public string MyProperty { get; set; }
public string MyProperty2 { get; set; }
}
[Route("search")]
[HttpPost]
public async Task<dynamic> Search([FromBody] MyModel model)
{
// model.MyProperty;
// model.MyProperty2;
}
Microsoft'un ASP.NET Web API'sındaki parametre bağlamaya ilişkin belgelerinden :
Bir parametrede [FromBody] varsa, Web API bir biçimlendirici seçmek için Content-Type üstbilgisini kullanır. Bu örnekte, içerik türü "application / json" ve istek gövdesi ham JSON dizesidir (JSON nesnesi değil). Mesaj gövdesinden en fazla bir parametrenin okunmasına izin verilir.
Bu çalışmalı:
public HttpResponseMessage Post([FromBody] string name) { ... }Bu işe yaramaz:
// Caution: This won't work! public HttpResponseMessage Post([FromBody] int id, [FromBody] string name) { ... }Bu kuralın nedeni, istek gövdesinin yalnızca bir kez okunabilen arabelleğe alınmamış bir akışta depolanabilmesidir.
Yukarıdaki cevaplara ek olarak ..
[FromUri], sorgu dizgisinden parametre iletmek yerine karmaşık türleri uri parametrelerinden bağlamak için de kullanılabilir
Örn ..
public class GeoPoint
{
public double Latitude { get; set; }
public double Longitude { get; set; }
}
[RoutePrefix("api/Values")]
public ValuesController : ApiController
{
[Route("{Latitude}/{Longitude}")]
public HttpResponseMessage Get([FromUri] GeoPoint location) { ... }
}
Gibi çağrılabilir:
http://localhost/api/values/47.678558/-122.130989
Bir parametrede [FromBody] varsa, Web API bir biçimlendirici seçmek için Content-Type üstbilgisini kullanır. Bu örnekte, içerik türü "application / json" ve istek gövdesi ham JSON dizesidir (JSON nesnesi değil).
Mesaj gövdesinden en fazla bir parametrenin okunmasına izin verilir. Yani bu işe yaramayacak:
// Caution: Will not work!
public HttpResponseMessage Post([FromBody] int id, [FromBody] string name) { ... }
Bu kuralın nedeni, istek gövdesinin yalnızca bir kez okunabilen arabelleğe alınmamış bir akışta depolanabilmesidir.
Daha fazla bilgi için lütfen web sitesini ziyaret edin: http://www.asp.net/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api