Как передать сериализованную полезную нагрузку JSON в контроллер веб-API ASP.NET CoreC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Как передать сериализованную полезную нагрузку JSON в контроллер веб-API ASP.NET Core

Сообщение Anonymous »

Эта конечная точка API предназначена для получения сериализованного объекта JSON и передачи его базовой системе отчетов.
using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json.Linq;

namespace Server.Controllers
{
[ApiController]
[Route("[controller]")]
public class ReportingController : ControllerBase
{
[HttpPost("generate")]
[ProducesResponseType(StatusCodes.Status201Created)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
[Consumes("application/json")]
public async Task Generate([FromBody] string reportModel)
{
try
{
dynamic data = JObject.Parse(reportModel);
string templateName = data.TemplateName;
return Ok(templateName);
}
catch (Exception ex)
{
return BadRequest(ex.Message);
}
}
}
}


У меня возникли проблемы с его использованием. Как передать строковый объект JSON?
Как, например:
{ "TemplateName": "myTemplate" }

Рассмотрел это в модульном тесте. Уже узнал, что он должен начинаться и заканчиваться двойной кавычкой (").
В приведенном ниже коде метод JsonStringToStringContent необходимо настроить так, чтобы двойные кавычки внутри JSON также получите правильные escape-последовательности.
В настоящее время контроллер даже не задействован, ASP.NET Core уже заранее возвращает код состояния 400.
Я также не уверен насчет типа носителя application/json.
Большое спасибо за помощь!
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc.Testing;
using Microsoft.Extensions.Configuration;
using System.Text;

namespace TestProject
{
public class UnitTest1(TestServerFixture fixture) : IClassFixture
{
[Fact]
public async Task Test1()
{
var json = "{\"TemplateName\":\"myTemplate\"}";
var jsonStringContent = JsonStringToStringContent(json);
using var content = new StringContent(jsonStringContent, Encoding.UTF8, "application/json");
var server = fixture.Server;
var request = server
.CreateRequest("/Reporting/generate")
.And(req => req.Content = content);
var response = await request.PostAsync();
response.EnsureSuccessStatusCode();
}

private string JsonStringToStringContent(string json)
{
// current result: "{"TemplateName":"myTemplate"}"
// expected result: ?
return $"\"{json}\"";
}
}

public sealed class TestServerFixture : WebApplicationFactory
{
private HttpClient client;
public HttpClient Client
{
get
{
client ??= Server.CreateClient();
return client;
}
}

protected override void ConfigureWebHost(IWebHostBuilder builder)
{
FileInfo fileInfo = new(Path.Combine(Directory.GetCurrentDirectory(), "appsettings.json"));
var configurationBuilder = new ConfigurationBuilder();
var configuration = configurationBuilder.Build();

builder
.UseConfiguration(configuration)
.ConfigureAppConfiguration(builder =>
{
builder.AddJsonFile(fileInfo.FullName);
});
}
}
}


Подробнее здесь: https://stackoverflow.com/questions/786 ... controller
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»