C# WebApi Get请求方式传递实体参数的方法示例

前言

我又搞回笃NET啦!java之路真是命运多舛,好事多磨。不过,也许我已经进入无招胜有招,博取众家之长、融会贯通的地步了。

对于WebApi,今天又有了一些新的了解。

话说,Get请求方式,参数会附在Url后面,称为QueryString,传递给服务器;而POST方式,则将参数放在消息体内。采用QueryString的话,简单,方便,但只适合参数比较少的情况;但有的时候,需要传递比较多、比较复杂的参数,比如,组合条件查询。

组合条件查询,条件会很多,通常会用一个实体类来封装,传递给服务器。用post方式肯定是可以的,驾轻就熟。问题是,RESTful原则,是将一切抽象成资源,对资源的不同请求方式,代表了对资源的不同操作。按道理,post难道不是代表插入吗?为啥查询也要用到post?

GET方式下,也可以将参数提交给服务器?但查来查去,ajax好像可以;但服务器端,使用WebClient就没有找到现成的例子,不知道该咋整。只好用最原始的方法,将实体类转化成QueryString,附在地址后面了。有两个问题:

1、实体类如何转换成QueryString这种键值对格式?
2、服务器端如何提取?

一、实体类如何转换成QueryString这种键值对格式?

叫键值对可能不够专业,叫NameValueCollection?

很遗憾,也没找到啥现成的例子。

最后祭出反射,来拼装QueryString

二、服务器端如何提取QueryString里参数,自动变成一个实体类?

参数前面标注[FromUri]特性

上代码。

实体类:

namespace BaseLT.Core.Contract
{
 public class Request
 {
 public Request();

 public int Top { set; }
 public int PageSize { get; set; }
 public int PageIndex { get; set; }
 public string OrderBy { get; set; }
 public int SortState { get; set; }

 public bool CompareObject<T>(T obj1, T obj2);
 public void ExtjsInit();
 }
}

WebApi服务器端:

public class TankController : ApiController
{
 [HttpGet]
 [Route("api/tank/matters/public/{id=0}")]
 public IEnumerable<Matter> Get(int id,[FromUri]Request req)
 {
 return do sth;
 }
}

客户端:

[TestMethod]
public void TestTankApi()
{
 string url = "http://localhost/ybjzuser.api/api/tank/matters/public/";
 url += getQueryString(new Request()
 {
 PageIndex = 1,
 PageSize = 100
 });

 string re;
 using (WebClient webClient = new WebClient())
 {
 webClient.Encoding = Encoding.GetEncoding("utf-8");
 re = webClient.DownloadString(url);
 }
 Assert.AreNotEqual(null, re);
 Console.WriteLine(re);
}
static string getQueryString(Request req)
{
 StringBuilder query = new StringBuilder("?");

 PropertyInfo[] propertys = req.GetType().GetProperties();
 foreach (PropertyInfo pi in propertys)
 {
 if (pi.CanRead)
 {
 query.Append($@"{pi.Name}={pi.GetValue(req)}&");
 }
 }

 return query.ToString();
}

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。

(0)

相关推荐

  • C#实现记事本查找与替换功能

    看了网上关于记事本的查找替换很多,但都没有达到我想要的结果,然后自己学习总结了以下的方法: 统计字符串(汉字,字母,数字,字符) 先上效果图 定义全局变量 #region =★*★*★= [查找替换]的自定义变量 =★*★*★= /// <summary> 获取或设置查找起始位置 </summary> static int Index = 0; /// <summary> 查找到的字符串数量 </summary> static int count = 0;

  • C#用记事本编写简单WinForm窗体程序

    平时我们编写WinForm程序经常使用VS进行拖控件的方式,这样做虽然简单,但是无法深入了解WinForm程序的本质.其实,用记事本也可以编写出VS编写的WinForm程序.还是直接看代码吧: 1.打开记事本,写入以下代码,另存为hello.cs文件 using System; using System.Windows.Forms; namespace Hello { public class Form1:Form { private System.Windows.Forms.Button bt

  • C#实现简单记事本程序

    本文实例为大家分享了使用C#写出一个简单的记事本程序,供大家参考,具体内容如下 编程语言: C# 编程环境: Visual Studio 2013 运行环境: .NET Framework 4.5 预览: 功能: 标题栏 显示文件标题 菜单栏 各类菜单命令 文件- 新建 - 打开 - 保存 - 另存为 - 页面设置 - 打印 - 退出 编辑 - 撤销 - 剪切 - 复制 - 粘贴 - 全选 - 时间/日期 格式 - 自动换行 - 字体 视图 - 状态栏 - 工具栏 - 全屏模式 帮助 - 开源许

  • C#实现简单文本编辑器

    本文实例为大家分享了C#实现简单文本编辑器的具体代码,供大家参考,具体内容如下 建立一个窗体文件,实现对文件的编辑保存和对txt文件的打开 界面设计: 程序源代码: //form1.cs using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text;

  • C# 填充Excel图表、图例背景色的实例代码

    填充背景色,一般可以选择多种不同样式来填充背景,包括填充为纯色背景.渐变背景.图片背景或者纹理背景等.下面的内容将分别介绍通过C#来设置Excel中图表背景色.以及图表中的图例背景色的方法. 使用工具:Spire.XLS for .NET dll引用:下载安装后,注意在程序中添加引用Spire.Xls.dll(dll文件在安装路径下的bin文件夹中获取) [示例1]填充图表背景色 测试文档如下: Step1:加载文档 //实例化Workbook类的对象 Workbook workbook = n

  • C#/.NET使用git命令行来操作git仓库的方法示例

    我们可以在命令行中操作 git,但是作为一名程序员,如果在大量重复的时候还手动敲命令行,那就太笨了. 本文介绍使用 C# 编写一个 .NET 程序来自动化地使用 git 命令行来操作 git 仓库. 这是一篇很基础的入门文章. 最简单的运行 git 命令的代码 在 .NET 中,运行一个命令只需要使用 Process.Start 开启一个子进程就好了.于是要运行一个 git 命令,我们其实只需要这句足以: Process.Start("git", "status")

  • C#读取Excel到DataTable的方法示例

    前提 在Windows下进行数据处理的时候最常见的情况莫过于读取Microsoft的Excel文件了,Excel的普及率惊人,是事实上的标准.以前的开发中我采用调用第三方类库 NPOI的方式来处理Excel.这个方式有两个缺点: 需要依赖第三方类库NPOI NPOI支持几乎全功能的Office条件,缺点就是复杂度也高. 如果只是简单的导入数据,完全可以有更加简单的方案,方案的限制条件为: 只支持Windows平台 只读取Excel文件 支持xls和xlsx文件格式 依赖 还是有依赖的 2007

  • 详解C#中的session用法

    Session具有以下特点: (1)Session中的数据保存在服务器端: (2)Session中可以保存任意类型的数据: (2)Session默认的生命周期是20分钟,可以手动设置更长或更短的时间. 需要注意的是在Session变量存储过多的数据会消耗比较多的服务器资源,在使用session时应该慎重 存入字符串: Session["userName"] = "aaa"; 这样取值: string str = Session["userName"

  • 详解C#开发Android应用程序的流程

    手把手教你用C#开发Android应用程序的方法和流程摘要:用C#能开发RFID-android吗?C#真的能开发android程序吗?C#开发android程序的工具是什么?开发步骤.方法以及流程是怎样的?出学android开发者一定会提出这些疑问,本文一一解答这些疑问,为安卓初学者提供入门指引. Android系统一下子铺天盖地而来,让人目不暇接.兴奋的同时也让部分开发人员犯难了!要知道从熟知的Wince.Mobile开发语言C#跨越到RFID-Android的Java.可不是一朝一夕就能完

  • C#中#define后面只加一个参数的解释

    #define只加一个参数 的解释 <stdio.h> 里有: #ifndef __STDIO_H #define __STDIO_H 这个__STDIO_H代表什么?而define的用法不是后面加两个字符串吗,它这里却只加一个字符串,是什么意思? 还有很多头文件里都有如下语句 #if __STDC__ #define _Cdecl #else #define _Cdecl cdecl #endif __stdc__,cdecl代表什么? 比方说你#include进来一个stdio.h,再#i

随机推荐