Вопрос или проблема
Я создал веб-API на C# с использованием Swagger. Он работает по этой ссылке: https://www.vijilcomm.com/api/swagger/index.html.
Когда я обращаюсь к нему, например, так:
https://www.vijilcomm.com/api/VijilconOn?SerialNumber=12345&IPAddress=99.41.190.178
Ответ, который я получаю, обернут в квадратные скобки.
[{"serialNumber":"12345","ipAddress":"99.41.190.178","heartbeatWait":0,"alertSoundTime":0,"fullBatteryLevel":0,"middleBatteryLevel":0,"lowBatteryLevel":0,"criticalBatteryLevel":0,"tooHardMovement":0,"unitID":"","reportPhone":"","action":"Устройство не найдено"}]
Я знаю, что в JSON квадратные скобки указывают на массив. Похоже, что он выводит это как массив или что-то в этом роде. Является ли это допустимым JSON с квадратными скобками вокруг ответа, или что-то не так с моим кодом? Мой контроллер имеет следующий код:
` [HttpGet(Name = "VijilconOn")]
public IEnumerable<VijilconOn> Get(string SerialNumber, string IPAddress)
{
return Enumerable.Range(1, 1).Select(index => new VijilconOn
{
HeartbeatWait = (Functions.ReturnIntFieldValue("HeartbeatWait", "Devices", "[SerialNumber]='" + SerialNumber + "'")),
AlertSoundTime = (Functions.ReturnIntFieldValue("AlertSoundTime", "Devices", "[SerialNumber]='" + SerialNumber + "'")),
FullBatteryLevel = (Functions.ReturnIntFieldValue("FullBatteryLevel", "Devices", "[SerialNumber]='" + SerialNumber + "'")),
MiddleBatteryLevel = (Functions.ReturnIntFieldValue("MiddleBatteryLevel", "Devices", "[SerialNumber]='" + SerialNumber + "'")),
LowBatteryLevel = (Functions.ReturnIntFieldValue("LowBatteryLevel", "Devices", "[SerialNumber]='" + SerialNumber + "'")),
CriticalBatteryLevel = (Functions.ReturnIntFieldValue("CriticalBatteryLevel", "Devices", "[SerialNumber]='" + SerialNumber + "'")),
TooHardMovement = (Functions.ReturnIntFieldValue("TooHardMovement", "Devices", "[SerialNumber]='" + SerialNumber + "'")),
UnitID = Functions.ReturnFieldValue("FriendlyName", "Devices", "[SerialNumber]='" + SerialNumber + "'").ToString(),
ReportPhone = Functions.ReturnFieldValue("ReportPhone", "Devices", "[SerialNumber]='" + SerialNumber + "'").ToString(),
IPAddress = Functions.RecordIPAddress(SerialNumber,IPAddress).ToString(),
Action = Functions.CheckIn(SerialNumber, "ON").ToString(),
SerialNumber = SerialNumber
})
.ToArray();
}`
Что, по моему мнению, логично, поскольку он выводится как массив. Мой вопрос – делаю ли я что-то не так, или нормально, что JSON выводится таким образом? Спасибо за вашу помощь! Это мой первый REST JSON Web API, поэтому я не уверен, на правильном ли я пути или что-то не так. Спасибо!
Я попробовал использовать приведенный выше код и Swagger, и JSON был выведен как описано. Я не уверен, нужно ли менять поведение функции моего контроллера или я могу оставить все как есть…
Если вы хотите, чтобы ответ был в виде массива, ваш код выглядит нормально.
Но если вы хотите вернуть один объект, вам не нужно использовать IEnumerable
. Вместо того чтобы создавать Enumerable.Range(1,1)
, вы можете создать объект и вернуть его.
[HttpGet(Name = "VijilconOn")]
public VijilconOn Get(string SerialNumber, string IPAddress)
{
return new VijilconOn
{
HeartbeatWait = (Functions.ReturnIntFieldValue("HeartbeatWait", "Devices", "[SerialNumber]='" + SerialNumber + "'")),
AlertSoundTime = (Functions.ReturnIntFieldValue("AlertSoundTime", "Devices", "[SerialNumber]='" + SerialNumber + "'")),
FullBatteryLevel = (Functions.ReturnIntFieldValue("FullBatteryLevel", "Devices", "[SerialNumber]='" + SerialNumber + "'")),
MiddleBatteryLevel = (Functions.ReturnIntFieldValue("MiddleBatteryLevel", "Devices", "[SerialNumber]='" + SerialNumber + "'")),
LowBatteryLevel = (Functions.ReturnIntFieldValue("LowBatteryLevel", "Devices", "[SerialNumber]='" + SerialNumber + "'")),
CriticalBatteryLevel = (Functions.ReturnIntFieldValue("CriticalBatteryLevel", "Devices", "[SerialNumber]='" + SerialNumber + "'")),
TooHardMovement = (Functions.ReturnIntFieldValue("TooHardMovement", "Devices", "[SerialNumber]='" + SerialNumber + "'")),
UnitID = Functions.ReturnFieldValue("FriendlyName", "Devices", "[SerialNumber]='" + SerialNumber + "'").ToString(),
ReportPhone = Functions.ReturnFieldValue("ReportPhone", "Devices", "[SerialNumber]='" + SerialNumber + "'").ToString(),
IPAddress = Functions.RecordIPAddress(SerialNumber,IPAddress).ToString(),
Action = Functions.CheckIn(SerialNumber, "ON").ToString(),
SerialNumber = SerialNumber
};
}
Ответ или решение
Ответ на вопрос о квадратных скобках вокруг JSON-ответа в Web API
Когда вы разрабатываете API, использование квадратных скобок в ответе JSON имеет важное значение и может значительно влиять на то, как клиенты взаимодействуют с вашим API. Как вы правильно заметили, квадратные скобки в JSON указывают на массив. Давайте рассмотрим, что это может означать для вашей реализации API и как вы можете изменить поведение обработки ваших данных.
1. Понимание текущей реализации
Ваш текущий метод контроллера возвращает объект IEnumerable<VijilconOn>
, который в итоге преобразуется в массив объектов класса VijilconOn
. Это поведение приводит к тому, что когда ваш API возвращает данные, они оборачиваются в квадратные скобки, создавая массив, даже если в массиве всего один объект. Вот фрагмент вашего кода:
return Enumerable.Range(1, 1).Select(index => new VijilconOn {...}).ToArray();
Наличие массива ответа — это совершенно допустимо, но важно понимать, как подобное решение может сказаться на клиентских приложениях, которые обрабатывают ваш API.
2. Когда использовать массив
Если ваш API обрабатывает сценарии, когда может быть возвращено несколько объектов VijilconOn
, это оправдает ваше текущее решение. В таких случаях возвращение массива является правильным подходом, позволяющим структурировать и стандартизировать ответ.
Если вы ожидаете, что в большинстве случаев будет возвращаться только один объект, то стоит переосмыслить структуру ответа API.
3. Предложение по изменению
Если вы хотите, чтобы ваш API возвращал один объект без оборачивания его в массив, вы можете изменить метод таким образом:
[HttpGet(Name = "VijilconOn")]
public VijilconOn Get(string SerialNumber, string IPAddress)
{
return new VijilconOn
{
// Ваши логические операции
HeartbeatWait = Functions.ReturnIntFieldValue("HeartbeatWait", "Devices", "[SerialNumber]='" + SerialNumber + "'"),
// Другие поля
};
}
Такой подход позволит вашему API возвращать ответ без квадратных скобок, что может упростить обработку на стороне клиента и улучшить общую читаемость и удобство работы с API. Однако, если вы оставите массив, удостоверьтесь, что клиентские приложения могут обрабатывать массивы адекватно.
4. Правильность JSON
Важно помнить, что JSON, который вы возвращаете, корректен, даже если он заключён в квадратные скобки. Формат, который вы предоставили:
[{"serialNumber":"12345", "ipAddress": "99.41.190.178", ...}]
является допустимым JSON-массивом, и многие клиентские библиотеки и фреймворки могут работать с ним без проблем.
Заключение
Определение того, как обрабатывать ответы в вашем API, зависит от ваших потребностей и уровня ожидаемого взаимодействия с клиентами. Спроектируйте ваше API так, чтобы оно соответствовало логике вашего приложения и ожиданиям пользователей. Если вы уверены в том, что ваш API может возвращать только один объект, логично вернуть его без обёртки в массив. Если же предположения о множественных объектах все же корректны, сохраните текущую реализацию.
Надеюсь, что данная информация помогла вам лучше понять, как управлять ответами в вашем Web API.