2012-04-12 8 views
42

MVC4'teki yeni Api Denetleyicisi'ni kullanarak bir sorunla karşılaştım. Ben aşağıdaki yöntemleri varsa:Birden fazla bildirim bildiren Api denetleyicisi Get deyimi

public IEnumberable<string> GetAll()

public IEnumberable<string> GetSpecific(int i)

Bu çalışacaktır. Ancak, ben $.getJSONGetAllIntegers yönteme ayarlanmış olsa bile, GetAll yönteme varsayılan olarak, farklı türde bazıları farklı veri almak isterseniz:

public IEnumberable<int> GetAllIntergers()

(kötü adlandırma kuralları)

Bunu yapmam mümkün mü?

Web API denetleyicisinde yalnızca bir GetAll yöntemine sahip olabilir miyim?

Neyi başarmaya çalıştığımı görselleştirmenin daha kolay olduğunu düşünüyorum.

public IEnumerable<string> GetClients() 
{ // Get data 
} 

public IEnumerable<string> GetClient(int id) 
{ // Get data 
} 

public IEnumerable<string> GetStaffMember(int id) 
{ // Get data 
} 

public IEnumerable<string> GetStaffMembers() 
{ // Get data 
} 

cevap

62

Bu, tüm yönlendirme içinde: Burada tek ApiController yılında, yapabilmek istediğinizi göstermek için bir kod snippet'idir. Varsayılan Web API rota şuna benzer:

varsayılan yönlendirme şablonuyla
config.Routes.MapHttpRoute( 
    name: "API Default", 
    routeTemplate: "api/{controller}/{id}", 
    defaults: new { id = RouteParameter.Optional } 
); 

, Web API eylemi seçmek için HTTP yöntemini kullanır. Sonuç olarak, bir GET isteğini, ilk GetAll parametresine eşleştirerek bulabilir.

  • API/yourapicontroller/GetClients
  • api: Aşağıdaki URL ile istekte bulunmak yıldızlayabilirsiniz Bundan sonra

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

    : Eğer işlem adı dahildir bir rota tanımlamak gerekir Bu sorunu gidermek için/yourapicontroller/GetStaffMembers

Bu şekilde denetleyicide birden çok GetAll olabilir.

Burada daha önemli olan bir şey, bu yönlendirme stilinde, izin verilen HTTP yöntemlerini belirtmek için öznitelikleri kullanmanız gerektiğidir ([HttpGet] gibi). Geleneksel yaklaşımla varsayılan Web API fiil temelli yönlendirme karıştırma bir seçeneği de bulunmaktadır

, çok iyi burada tarif edilir: durumda birisi olarak

+0

Hızlı soru, can I rota böyle ve ben bir ActionNameAttribute eklerseniz hala benim yöntemlerini yalnızca "Post" arayıp otomatik sadece HttpPost kabul ediyorum? – Alxandr

+0

@Alxandr Hala AcceptVerbsAttribute (veya HttpPostAttribute, HttpGetAttribute vb.) Kullanmanız gerekecek – tpeczek

+3

Yönlendirmede bazı sorunlar yaşıyorum - Birden çok "GET" yöntemini tanımlayabilirim, ancak/api/{controller} sunucusuna çarptıysam bir 404 yerine bir HTTP 500 "çoklu eylem bulundu" verir. Bunu engelleme hakkında herhangi bir fikriniz var mı? İstediğim, "Al, Yayınla, Kola, Sil, vb." Yoluna/api/{controller}/{id} rotasına sahip olmak, ardından/api/{controller}/{id}/{action} rotasına sahip olmaktır/api/Müşteriler/5/Ürünler gibi belirli bir eylem. Çalışmıyor - her şey "birden çok eylem bulundu" hatası veriyor. – ShadowChaser

9

başka bu sorunu ile karşı karşıyadır. İşte bunu nasıl çözdüm. Belirli bir URL'ye yönlendirmek için kontrol cihazınızdaki [Route] özelliğini kullanın.

[Route("api/getClient")] 
public ClientViewModel GetClient(int id) 

[Route("api/getAllClients")] 
public IEnumerable<ClientViewModel> GetClients() 
+0

rota nitelik bağlantısı yönlendirme in web-api-2 – Callat