在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参数传递总结

WebApi中的参数传递的更多相关文章

  1. webApi中参数传递

    webApi中参数传递 一:无参数的get方法: 前端:    function GetNoParam() { //为了统一:我们都采用$.ajax({}) 方法; $.ajax({ url: '/a ...

  2. Autofac - MVC/WebApi中的应用

    Autofac前面写了那么多篇, 其实就是为了今天这一篇, Autofac在MVC和WebApi中的应用. 一.目录结构 先看一下我的目录结构吧, 搭了个非常简单的架构, IOC(web), IBLL ...

  3. WebAPI中无法获取Session对象的解决办法

    在MVC的WebApi中默认是没有开启Session会话支持的.需要在Global中重写Init方法来指定会话需要支持的类型 public override void Init() { PostAut ...

  4. webapi 中的本地登录

    WebApi 身份验证方式 asp.net WebApi 中有三种身份验证方式 个人用户账户.用户可以在网站注册,也可以使用 google, facebook 等外部服务登录. 工作和学校账户.使用活 ...

  5. webapi 中使用 protobuf

    相比json来说,好处是速度更快,带宽占用更小.其效果大致等于json+Gzip. 在webapi中使用protobuf的方法为: 引用nuget包 Install-Package protobuf- ...

  6. 【AspNetCore】【WebApi】扩展Webapi中的RouteConstraint中,让DateTime类型,支持时间格式化(DateTimeFormat)

    扩展Webapi中的RouteConstraint中,让DateTime类型,支持时间格式化(DateTimeFormat) 一.背景 大家在使用WebApi时,会用到DateTime为参数,类似于这 ...

  7. 在asp.net WebAPI 中 使用Forms认证和ModelValidata(模型验证)

    一.Forms认证 1.在webapi项目中启用Forms认证 Why:为什么要在WebAPI中使用Forms认证?因为其它项目使用的是Forms认证. What:什么是Forms认证?它在WebAP ...

  8. 在WebAPI中自动创建Controller

    在MIS系统中,大部分的操作都是基本的CRUD,并且这样的Controller非常多. 为了复用代码,我们常常写一个泛型的基类. public class EntityController<T& ...

  9. .net WebApi中使用swagger

    我在WebApi中使用swagger的时候发现会出现很多问题,搜索很多地方都没找到完全解决问题的方法,后面自己解决了,希望对于遇到同样问题朋友有帮助.我将先一步一步的演示项目中解决swagger遇到问 ...

随机推荐

  1. 热修改 MySQL 数据库 pt-online-schema-change 的使用详解

    由于周五公司团建的关系所以此篇推迟了抱歉. 首先不得不在该篇里面梳理一个数据库热增加删除字段表的工具 pt-online-schema-change 这个工具在前面我的博文 <关于utf8mb4 ...

  2. 解决问题的方法=>现象-->原因-->方案-->方案的优缺点

    解决问题的方法=>现象-->原因-->方案-->方案的优缺点

  3. Java之反射举例

    package reflection; import bean.User; public class ReflectionDemo { public static void main(String[] ...

  4. Lodop打印控件中PRINT_INITA()和PRINT_PAGESIZE()宽高

    Lodop中有两个初始化语句,PRINT_INIT()和PRINT_INITA(),PRINT_INITA()多了四个参数,前两个是整体偏移值,第三四参数是宽高,这个宽高是指打印设计可视化编辑区域的宽 ...

  5. cordic

    cordic里向量旋转得到新向量,利用的是旋转矩阵 摘自百度百科维基百科 旋转矩阵(Rotation matrix)是在乘以一个向量的时候改变向量的方向但不改变大小的效果的矩阵.旋转矩阵不包括反演,它 ...

  6. hdu 6394 Tree (2018 Multi-University Training Contest 7 1009) (树分块+倍增)

    链接: http://acm.hdu.edu.cn/showproblem.php?pid=6394 思路:用dfs序处理下树,在用分块,我们只需要维护当前这个点要跳出这个块需要的步数和他跳出这个块去 ...

  7. MT【39】构造二次函数证明

    这种构造二次函数的方法最早接触的应该是在证明柯西不等式时: 再举一例: 最后再举个反向不等式的例子: 评:此类题目的证明是如何想到的呢?他们都有一个明显的特征$AB\ge(\le)C^2$,此时构造二 ...

  8. 自学Python3.5-字符串格式化 作用域 递归

    一.字符串格式化 二.作用域 三.递归

  9. 洛谷 P3853 路标设置 解题报告

    P3853 路标设置 题目背景 B市和T市之间有一条长长的高速公路,这条公路的某些地方设有路标,但是大家都感觉路标设得太少了,相邻两个路标之间往往隔着相当长的一段距离.为了便于研究这个问题,我们把公路 ...

  10. 【转】CPU上下文切换的次数和时间(context switch)

    http://iamzhongyong.iteye.com/blog/1895728 什么是CPU上下文切换? 现在linux是大多基于抢占式,CPU给每个任务一定的服务时间,当时间片轮转的时候,需要 ...