代码之家  ›  专栏  ›  技术社区  ›  Bassie

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

  •  1
  • Bassie  · 技术社区  · 7 年前

    我有这个 LoansController 对于Web 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)错误请求。

    我做错什么了?

    我试着加 -ContentType 'Application/json' 但没什么区别

    我错过了什么?

    我也尝试过 Invoke-RestMethod 但同样的结果……

    下一个我移除了 [FromBody] value 参数,但是 价值 现在进来 null

    3 回复  |  直到 7 年前
        1
  •  1
  •   itminus    7 年前

    原因

    它只是碰巧发生 因为您的action方法需要一个 string 来自HTTP请求的主体 :

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

    这里A 普通字符串 是一个字符序列,它是 引用 "" . 换句话说,要表示字符串,需要 包括报价单 向此操作方法发送请求时,在这些字符之前和之后。

    如果您想发送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;
      }
      

      最后,您可以调用以下内容 动力壳 发送请求的脚本:

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

    这两种方法对我来说都是完美的。

        2
  •  1
  •   Mike Twc    7 年前

    尝试添加邮件头

    $url = 'http://localhost:1113/api/loans'
    $head = @{'ContentType'='Application/json'}
    Invoke-WebRequest -Uri $url -Body $postParams -Method Post -Headers $head 
    
        3
  •  1
  •   haldo Steve Sheldon    7 年前

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

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

    如果仍然不起作用,我建议创建一个模型(数据传输对象),并使用模型绑定来绑定字符串值。编辑以下控制器发布方法:

    public class MyModelDto {
        public string Value { get; set; }
    }
    
    // POST api/loans
    [HttpPost]
    public void Post([FromBody] MyModelDto model)
    {
        string value = model.Value;
    }
    
    推荐文章