Preciso implementar o seguinte método WebAPI:
/api/books?author=XXX&title=XXX&isbn=XXX&somethingelse=XXX&date=XXX
Todos os parâmetros da string de consulta podem ser nulos. Ou seja, o chamador pode especificar de 0 a todos os 5 parâmetros.
No MVC4 beta, eu costumava fazer o seguinte:
public class BooksController : ApiController
{
// GET /api/books?author=tolk&title=lord&isbn=91&somethingelse=ABC&date=1970-01-01
public string GetFindBooks(string author, string title, string isbn, string somethingelse, DateTime? date)
{
// ...
}
}
O MVC4 RC não se comporta mais assim. Se eu especificar menos de 5 parâmetros, ele responderá com um 404
ditado:
Nenhuma ação foi encontrada no controlador 'Books' que corresponde à solicitação.
Qual é a assinatura de método correta para se comportar como costumava ser, sem ter que especificar o parâmetro opcional no roteamento de URL?
c#
url
asp.net-web-api
query-string
frapontillo
fonte
fonte
Get
isso, é automaticamente ligado com oHTTP GET
método ...string?
não é um tipo válido. Você não pode declararstring
como um tipo anulável, pois é um tipo de referência.Respostas:
Esse problema foi corrigido na versão regular do MVC4. Agora você pode fazer:
e tudo funcionará imediatamente.
fonte
null
é considerada uma expressão constante e, portanto, um valor padrão válido .É possível passar vários parâmetros como um único modelo, conforme sugerido pelo vijay. Isso funciona para GET quando você usa o atributo de parâmetro FromUri. Isso informa ao WebAPI para preencher o modelo a partir dos parâmetros de consulta.
O resultado é uma ação mais limpa do controlador com apenas um único parâmetro. Para obter mais informações, consulte: http://www.asp.net/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api
Ele ainda suporta vários parâmetros, desde que as propriedades não entrem em conflito.
Atualização :
para garantir que os valores sejam opcionais, use tipos de referência ou anuláveis (por exemplo, int?) Nas propriedades do modelo.
fonte
int Skip
) e não houver parâmetros de consulta para essa propriedade especificada, o método API Controller ainda corresponderá à solicitação com êxito e o valor paraSkip
será apenas o valor padrão para esse tipo, ou 0 neste casoUse valores padrão iniciais para todos os parâmetros como abaixo
fonte
DateTime
não é anulável. Eu já tentei usarDateTime?
, mas o MVC não mapeia a solicitação para o método especificado se eu definir apenas alguns dos parâmetros na minha solicitação HTTP.DateTime
não é um tipo de dados anulável . Seu código não deve compilar, como você não seria capaz de atribuir umnull
valor a um parâmetro do tipoDateTime
. Talvez você deva alterá-lo paraDateTime?
ou usar um valor diferente para um padrãoDateTime.Now
.Datetime.Now
não pode ser usado na inicialização de parâmetros padrão, permaneço corrigido.se você quiser passar vários parâmetros, poderá criar um modelo em vez de passar vários parâmetros.
caso você não queira passar nenhum parâmetro, também poderá pular nele, e seu código parecerá limpo e em boas condições.
fonte
Os valores padrão não podem ser fornecidos para parâmetros que não são declarados '
optional
'Na tua
WebApiConfig
fonte