Когда я вызываю этот метод 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 (картинки проще ...)
Для заголовков есть два заголовка безопасности (которые не являются проблемой), и этот тоже:
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
Хорошо, хорошо, это имеет смысл. Но в Postman, если я изменю оставить его Raw и поменяю тип на Text и заключу все в кавычки, я получу ту же ошибку. Я предполагаю, что мне нужно избежать всех двойных кавычек в json?
Да, попробуйте с помощью простой строки, чтобы увидеть, подходит ли она.
да, простая строка работает, как и экранирование всех двойных кавычек в json.





Вы должны использовать привязку параметров, 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.
Хорошо, а если этот метод будет использоваться для нескольких типов? Я хочу оставить его общим, потому что мы не знаем, какой тип объекта будет передан. Клиент будет знать, и тогда он сможет отказаться от обслуживания. Но для наших целей нам просто нужно иметь возможность передавать строку.
для вашего редактирования, вам также нужно изменить определение метода?
Да, параметр метода должен быть RootJson вместо SampleJson.
И последний вопрос: если мы в конечном итоге добавим больше типов (что обязательно произойдет), есть ли способ избежать изменения кода? Я больше склоняюсь к тому, что Crowcoder предложил в комментариях в качестве более долгосрочного решения.
Но вы все равно десериализуете опубликованный json, верно? Вы создадите сложный объект для представления нового json. Не знаю, знаете ли вы об этом, но если это так, вам все равно следует изменить код.
Почтальон отправляет json, а не строку. Если вам действительно нужна строка, а не «правильный путь» для @lucky, заключите данные в кавычки (избегайте всех внутренних кавычек) и установите тип содержимого text / plain.