Почему "[FromBody] string json" имеет значение null при поступлении от Postman?

Когда я вызываю этот метод API из своего модульного теста, параметр json имеет значение. Но когда я делаю это из Почтальона, он всегда равен нулю.

/// <summary>
/// Save the access integration settings for a given integration.
/// </summary>
/// <param name = "json"></param>
/// <param name = "integrationID"></param>
/// <returns></returns>
[Route("api/AccessIntegrationSettings/{integrationID}")]
[SwaggerOperation(Tags = new[] { "Access Integration: Integration Settings" })]
public IHttpActionResult Post([FromBody]string json, string integrationID)
{
    ....
}

Вот что я делаю в Postman (картинки проще ...)

Почему &quot;[FromBody] string json&quot; имеет значение null при поступлении от Postman?

Для заголовков есть два заголовка безопасности (которые не являются проблемой), и этот тоже:

Content-Type    application/json

Я не уверен, что мой метод настроен неправильно или мой звонок от почтальона неправильный. Но опять же, когда я нажимаю этот метод из модульного теста, параметр json имеет значение, поэтому я склонен думать, что я делаю что-то не так в Postman, но я не знаю что.

Обновлено:

Я также заметил, что если я проверяю ModelState, это всегда true при выходе из модульного теста и всегда false при поступлении из Postman.

public override void OnActionExecuting(HttpActionContext actionContext)
{
     if (actionContext.ModelState.IsValid == false)
     {
         ....
     }
}

Если я углубляюсь в ModelState из каждого вызова, при поступлении от Postman есть дополнительная пара ключ-значение, которой нет при выходе из моего модульного теста:

key:   json
value: null

Почтальон отправляет json, а не строку. Если вам действительно нужна строка, а не «правильный путь» для @lucky, заключите данные в кавычки (избегайте всех внутренних кавычек) и установите тип содержимого text / plain.

Crowcoder 12.03.2018 20:01

Хорошо, хорошо, это имеет смысл. Но в Postman, если я изменю оставить его Raw и поменяю тип на Text и заключу все в кавычки, я получу ту же ошибку. Я предполагаю, что мне нужно избежать всех двойных кавычек в json?

Casey Crookston 12.03.2018 20:05

Да, попробуйте с помощью простой строки, чтобы увидеть, подходит ли она.

Crowcoder 12.03.2018 20:06

да, простая строка работает, как и экранирование всех двойных кавычек в json.

Casey Crookston 12.03.2018 20:12
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
1 120
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы должны использовать привязку параметров, Asp.Net десериализует json вместо вас.

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

public class SampleJson
{
    public bool IntegrationEnabled { get; set; }

    public bool SyncUsers { get; set; }

    //etc...
}

Также добавьте атрибут HttpPost для своего действия.

[HttpPost]
public IHttpActionResult Post(SampleJson jsonObject, [FromUri]string integrationID)

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

Если вы хотите обрабатывать несколько типов, вы можете объединить объекты следующим образом;

public class RootJson
{
    public SampleJson SampleJson { get; set; }

    public AnotherSampleJson AnotherSampleJson { get; set; }
}

И вы можете проверить простой нулевой элемент управления для этих свойств.

Note : Keep in mind that, merging the complex objects changes the json. It should be surrounded with root brackets.

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

Casey Crookston 12.03.2018 20:01

для вашего редактирования, вам также нужно изменить определение метода?

Casey Crookston 12.03.2018 20:11

Да, параметр метода должен быть RootJson вместо SampleJson.

lucky 12.03.2018 20:12

И последний вопрос: если мы в конечном итоге добавим больше типов (что обязательно произойдет), есть ли способ избежать изменения кода? Я больше склоняюсь к тому, что Crowcoder предложил в комментариях в качестве более долгосрочного решения.

Casey Crookston 12.03.2018 20:15

Но вы все равно десериализуете опубликованный json, верно? Вы создадите сложный объект для представления нового json. Не знаю, знаете ли вы об этом, но если это так, вам все равно следует изменить код.

lucky 12.03.2018 20:20

Другие вопросы по теме