从简单类型到复杂类型的参数传递用例,以及传递简单string类型的解决办法

一,简单类型的传值

比如 public Users Get(int id) ,它可以使用两种方式获取:

api/default/5

$.get("/api/default",{id:90}, function (data) {/* 处理逻辑 */});

前者不需要注明参数名,后者适用于存在多个简单参数的情况,例如比较实际的案例以及对应的获取方式是:

public Users Get(int id, int id2)

$.get("/api/default",{id:90,id2:88}, function (data) {});

二,简单类型传值中涉及到string的传递

对于简单类型的参数传值,唯一有一点可以称得上是问题的问题,便是遇到例如:public string Post(string v) 这样的情况,如果你直接post一个参数名为v的字符串过去,例如:$.post("/api/testString",{ v: "i want testString" }, function (data) {}); ,那么结果是无功而返的:

通过搜索stackoverflow以及encosia(详见这里),下面是解决方案:

首先为参数覆盖上[FromBody]特性,比如 public string Post([FromBody]string v),然后:

解决方案1:$.post("/api/testString", "=i want testString" , function (data) {}); //在前面加一个等于号

解决方案2:$.post("/api/testString",{ "": "i want testString" }, function (data) {}); //传递一个空参数名

问题是解决了,可是本人也唠叨一句:这像什么话。

诚然道有些朋友会说“Web API不是这样使用的,它是为某某某情况……你应该构造一个对象……”,但是,既然存在如此的使用情况,本文所针对就是可能出现的问题而作出解决方案。

三,传递复杂类型:

首先定义两个类型,

public class Users

{

public int uid { get; set; }

public string username { get; set; }

}

public class DoubleStringPrameter

{

public string Pram1 { get; set; }

public string Pram2 { get; set; }

}

对于需要发送两个字符串参数的情况,必须传递一个对象了:

public string Post(DoubleStringPrameter pram)

$.post("/api/testStringUsingObject", { Pram1: "参数1的值", Pram2: "参数2的值" }, function (data) {}); //不需要指定参数名

而对于需要传递更加复杂的对象,例如同时传递 DoubleStringPrameter 和 Users ,就需要这么封装:

public class using2ObjController : ApiController

{

public string Post(IMultiObj obj)

{

return "uid:" + obj.User.uid + ",username:" + obj.User.username + "||pram1:" +

obj.StringPrameter.Pram1 + ",pram2:" + obj.StringPrameter.Pram2;

}

}

public class IMultiObj //定义一个类型封装

{

public DoubleStringPrameter StringPrameter { get; set; }

public Users User { get; set; }

}

然后这么传递:

$.post("/api/using2Obj", { User: { uid: ‘80909‘, username: ‘amazon‘ }, StringPrameter: { Pram1: ‘参数1的值‘, Pram2: ‘参数2的值‘ } },

  function (data) {});

对于简单类型传值中涉及到string的传递,本人的意见是:作为一个API,如果提供了某些功能,那么就必须实现,如果做不到或者不愿意做,就应该在编译期间断绝问题发生的可能(就不应该让 Post(string a)、Post(string a, string b)、Post(Users  u1, Users u2) 通过编译),而不应是在使用期间采取对用户做出 “方言” 级的限制,这已经有违强类型语言的设计初衷,试想这样的情况:某一夜某个零时工打瞌睡写了Post(Users  user, Content content),编译过去了,一个月后客户端那边都已做了2万行代码,到时候才说不能这样使用(不能用你还写出来干什么),这便是设计上的失职了。

如今这些不是问题的问题在2.0上依然存在,它既是Bug,同时也不是Bug。

对此本人更偏向于使用WCF或MVC的return Json(),出于Web API的问题本身,而作此文。

时间: 2024-10-13 11:25:47

从简单类型到复杂类型的参数传递用例,以及传递简单string类型的解决办法的相关文章

Mybatis:使用bean传值,当传入值为Null时,提示“无效的列类型”的解决办法

问题描述: 在使用mybatis对数据库执行更新操作时,parameterType为某个具体的bean,而bean中传入的参数为null时,抛出异常如下: org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.type.TypeException: Could not set parameters for mapping: ParameterMapping{property='pxh',

C++ wchar_t介绍以及和string类型的转换

首先介绍下wchar_t类型 一.wchar_t类型的由来 我们知道char类型变量可以存储一个字节的字符,它用来保存英文字符和标点符号是可以的,但是对于汉字.韩文以及日文这样的字符却不可以,因为汉字.韩文以及日文每一个文字都占据两个字节,为了解决这个问题,c++提出了wchar_t类型,称之为双字节类型,又称宽字符类型. 二.下面是一个范例 int main(int argc, wchar_t* argv[]) { //使用setlocale函数将本机的语言设置为中文简体 setlocale(

(转)Java中String类型的参数传递问题

这篇文章主要介绍了简单谈谈Java中String类型的参数传递问题的相关资料,需要的朋友可以参考下 提要:本文从实现原理的角度上阐述和剖析了:在Java语言中,以 String 作为类型的变量在作为方法参数时所表现出的“非对象”的特性. 一.最开始的示例 写代码最重要的就是实践,不经过反复试验而得出的说辞只能说是凭空遐想罢了.所以,在本文中首先以一个简单示例来抛出核心话题: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 public clas

Java中String类型的参数传递问题的解析

一.引入示例 public class StringAsParamOfMethodDemo { public static void main(String[] args) { StringAsParamOfMethodDemo sapm = new StringAsParamOfMethodDemo(); sapm.testA(); } private void testA() { String originalStr = "original"; System.out.println

再谈怎样以最简单的方法将泛型为String类型的集合或String类型的数组转化为逗号间隔字符串形式

今天review代码,看见某些大爷在将泛型为String类型的集合或String类型的数组转化为逗号间隔字符串形式时仍然仅仅顾结果不注重过程,"大爷"咱能负点责任吗? 将泛型为String类型的集合转化为逗号间隔字符串形式: 測试类: package com.ghj.packageofclient; import java.util.ArrayList; import java.util.List; import com.ghj.packageoftool.StringUtils; p

Android ImageCache图片缓存,使用简单,支持预取,支持多种缓存算法,支持不同网络类型,扩展性强

本文主要介绍一个支持图片自动预取.支持多种缓存算法的图片缓存的使用及功能.图片较大需要SD卡保存情况推荐使用ImageSDCardCache. 与Android LruCache相比主要特性:(1).  使用简单   (2). 轻松获取及预取新图片  (3).  可选择多种缓存算法(FIFO.LIFO.LRU.MRU.LFU.MFU等13种)或自定义缓存算法   (4).  省流量性能佳(有且仅有一个线程获取图片)   (5).  支持不同类型网络处理  (6).  可根据系统配置初始化缓存 

【Java/Android性能优5】 Android ImageCache图片缓存,使用简单,支持预取,支持多种缓存算法,支持不同网络类型,扩展性强

本文转自:http://www.trinea.cn/android/android-imagecache/ 主要介绍一个支持图片自动预取.支持多种缓存算法.支持二级缓存.支持数据保存和恢复的图片缓存的使用.功能及网友反馈的常见问题解答. 与Android LruCache相比主要特性:(1). 使用简单  (2). 轻松获取及预取新图片  (3). 包含二级缓存  (4). 可选择多种缓存算法(FIFO.LIFO.LRU.MRU.LFU.MFU等 13种)或自定义缓存算法  (5). 可方便的保

再谈如何以最简单的方法将泛型为String类型的集合或String类型的数组转化为逗号间隔字符串形式

今天review代码,看见某些大爷在将泛型为String类型的集合或String类型的数组转化为逗号间隔字符串形式时仍然只顾结果不注重过程,"大爷"咱能负点责任吗? 将泛型为String类型的集合转化为逗号间隔字符串形式: 测试类: package com.ghj.packageofclient; import java.util.ArrayList; import java.util.List; import com.ghj.packageoftool.StringUtils; pu

架构师养成记--31.Redis的String类型

Redis一共分为五种基本数据类型:String.Hash.List.Set.ZSet String类型是包含很多张类型的特殊类型,并且是二进制安全的.比如对序列化的对象进行存储,比如一张图片进行二进制存储,比如一个简单的字符串数值等等. Set和get方法的使用 设置值:set name sgm (多次设置name值,后一次会覆盖前一次) 取值 get name 删除值:del name setnx,nx的意思就是not exists:不覆盖赋值,如上例,如果name存在就不设置了. sete