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遇到问 ...
随机推荐
- CentOS(6.8)7 安装 Mysql 5.7
https://blog.csdn.net/zyw_java/article/details/70949596 https://blog.csdn.net/yzl11/article/details/ ...
- 利用ss-redir加速服务器上国外服务的访问
https://blog.microdog.me/2016/06/28/Speed-Up-Network-Accessing-To-Overseas-Services-On-Your-Server/
- yarn工具的使用
<!-- yarn init === npm init --> <!-- yarn login === npm adduser -->登录 <!-- yarn publi ...
- [转帖]台积电近10万片晶圆报废,但7nm工艺将成2019营收主力
台积电近10万片晶圆报废,但7nm工艺将成2019营收主力 2019年02月18日 13:19 1784 次阅读 稿源:Expreview超能网 0 条评论 https://www.cnbeta.co ...
- [工作相关] GS产品使用LInux下Oracle数据库以及ASM存储时的数据文件路径写法.
1. 自从公司的GS5版本就已经支持Linux下的oracle数据库通过安装工具自动安装注册了, 只不过路径需要使用linux的命名规则, 如图: /home/oracle/ 注意 最后是有一个 斜线 ...
- gitbook 简单使用
gitbook 简单使用 之前由于公司培训过使用 gitbook,当时也没有进行安装使用.当时就感觉就是 markdown 语法,加上我本来就是使用 markdown 进行写博客之类.再加上这个东西本 ...
- html5應用緩存
HTML5使用了應用緩存,就是web應用緩存,使得在離線狀態下可以訪問web'應用. 應用緩存的優點: 離線訪問-可以在無網的狀態下訪問應用 速度-有緩存的應用加載更快 瀏覽器負載-瀏覽器只從服務器加 ...
- python之文件系统操作(os模块)
文件系统操作(os模块) import os file_name = "D:\\test_data\\1.txt" file_name_2 = "D:\\test_dat ...
- Nginx REWRITE阶段
rewrite_log on ;#每次rewrite都会记录一条记录在errorlog里 error_log logs/xxx.log notice; location /first { rewrit ...
- BZOJ3123[Sdoi2013]森林——主席树+LCA+启发式合并
题目描述 输入 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20. 第二行包含三个整数N,M,T,分别表示节点数.初始边数.操作数.第三行包含N个非负 ...