«Значение JSON не может быть преобразовано в System.String» при попытке вызвать конечную точку контроллера - PullRequest
2 голосов
/ 28 марта 2020

Я пытался создать простой API, мне удается заставить Get работать нормально, но всякий раз, когда я пытаюсь работать с Post или Put, я не могу заставить его работать.
Я пытаюсь опубликовать / поместить JSON и получить его в виде строки в моем контроллере.
Я использую Почтальон и Бессонницу для тестирования (я уточнил, что я включил проверку SSL для обоих, так как я запускаюсь в локальной сети) ).
Вот мой контроллер:

[Route("backoffice/[controller]")]
[ApiController]
public class AddQuestionController : ControllerBase
{
    private IQuestionRepository _questionRepository;

    public AddQuestionController(IQuestionRepository questionRepository)
    {
        _questionRepository = questionRepository ?? throw new ArgumentNullException(nameof(questionRepository));

    }

    [ProducesResponseType((int)System.Net.HttpStatusCode.OK)]
    [HttpPost]
    public async Task<ActionResult> AddQuestion([FromBody] string question)
    {
        Question q = JsonConvert.DeserializeObject<Question>(question);
        await Task.Run(() => _questionRepository.InsertOne(q));
        return Ok();
    }
}

postman

{
    "type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
    "title": "One or more validation errors occurred.",
    "status": 400,
    "traceId": "|a0b79872-4e41e975d19e251e.",
    "errors": {
        "$": [
            "The JSON value could not be converted to System.String. Path: $ | LineNumber: 0 | BytePositionInLine: 1."
        ]
    }
}

Итак, я подумал, что это потому, что формат Json в почтальоне , Но затем я попробовал формат text, и это произошло:

{
    "type": "https://tools.ietf.org/html/rfc7231#section-6.5.13",
    "title": "Unsupported Media Type",
    "status": 415,
    "traceId": "|a0b79873-4e41e975d19e251e."
}

И каждый раз, когда он даже не достигает первой строки моего контроллера. Может кто-нибудь сказать мне, что я здесь не так сделал? Это мой контроллер? Это мой способ использования Почтальона?

1 Ответ

4 голосов
/ 28 марта 2020

Связыватель модели не может отобразить / связать отправленные данные с параметрами контроллера

Ваше действие ожидает простую строку из тела запроса

public async Task<ActionResult> AddQuestion([FromBody] string question)

Но вы отправили сложный объект

{ "test" : "test" }

Возможно, вы получили совпадение, если имена свойств соответствовали

Например,

{ "question" : "test" }

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

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

"{ \"test\": \"test \"}"

, которая правильно экранирована.

Другой вариант - использовать сложный объект для параметра

class Question  {
    public string test { get; set; }
    //...other properties
}

, который соответствует ожидаемым данным

public async Task<ActionResult> AddQuestion([FromBody] Question question) {
    string value = question.test;

    //...
}

Связыватель модели свяжет данные и передаст их параметру действия ( s).

Ссылка Привязка модели в ASP. NET Ядро

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