ASP. NET Базовый веб-API. Как обрабатывать значения «null» и «undefined» в строках URL-запроса? - PullRequest
0 голосов
/ 01 апреля 2020

Я в процессе реализации REST API с использованием ASP. NET Core Web API (v3.1). В настоящее время я не уверен, как различать guish между значением «неопределенное» и значением «ноль» при передаче через строку запроса в URL.

В качестве примера давайте Предположим, что API управляет пользователями, что у всех есть имя и фамилия. Кроме того, все пользователи могут иметь отчество.

REST API позволяет запрашивать этих пользователей, например, так:

GET api/user?lastName=doe

(возвращает коллекцию пользовательских ресурсов, которые имеют фамилию "Doe"). Связанный класс контроллера может выглядеть следующим образом:

[HttpGet]
public IActionResult GetUsers(string firstName, string lastName, string middleName)
{
    // Search database for users
    // Ignore firstName and middleName, because they are null
}

Моя проблема возникает, когда запросы включают отчество:

GET api/user?middleName=null&firstName=john

Этот запрос (где middleName явно установлен на null) должен возвращать пользователей с именем "Джон" и без отчества. Напротив, запрос

GET api/user?firstName=john

(где middleName равен undefined) должен возвращать всех пользователей с именем «Джон» независимо от того, имеют ли они второе имя или нет.

В обоих случаях параметр middleName в методе моего контроллера установлен на null. Как я могу различить guish между этими запросами в моем контроллере?

РЕДАКТИРОВАТЬ:

Мой пример вводит в заблуждение и ведет себя не так, как я ожидал, потому что

GET api/user?middleName=null&firstName=john

устанавливает middleName в строковое значение "null" вместо null (как ни в чем).

Я все еще хочу разрешить клиентам искать пользователей без отчества (где база данных значение для второго имени равно NULL). Как это может быть передано через URL и обработано контроллером?

1 Ответ

0 голосов
/ 01 апреля 2020

Вообще говоря, нет никакого неотъемлемого способа различать guish между null и undefined при поступлении из запроса, потому что они по сути одно и то же. Все значения изначально являются строками, а затем привязываются к их фактическим типам с помощью связывателя моделей.

Как уже отмечали другие, здесь, middleName=null означает, что вы устанавливаете middleName в значение "null", не null, потому что это строка, входящая в строку. Если вы хотите разрешить это соглашение, вам нужно сделать что-то вроде:

if (middleName == "null")
    middleName = null;

Однако истинный способ указать null в строке запроса - предоставить ключ без значения, например param1=&param2=foo. Здесь param1 не имеет значения. Тем не менее, связыватель модели будет интерпретировать это как "", а не ноль. Конечно, вы можете сделать то же самое, что и выше, проверяя это условие и явно устанавливая его в null, или просто использовать вместо него string.IsNullOrEmpty в качестве проверки значения.

Это все еще не касается того, как определить, установлен ли он явно или нет. Все параметры действий являются необязательными по умолчанию. Лучшее, что вы можете здесь сделать, это явно проверить, существует ли значение в запросе:

if (Request.Query.ContainsKey("middleName"))
    // explicitly passed

Затем вы можете принять решение о том, как обрабатывать значение, основываясь на том, действительно ли оно присутствовало в запросе или нет.

...