• WebApi中的参数传递


    在WebApi开发过程中,遇到一些客户端参数格式传输错误,经常被问到参数如何传递的一些问题,因此就用这篇博客做一下总结,肯定其它地方呢也有类似的一些文章,但是我还是喜欢通过这种方式将自己的理解记录下来

    在客户端调用WebApi的一些接口时,最常使用到的HTTP方式有Get, Post, Put, Delete四个,下面会将这四个分成两类进行说明

    第一类:Get/Delete

    Delete在Body中传递参数有争议, 因此强烈建议只在URL中传递参数,所以这个分类里面只考虑通过URL传递参数的情况。

    在URL中可以传递多个参数,但总长度有URL长度限制,参数之间使用&分隔,如以下格式:http://localhost:12345/api/Echo?arg1=value1&arg2=value2&arg3=中文,其中的中文等特殊字符需要使用urlencode进行转义,在WebApi中接收的参数可以是多个单独的参数,也可以是由多个参数封装的对象(这个转换会由框架自动完成)
    例如:
    http://localhost:12345/api/Echo/Single?arg1=1&arg2=2

    http://localhost:12345/api/Echo/Multiple?arg1=1&arg2=2&strArg1=hello&strArg2=world

    [RoutePrefix("api/Echo")]  
    public class EchoController : ApiController
    {
        [Route("Single")]
        public void Get2([FromUri]int arg1, [FromUri]int arg2)
        { }
        [Route("Muliple")]
        public void Get3([FromUri]int arg1, [FromUri]int arg2, [FromUri]Arg arg3)
        { }
    }
    public class Arg
    {
        public string strArg1 { get; set; }
        public string strArg2 { get; set; }
    } 
    

    第二类:Post/Put

    Post和Put在参数传递时既可以在URL中传递,也可以在Body中传递,当然一起传也是可以的,URL传递符合上面所描述的情况,下面着重说一下在Body中传值的情况。
    Body正文只接收一个参数的传递,但不限该参数是一个值还是一个对象,所以如果想要在Body中传递多个参数,需要将这多个参数封装成一个对象

    一个值参数

    Api中定义的接收方式(还有多种接收参数的方式,这里只是用这一种方式进行举例):

    [Route("Single")]
    public void Post1([FromBody]int arg1)
    {
    }
    

    Body中的正文:

    1
    

    多个值参数

    Api中定义的接收方式:

    [Route("Single")]
    public void Post1([FromBody]int arg1, [FromBody]int arg2)
    {
    }
    

    Body中的正文(以json格式为例):

    {
        "arg1":1,"arg2":2
    }
    

    此种方式会导致服务器报500错误,因为服务器端不能正确解析所传参数

    对象参数:

    Api中定义的接收方式:

    [Route("SingleObject")]
    public void Post2([FromBody]Arg arg)
    {
    }
    

    Body中正文内容(以json为例,若要以form方式传输,请参考form格式):

    {
        "strArg1":"hello", "strArg2":"world"
    }
    

    若有多传的值会被自动忽略掉

    Body正文格式

    Body正文格式中分json和form两种传递方式,若使用form方式传递,请将http头Content-Type设置为application/x-www-form-urlencoded, 其中的x-www-form-urlencoded为正文指定编码方式,而使用json形式传递, 请将http头Content-Type设置为application/json; charset=utf-8,参数正文不需要使用特殊的编码处理,不过强烈建议使用json这种传输方式,下面是两个分别使用form和json传递的http包:

    Form方式

    POST /api/test HTTP/1.1
    Connection: keep-alive
    Content-Length: 35
    Content-Type: application/x-www-form-urlencoded; charset=UTF-8
    Accept: */*
    Accept-Encoding: gzip, deflate
    Accept-Language: zh-CN,zh;q=0.8
    Host: localhost:12345
    User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36
    
    arg1=1&arg2=2&content=%E6%B5%8B%E8%AF%95
    

    Json方式

    POST /api/test HTTP/1.1
    Connection: keep-alive
    Content-Length: 35
    Content-Type: application/json; charset=UTF-8
    Accept: */*
    Accept-Encoding: gzip, deflate
    Accept-Language: zh-CN,zh;q=0.8
    Host: localhost:12345
    User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36
    
    {
    	"arg1":1,
    	"arg2":2,
    	"content":"测试"
    }
    

    引用

    1. WebApi参数传递总结
  • 相关阅读:
    从最近面试聊聊我所感受的职业天花板
    NetCore基于EasyNetQ的高级API使用RabbitMq
    Ocelot学习笔记
    使用iis反向代理.net core应用程序
    Odoo 部署windows server 2012
    低版本VMware与docker不兼容
    odoo tools
    Pandas 学习随笔
    Json数据校验 Json Schema
    python入门
  • 原文地址:https://www.cnblogs.com/home-wang/p/5072904.html
Copyright © 2020-2023  润新知