开发者社区> 码农阿宇> 正文

ASP.NET WebAPI String 传值问题

简介: 如果我们再WebAPI中定义了只有一个string参数的WebAPI函数,如下所示:   [HttpPost] public string TrackBill(string str) { return str; } 就是这样一个简单的函数,有一个字符串类型的参数,  当我们用PostMan对该API进行测试,给api接口传一个Key为str,value为123的键值对。
+关注继续查看

如果我们再WebAPI中定义了只有一个string参数的WebAPI函数,如下所示:

 

[HttpPost]
public string TrackBill(string str)
        {
           return  str;
        }
就是这样一个简单的函数,有一个字符串类型的参数,

 

当我们用PostMan对该API进行测试,给api接口传一个Key为str,value为123的键值对。

其结果如下:

我们看到,返回的结果是找不到与该请求匹配的资源。很奇怪,我们的给该方法指定了HttpPost的方法,也指定了参数名为str的参数,请求的方法是post方法,参数也是str,却匹配不到该函数。

1.第一步。

给string str加上[FromBody]进行修饰。

如下所示。

 

  [HttpPost]
        public string Post([FromBody]string str)
        {
            return str;
        }

我们在在postman中用同样的方法进行post访问。

 


返回值为null 也就是说匹配到了webapi中的post方法,但是该方法根本没有接收到postman中传递过去的key 为str  Vaue为123的值。

2.第二步

查阅相关资料后,得出结论,原来当方法中只有一个string类型的参数时,不能给该键值对赋予key值,也就是说key必须得空着。

如下所示。


我们在postman中把key空着,然后value为123,结果webapi中的post函数成功获取到了改值。

不知道微软在这样设计的时候出于什么考虑。

3.第三步。

post函数两个string类型的参数。填加post的重载方法,如下:

 

  [HttpPost]
  public string Post([FromBody]string str1, [FromBody]string str2)
 {
   return string.Format("第一个str是:{0},第二个str是{1}",str1,str2);
 }
我在在postman中和上例一样,不指定key,然后指定两个value,看看结果会怎样?

 


当两个key都是空着的时候,出现错误,提示,“无法将多个参数(“str1”和“str2”)绑定到请求的内容。”

也就是说多个string参数,那么key不能空着,我们加上试试。


结果让人很意外,任然是不可以。

4.第四步,

那么,当有多个string类型的参数怎么办呢?

我想到的解决办法是用object类型取代string类型。

更改如下:

 

 public class HomeController : ApiController
    {
        [HttpPost]
        public string Post(Str str)
        {
            return string.Format("第一个str是:{0},第二个str是{1}",str.Str1,str.Str2);
        }
    }
    public class Str{
        public string Str1 { get; set; }
        public string Str2 { get; set; }
    }
然后我们在postman 访问试试。
我们看到,成功收到了str1和str2的值。

 

5.第五步

其实还有更简单暴力的办法,在路由中通过url中给参数指定值。

代码如下:

 

 [HttpPost]
        [Route("~/Post/{Str1}/{Str2}")]
        public string Post(string Str1,string Str2)
        {
            return string.Format("第一个str是:{0},第二个str是{1}",Str1,Str2);
        }

然后我们post的Url为http://localhost:56866/Post/123/456

 

结果如图所示:

我们直接在url中按照路由规则给str1和str2指定了值,并且WebApi中的post函数成功获取到了其值。

该i昂木的GitHub地址:https://github.com/liuzhenyulive/WebApiString

有什么疑问欢迎留言与我交流。



 

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
[转帖]ASP.NET 2.0中CSS失效的问题总结
ASP.NET 2.0中CSS失效的问题总结 经常有人遇到ASP.NET 2.0(ASP.NET 1.x中可能是有效的)中CSS失效的问题,现将主要原因和解决方法罗列如下: 1,CSS文件路径不正确 这个问题属于Web开发中的基础问题,一般采用相对路径会出现这样的问题,或者样式文件写在了母版页里面,在内容页与母版页不在同一级目录下时会出现这样的问题。
673 0
asp.net development server 挂起问题解决
昨日突然发现调试asp.net应用程序时,IE总是显示connecting,长时间不显示页面。开始分析是什么原因,发现firefox访问此asp.net development server,也是长时间没有显示页面。
716 0
ASP.NET性能优化问题
一、SqlDataRead和Dataset的选择   Sqldataread优点:读取数据非常快。如果对返回的数据不需做大量处理的情况下,建议使用SqlDataReader,其性能要比datset好很多。
755 0
数据类型封装、小数运算问题、String类
封装数据类型(在java.lang包下):封装数据类型声明结构:(也可以单做数据类使用) byte Byte ;    short  Short;  int  Integer(长用类型 ) ; long  Long;     float  Float;   double    Double; char  Character; boolean Boolean; 封装数据类型:                       能通过类名调用的方法或属性都是静态的static封装数据类型,对基本数据类型的封装,封装数据类型是一个工具类。
1001 0
Dozer对象映射框架Map到JSONString映射问题排查
## 引言 Dozer是一个优秀的对象映射的框架,可以帮助程序员减少大量的对象之间映射的get/set代码,在ATA上有好几篇文章介绍了dozer的使用: [dozer开发手册](http://www.atatech.org/articles/31144) [使用Dozer帮你提高开发效率(解决繁琐的DO转BO、TO转BO问题)](http://www.atatech.org/article
4698 0
遇到API安全问题怎么办?F5 API加固解决方案怎么样?
  在各种APP泛滥的现在,背后都有同样泛滥的API接口在支撑,其中鱼龙混杂,直接裸奔的WEB API大量存在,安全性令人堪优在以前都采用自已定义的接口和结构,对于公开访问的接口,专业点的都会做下安全验证,数据签名之类。
1687 0
疑难杂怪问题分享之异常的ping
ping域名的记录看起来一切正常,但是ping域名的时候,从打印出第一行PING xxxx到打印后续64 bytes fromxxx中间要等待10多秒,后续的打印结果都很正常。
299 0
mysql 5.7 忘记密码,及修改密码问题,密码列不再是Password ,而是authentication_string
5.5版本 1.首先确认服务器出于安全的状态,也就是没有人能够任意地连接MySQL数据库。  因为在重新设置MySQL的root密码的期间,MySQL数据库完全出于没有密码保护的  状态下,其他的用户也可以任意地登录和修改MySQL的信息。可以采用将MySQL对  外的端口封闭,并且停止Apache以及所有的用户进程的方法实现服务器的准安全  状态。最安全
5880 0
+关注
码农阿宇
沉迷.Net,无法自拔
74
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载