(400) Неверный запрос при попытке опубликовать простое значение в API - PullRequest
0 голосов
/ 08 декабря 2018

У меня есть это LoansController для веб-API

[Route("api/[controller]")]
[ApiController]
public class LoansController : ControllerBase
{
    // GET api/values
    [HttpGet]
    public ActionResult<IEnumerable<string>> Get()
    {
        return new string[] { "value1", "value2" };
    }

    // POST api/loans
    [HttpPost]
    public void Post([FromBody] string value)
    {

    }
}

В PowerShell я могу позвонить

Invoke-WebRequest http://localhost:1113/api/loans -Body $postParams -Method Get

, и он отлично работает (я получаю value1 и value2)

Но когда я пытаюсь

$postParams = "{'value':'123'}"
Invoke-WebRequest http://localhost:1113/api/loans -Body $postParams -Method Post # -ContentType 'Application/json'

, я просто продолжаю получать

Invoke-WebRequest: удаленный сервер возвратил ошибку: (400) Bad Request.

Что я делаю не так?

Я пытался добавить -ContentType 'Application/json', но это не имело никакого значения

Что мне не хватает?

Iтакже пытался Invoke-RestMethod, но с теми же результатами ..

Далее я удалил [FromBody] из параметра value, но value теперь появляется как null

Ответы [ 3 ]

0 голосов
/ 08 декабря 2018

Сначала попробуйте использовать ConvertTo-Json в команде powershell:

$postParams = @{ "value": "123"} | ConvertTo-Json
Invoke-WebRequest http://localhost:1113/api/loans -Body $postParams -Method Post -ContentType "application/json"

Если это все еще не работает, я предлагаю создать модель (объект передачи данных) и использовать привязку модели для привязки вашего строкового значения.,Отредактируйте метод Post контроллера, как показано ниже:

public class MyModelDto {
    public string Value { get; set; }
}

// POST api/loans
[HttpPost]
public void Post([FromBody] MyModelDto model)
{
    string value = model.Value;
}
0 голосов
/ 10 декабря 2018

Причина

Это просто происходит , потому что ваш метод действия ожидает простой string от тела HTTP-запроса :

[HttpPost]
public void Post([FromBody] string value)
{

}

Здесь обычная строка - это последовательность символов, которая указана "".Другими словами, чтобы представить строку, вам нужно включить кавычки до и после этих символов при отправке запроса этому методу действия.

Если вы хотите отправить строку json {'value':'123'} на сервер, вы должны использовать следующую полезную нагрузку:

POST http://localhost:1113/api/loans HTTP/1.1
Content-Type: application/json

"{'value':'123'}"

Примечание: мы должны использовать строку в двойных кавычках !Не отправляйте строку без ""

Как исправить

  1. Чтобы отправить простую строку, просто используйте следующую команду PowerShellсценарии:

    $postParams = "{'value':'123'}"
    $postParams = '"'+$postParams +'"'
    Invoke-WebRequest http://localhost:1113/api/loans -Body $postParams  -Method Post  -ContentType 'application/json'
    
  2. Или, если вы хотите отправить полезную нагрузку с помощью json, вы можете создать DTO для хранения свойства value:

    public class Dto{
        public string Value {get;set;}
    }
    

    и измените ваш метод действия на:

    [HttpPost]
    public void Post(Dto dto)
    {
        var value=dto.Value;
    }
    

    Наконец, вы можете вызвать следующие PowerShell сценарии для отправки запроса:

    $postParams = '{"value":"123"}'
    Invoke-WebRequest http://localhost:1113/api/loans -Body $postParams  -Method Post  -ContentType 'application/json'
    

Оба эти подхода работают для меня безупречно.

0 голосов
/ 08 декабря 2018

Попробуйте добавить заголовки

$url = 'http://localhost:1113/api/loans'
$head = @{'ContentType'='Application/json'}
Invoke-WebRequest -Uri $url -Body $postParams -Method Post -Headers $head 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...