Web-интерфейс ядра .NET Принимая ввод JSON и возвращая его, выдается NULL-вывод - PullRequest
0 голосов
/ 02 сентября 2018

Я пишу веб-API, который принимает любые входные данные JSON, оборачивает их в конверт (в основном, добавляет идентификатор) и затем возвращает его, но у меня возникают проблемы с тем, что входящий JSON всегда выглядит как NULL, даже если я отправляю в действительном JSON с использованием почтальона

простой контроллер выглядит следующим образом

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json;

// For more information on enabling Web API for empty projects, visit https://go.microsoft.com/fwlink/?LinkID=397860

namespace NWCloudTransactionHost.Controllers
{
    [Route("api/[controller]")]
    public class TransactionInput : Controller
    {
        [HttpPost]
        public IActionResult Index([FromBody] OriginalTransaction originalTransaction)
        {
            var transactionEnvelope = new TransactionEnvelope { Id = Guid.NewGuid(), OriginalTransactionData = originalTransaction };

            return Json(transactionEnvelope);
        }
    }

    public class OriginalTransaction
    {
        public string OriginalTransactionData { get; set; }
    }

    public class TransactionEnvelope
    {
        public Guid Id { get; set; }
        public OriginalTransaction OriginalTransactionData { get; set; }
    }
}

1 Ответ

0 голосов
/ 02 сентября 2018

Используйте средство чтения потоков, чтобы прочитать поток содержимого тела. Затем верните результат содержимого с помощью contentType: "application/json".

[HttpPost]
public ContentResult Index()
{
    using (var reader = new StreamReader(Request.Body, Encoding.UTF8))
    {
        // Get the body (json) as a raw string
        var originalTransaction = reader.ReadToEnd();

        // Wrap the transaction
        var id = Guid.NewGuid();
        var envelope = $"{{ \"Id\": \"{id}\", \"OriginalTransactionData\": {originalTransaction} }}";

        // return json
        return Content(envelope, "application/json", Encoding.UTF8);
    }
}

Помните, что в этом примере нет проверки для json. Если он неправильный (например, пропущена где-то запятая и т. Д.), Ответ также не будет действительным. Я рекомендую вам проверить, является ли необработанная строка originalTransaction допустимым json, перед тем как обернуть ее в конверт.

Пример

Запрос

{ "Test": "Hello World" }

Ответ

{
  "Id": "a9258e99-86cf-4f1d-9e17-0df7ba1dce5e",
  "OriginalTransactionData": {
    "Test": "Hello World"
  }
}

Редактировать

Я немного испортил свой быстрый ответ. Вот пересмотренная версия. Я изменил, как прочитать запрос JSON и как отправить ответ JSON обратно. Эта версия должна работать сейчас. Также исправлена ​​неправильная интерполяция строк и помещен идентификатор в экранированные кавычки. Добавил образец, который работал для меня.

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

...