У меня есть настройка WireMock API для целей тестирования. Сначала я использовал короткий способ вызова REST к моей конечной точке WireMock:
var response = await _httpClient.PostAsJsonAsync("resorce/someRoute", obj);
Это просто не работало, и я всегда получал ответ «Не найден». После долгой отладки, не обнаружив никаких проблем, связанных с моими вызовами REST и настройкой WireMock, я попробовал подробный способ выполнения той же функции:
var json = new StringContent(JsonSerializer.Serialize(obj),
Encoding.UTF8, "application/json");
var response = await _httpClient.PostAsync("resorce/someRoute", json);
На этот раз это сработало! По моей информации, оба делают одно и то же.
В чем здесь проблема? Это проблема WireMock или PostAsJsonAsync может привести к другому поведению?
Вот пример короткого кода
Привет, Гуру. Сообщение обновлено с помощью ex.





PostAsJsonAsync использует JsonSerializerDefaults.Web для параметров сериализатора, что приводит к именам свойств в регистре Camel в JSON, а JsonSerializer.Serialize(obj) будет использовать значения по умолчанию, что приводит к регистру Pascal (соответствующим именам свойств). Есть несколько способов справиться с этим. Например, изменение настроек для PostAsJsonAsync:
var response = await httpCLient.PostAsJsonAsync("/hello-world", obj, new JsonSerializerOptions());
Или используя кейс Camel для объекта:
_server.Given(
Request.Create()
.WithPath("/hello-world")
.UsingPost()
.WithBodyAsJson(new { command = "Say hello"} ))
Для более сложных объектов все остальное вы знаете. Вместо этого передайте собственный сериализованный контент JSON в WithBody(). .WithBody(JsonSerializer.Serialize(complexObj, new JsonSerializerOptions {PropertyNamingPolicy = JsonNamingPolicy.CamelCase}))
Есть ли у вас минимально воспроизводимый пример , которым вы можете поделиться?