Проверка параметров запроса без использования модели в .netcore api - PullRequest
0 голосов
/ 24 октября 2018

Можно ли проверить параметры запроса для действия без использования модели?Многие вызовы в моем API являются одноразовыми, и я не вижу смысла делать модели для них, если они будут использоваться только один раз.

Я видел следующую статью, которая показалась мне такойэто было именно то, что мне было нужно, за исключением того, что я не хочу, чтобы он возвращал 404, если требуемый параметр не существует, я хочу, чтобы он возвращал объект сообщений об ошибках, похожих на запеченные при проверке модели - на самом деле, я просто хочупараметры должны обрабатываться как модель, без необходимости создания модели.

https://www.strathweb.com/2016/09/required-query-string-parameters-in-asp-net-core-mvc/

[HttpPost]
public async Task<IActionResult> Post(
    [FromQueryRequired] int? Id,
    [FromQuery] string Company)

РЕДАКТИРОВАТЬ:
[FromQueryRequired]пользовательский ActionConstraint, который выбрасывает 404, если идентификатор ID отсутствует (это было взято непосредственно из статьи).Однако я не хочу 404, я хочу объект, который имеет сообщение, которое говорит {MESSAGE: «ID требуется»}.Я думаю, что проблема в том, что я не могу получить доступ к контексту ответа из ограничения действия.

Ответы [ 4 ]

0 голосов
/ 05 февраля 2019

В Asp.Net Core 2.1 есть встроенный параметр [BindRequired], который выполняет эту проверку автоматически.

public async Task<ActionResult<string>> CleanStatusesAsync([BindRequired, 
    FromQuery]string collection, [BindRequired, FromQuery]string repository,
       [BindRequired, FromQuery]int pullRequestId)
{
    // all parameters are bound and valid
}

Если вы вызываете этот метод без параметров, возвращается ошибка ModelState:

{
"collection": [
  "A value for the 'collection' parameter or property was not provided."
],
"repository": [
  "A value for the 'repository' parameter or property was not provided."
],
"pullRequestId": [
  "A value for the 'pullRequestId' parameter or property was not provided."
],
}

Более подробную информацию вы можете найти в этой превосходной статье .

0 голосов
/ 25 октября 2018

Вы можете прочитать из запроса и подтвердить его

string id= HttpContext.Request.Query["Id"].ToString();


    if (id==nll)
    {
    //do any thing here
    }
0 голосов
/ 05 ноября 2018

Вот решение, которое я в итоге использовал.Добавьте атрибут в парс с именем [RequiredParm].Я свободно основал его на чьем-то ответе на другой вопрос, но сейчас я не могу его найти, извиняюсь перед кем бы то ни было, если я смогу его найти, я обновлю этот ответ для кредита.

РЕДАКТИРОВАТЬ: Найдено, ответ @James Law - Обязательный параметр веб-API

Использование:

[HttpPost]
public async Task<IActionResult> Post(
    [FromQuery, RequiredParm] int? Id,
    [FromQuery] string Company)

ActionFilterAttribute:

[AttributeUsage(AttributeTargets.Method)]
public sealed class CheckRequiredParmAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext context)
    {
        var requiredParameters = context.ActionDescriptor.Parameters.Where(
            p => ((ControllerParameterDescriptor)p).ParameterInfo.GetCustomAttribute<RequiredParmAttribute>() != null).Select(p => p.Name);

        foreach (var parameter in requiredParameters)
        {
            if (!context.ActionArguments.ContainsKey(parameter))
            {
                context.ModelState.AddModelError(parameter, $"The required argument '{parameter}' was not found.");
            }
            else
            {
                foreach (var argument in context.ActionArguments.Where(a => parameter.Equals(a.Key)))
                {
                    if (argument.Value == null)
                    {
                        context.ModelState.AddModelError(argument.Key, $"The requried argument '{argument.Key}' cannot be null.");
                    }
                }
            }
        }

        if (!context.ModelState.IsValid)
        {
            context.Result = new BadRequestObjectResult(context.ModelState);
            return;
        }

        base.OnActionExecuting(context);
    }
}

/// <summary>
/// Use this attribute to force a [FromQuery] parameter to be required. If it is missing, or has a null value, model state validation will be executed and returned throught the response. 
/// </summary>  
[AttributeUsage(AttributeTargets.Parameter)]
public sealed class RequiredParmAttribute : Attribute
{
}
0 голосов
/ 25 октября 2018

я еще не пробовал, может быть так;

public class MyActionFilterAttribute: IActionFilter
{
    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        var id = actionContext.ActionArguments["Id"];
        if(string.IsNullOrEmpty(id))
            actionContext.Response = actionContext.Request.CreateResponse(
            HttpStatusCode.OK, 
            new {MESSAGE = "ID is required"}, 
            actionContext.ControllerContext.Configuration.Formatters.JsonFormatter
        );
    }
}

[HttpPost]
[MyActionFilterAttribute]
public ActionResult Post([FromQueryRequired] int? Id,[FromQuery] string Company)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...