(400)尝试将简单值发布到API时出现错误请求

时间:2018-12-08 15:34:06

标签: powershell asp.net-web-api asp.net-core

我有这个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

它工作正常(我得到value1value2

但是当我尝试

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

我一直都在获得

  

Invoke-WebRequest:远程服务器返回错误:(400)错误的请求。

我在做什么错了?

我尝试添加-ContentType 'Application/json',但这没什么作用

我想念什么?

我也尝试过Invoke-RestMethod,但结果相同。

接下来,我从[FromBody]参数中删除了value,但是value现在以null的身份出现

3 个答案:

答案 0 :(得分:2)

原因

这只是发生,因为您的操作方法期望来自HTTP请求正文的纯string

[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'
    

这两种方法对我来说都完美无缺。

答案 1 :(得分:1)

尝试添加标题

$url = 'http://localhost:1113/api/loans'
$head = @{'ContentType'='Application/json'}
Invoke-WebRequest -Uri $url -Body $postParams -Method Post -Headers $head 

答案 2 :(得分:1)

首先,尝试在powershell命令中使用ConvertTo-Json

$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;
}