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":"测试"
}
引用
WebApi中的参数传递的更多相关文章
- webApi中参数传递
webApi中参数传递 一:无参数的get方法: 前端: function GetNoParam() { //为了统一:我们都采用$.ajax({}) 方法; $.ajax({ url: '/a ...
- Autofac - MVC/WebApi中的应用
Autofac前面写了那么多篇, 其实就是为了今天这一篇, Autofac在MVC和WebApi中的应用. 一.目录结构 先看一下我的目录结构吧, 搭了个非常简单的架构, IOC(web), IBLL ...
- WebAPI中无法获取Session对象的解决办法
在MVC的WebApi中默认是没有开启Session会话支持的.需要在Global中重写Init方法来指定会话需要支持的类型 public override void Init() { PostAut ...
- webapi 中的本地登录
WebApi 身份验证方式 asp.net WebApi 中有三种身份验证方式 个人用户账户.用户可以在网站注册,也可以使用 google, facebook 等外部服务登录. 工作和学校账户.使用活 ...
- webapi 中使用 protobuf
相比json来说,好处是速度更快,带宽占用更小.其效果大致等于json+Gzip. 在webapi中使用protobuf的方法为: 引用nuget包 Install-Package protobuf- ...
- 【AspNetCore】【WebApi】扩展Webapi中的RouteConstraint中,让DateTime类型,支持时间格式化(DateTimeFormat)
扩展Webapi中的RouteConstraint中,让DateTime类型,支持时间格式化(DateTimeFormat) 一.背景 大家在使用WebApi时,会用到DateTime为参数,类似于这 ...
- 在asp.net WebAPI 中 使用Forms认证和ModelValidata(模型验证)
一.Forms认证 1.在webapi项目中启用Forms认证 Why:为什么要在WebAPI中使用Forms认证?因为其它项目使用的是Forms认证. What:什么是Forms认证?它在WebAP ...
- 在WebAPI中自动创建Controller
在MIS系统中,大部分的操作都是基本的CRUD,并且这样的Controller非常多. 为了复用代码,我们常常写一个泛型的基类. public class EntityController<T& ...
- .net WebApi中使用swagger
我在WebApi中使用swagger的时候发现会出现很多问题,搜索很多地方都没找到完全解决问题的方法,后面自己解决了,希望对于遇到同样问题朋友有帮助.我将先一步一步的演示项目中解决swagger遇到问 ...
随机推荐
- PHP 闭包获取外部变量和global关键字声明变量的区别
最近在学习workerman的时候比较频繁的接触到回调函数,使用中经常会因为worker的使用方式不同,会用这两种不同的方式去调用外部的worker变量,这里就整理一下PHP闭包获取外部变量和glob ...
- [转帖] 从零开始编写自己的C#框架(27)——什么是开发框架
从零开始编写自己的C#框架(27)——什么是开发框架 http://www.cnblogs.com/EmptyFS/p/4105713.html 没写过代码 一直不清楚 框架的含义 不过看了一遍 也没 ...
- 软件工程_6th weeks
一.上次博客时说的UI,拖拉到现在才展示,完成了“登录,普通匹配,做题界面,做题结果”四项 功能: 二.单元测试工具 1.python单元测试工具 最近因为论文原因一直在用Python,Pytho ...
- 关于MySQL中添加数据的两种方法
下面介绍两种执行SQL命令的方法,并作出相应地总结,第一种介绍一种常规用法,下面进行做简要地分析,首先我们需要执行打开数据库操作首先创建一个MySqlConnection对象,在其构造函数中传入一个连 ...
- git常用命令及用法小计
git init 初始化一个本地git仓库repository git status 查看状态 git add <file> 将工作区修改加到暂存区(stage) git commit - ...
- NVIDIA面目生成器再做突破
导读 NVIDIA创建的AI系统“GAN”可以通过对图像数据库的学习,来随机生成超逼真人脸照片而一炮走红,经过长时间的研发与晚上目前这套系统已经有了极大的进步.除了可以自主学习之外,生成的内容逼真,让 ...
- 普通javabean 获得项目的绝对路径
方式一:String path = RequestContext.class.getResource("/").getFile();
- Codeforces Round #420 (Div. 2) A,B,C
A. Okabe and Future Gadget Laboratory time limit per test 2 seconds memory limit per test 256 megaby ...
- day29 __eq__ 比较
本质上 "==" 调用的内部方法就是 __eq__() 正常情况下,两个名字相同的变量比较的是内存地址,内存地址当然是不一样的可以使用__eq__来改变成名字相同就相等 1 cla ...
- Watchdogs利用Redis实施大规模挖矿,常见数据库蠕虫如何破?
背景 2月20日17时许,阿里云安全监测到一起大规模挖矿事件,判断为Watchdogs蠕虫导致,并在第一时间进行了应急处置. 该蠕虫短时间内即造成大量Linux主机沦陷,一方面是利用Redis未授权访 ...