asp.net web api参数

翻译自:http://www.c-sharpcorner.com/article/parameter-binding-in-asp-net-web-api/

主要自己学习下,说是翻译,主要是把文章的意思记录下,下面进入正题

web api 对于一般的基本类型(primitive type)(bool,int ,double,log,timespan,datetime,guid,string)直接从url读取,对于复杂类型,web api从请求的body获取,需要使用media type。

对于这个api:

Public HttpResponseMessage Put(int id, Employee employee)
{
…
…
}  

web api 从url中获取id类型,从body中获取employee类型。

当然这是默认情况,我们可以强制web api通过fromurl和frombody特性从url或者从body获取。

fromuri 特性

public class TestData
{
    public string Name
    {
        get;
        set;
    }
    public int Id
    {
        get;
        set;
    }
}  

public HttpResponseMessage Get([FromUri] TestData data)
{……
    return Request.CreateResponse(HttpStatusCode.OK, true);
}  

这样就可以强制从url获取参数,web api生成TestData类。url:http://localhost:24367/api/Employee?Name=Jignesh&Id=10

可以测试下,这样没任何问题。

fromBody 特性

[HttpPost]
public HttpResponseMessage Post([FromBody] string name)
{
    ……
    return Request.CreateResponse(HttpStatusCode.OK, true);
}  

对于这个api,调用时要设置content type:“application/json”

这样设置可以成功调用。

这样就不成功了,web api 支持json string,不支持json 对象,因此只允许在body中有一个参数。

Type converters


可以使用类型转换的方法,将请求的数据按字符串处理,处理过程如下:

namespace WebAPITest
{
    using System;
    using System.ComponentModel;
    using System.Globalization;
    public class TestTypeConverter: TypeConverter
    {
        public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
        {
            if (sourceType == typeof(string))
            {
                returntrue;
            }
            returnbase.CanConvertFrom(context, sourceType);
        }  

        public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
        {
            if (value is string)
            {
                TestData data;
                if (TestData.TryParse((string) value, out data))
                {
                    return data;
                }
            }
            return base.ConvertFrom(context, culture, value);
        }
    }
}  

namespaceWebAPITest
{
    using System.ComponentModel;
    [TypeConverter(typeof(TestTypeConverter))]
    public class TestData
    {
        public string Name
        {
            get;
            set;
        }
        public int Id
        {
            get;
            set;
        }  

        public static bool TryParse(string s, outTestData result)
        {
            result = null;  

            var parts = s.Split(‘,‘);
            if (parts.Length != 2)
            {
                return false;
            }  

            int id;
            string name = parts[1];
            if (int.TryParse(parts[0], out id))
            {
                result = newTestData()
                {
                    Id = id, Name = name
                };
                return true;
            }
            return false;
        }
    }
}  

这样就可以不用写from url这样调用: http://localhost:24367/api/Employee?data=10,jignesh%20trivedi

public HttpResponseMessage Get(TestData data)
{
    ……
    return Request.CreateResponse(HttpStatusCode.OK, true);
}  

Model Binder

另外一种处理参数的方法,实现IModelBinder 接口,只用实现一个方法BindModel,下面的代码从路由中读取raw data,将其转换成TestData,实例是一个简单类型转换,当然Model binder不限于简单类型:

namespace WebAPITest
{
    using System;
    using System.Web.Http.Controllers;
    using System.Web.Http.ModelBinding;
    using System.Web.Http.ValueProviders;
    public class CustomModelBinder: IModelBinder
    {
        static CustomModelBinder()
        {  

        }  

        public bool BindModel(HttpActionContextactionContext, ModelBindingContextbindingContext)
        {
            if (bindingContext.ModelType != typeof(TestData))
            {
                return false;
            }  

            ValueProviderResult val = bindingContext.ValueProvider.GetValue(
                bindingContext.ModelName);
            if (val == null)
            {
                return false;
            }  

            string key = val.RawValue as string;
            if (key == null)
            {
                bindingContext.ModelState.AddModelError(
                    bindingContext.ModelName, "Wrong value type");
                returnfalse;
            }
            TestData result = newTestData();  

            var data = key.Split(newchar[]
            {
                ‘,‘
            });
            if (data.Length > 1)
            {
                result.Id = Convert.ToInt32(data[0]);
                result.Name = data[1];
                bindingContext.Model = result;
                return true;
            }  

            bindingContext.ModelState.AddModelError(
                bindingContext.ModelName, "Cannot convert value to TestData");
            return false;
        }
    }
}  

另外需要注册这个binder,我们需要在configuration中生成一个 model-binder provider 。这里使用自带的provider:SimpleModelBinderProvider

namespace WebAPITest
{
    using System.Web.Http;
    using System.Web.Http.ModelBinding;
    using System.Web.Http.ModelBinding.Binders;
    public static class WebApiConfig
    {
        public static void Register(HttpConfigurationconfig)
        {
            var provider = newSimpleModelBinderProvider(
                typeof(TestData), newCustomModelBinder());
            config.Services.Insert(typeof(ModelBinderProvider), 0, provider);  

            config.MapHttpAttributeRoutes();  

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new
                {
                    id = RouteParameter.Optional
                });
        }
    }
}  

调用这个url:URI: http://localhost:24367/api/Employee?data=10,jignesh%20trivedi,有多种方法使用这个Model binder。在参数上使用特性:

public HttpResponseMessage Get([ModelBinder(typeof(CustomModelBinder))] TestData data)  

{
    ……
    return Request.CreateResponse(HttpStatusCode.OK, true);
}  

另外可以在类上使用这个特性:

[ModelBinder(typeof(CustomModelBinder))]
public class TestData
{
    //......
}  

完了。。。。。

时间: 08-03

asp.net web api参数的相关文章

基于.Net Framework 4.0 Web API开发(2):ASP.NET Web APIs 参数传递方式详解

概述:  ASP.NET Web API 的好用使用过的都知道,没有复杂的配置文件,一个简单的ApiController加上需要的Action就能工作.调用API过程中参数的传递是必须的,本节就来谈谈API使用过程中参数的传递方式. 各种参数传递方式的实现: ASP.NET Web API参数有两种传递方式,一种是请求时携带QueryString,对应API 开发中的FromUrlAttribute属性,也是参数传递默认属性,并且每个API可以含有多个此类型的参数,主要应对GET请求,但此种方式

ASP.Net Web API 的参数绑定[翻译]

原文地址:Parameter Binding in ASP.NET Web API 译文如下: 当Web API相应Controller的一个方法时,它必定存在一个设置参数的过程,叫作数据绑定.这篇文章描述了Web API如何绑定参数以及如何自定义绑定过程. 一般情况下,Web API绑定参数符合如下规则: 如果参数为简单类型,Web API 尝试从URI中获取.简单参数类型包含.Net源生类型(int,bool,double...),加上TimeSpan,DateTime,Guid,decim

ASP.NET Web API中的参数绑定总结

ASP.NET Web API中的action参数类型可以分为简单类型和复杂类型. HttpResponseMessage Put(int id, Product item) id是int类型,是简单类型,item是Product类型,是复杂类型. 简单类型实参值从哪里读取呢?--一般从URI中读取 所谓的简单类型包括哪些呢?--int, bool, double, TimeSpan, DateTime, Guid, decimal, string,以及能从字符串转换而来的类型 复杂类型实参值从

[转]让ASP.NET Web API支持$format参数的方法

本文转自:http://www.cnblogs.com/liuzhendong/p/4228592.html 在不使用OData的情况下,也可以让ASP.NET Web API支持$format参数,只要在WebApiConfig里添加如下三行红色粗体代码即可: using System; using System.Collections.Generic; using System.Linq; using System.Web.Http; using System.Net.Http.Format

让ASP.NET Web API支持$format参数的方法

在不使用OData的情况下,也可以让ASP.NET Web API支持$format参数,只要在WebApiConfig里添加如下三行红色粗体代码即可: using System; using System.Collections.Generic; using System.Linq; using System.Web.Http; using System.Net.Http.Formatting; namespace ProjectManagementWebAppV4 { public stat

ASP.NET Web API 2基于令牌的身份验证

基于令牌的认证 我们知道WEB网站的身份验证一般通过session或者cookie完成的,登录成功后客户端发送的任何请求都带上cookie,服务端根据客户端发送来的cookie来识别用户. WEB API使用这样的方法不是很适合,于是就有了基于令牌的认证,使用令牌认证有几个好处:可扩展性.松散耦合.移动终端调用比较简单等等,别人都用上了,你还有理由不用吗? 下面我们花个20分钟的时间来实现一个简单的WEB API token认证: Step 1: 新建一个空的WEB API项目,项目名称就设置为

Asp.Net Web API 2第四课——HttpClient消息处理器

小分享:我有几张阿里云优惠券,用券购买或者升级阿里云相应产品最多可以优惠五折!领券地址:https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=ohmepe03 Asp.Net Web API 导航   Asp.Net Web API第一课:入门http://www.cnblogs.com/aehyok/p/3432158.html Asp.Net Web API第二课:CRUD操作http://www

使用ASP.NET Web Api构建基于REST风格的服务实战系列教程【开篇】【持续更新中。。。】

小分享:我有几张阿里云优惠券,用券购买或者升级阿里云相应产品最多可以优惠五折!领券地址:https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=ohmepe03 最近发现web api很火,园内也有各种大神已经在研究,本人在asp.net官网上看到一个系列教程,原文地址:http://bitoftech.net/2013/11/25/detailed-tutorial-building-asp-net-

ASP.NET WEB API 初探

本文初步介绍如何简单创建一个ASP.NET Web Api 程序. Web Api 顾名思义就是一个Api接口,客户端可调用此接口进行业务操作.此类应用与 ASP.NET  web服务(即使用扩展名.asmx的web服务文件)有一定的相似之处,又有大不同, ASP.NET Web Api 主要是基于ASP.NET MVC 框架. 废话少说,现在开始. 我用的开发工具是Visul studio 2015. 1. 创建ASP.NET Web Api 项目. 改项目名称为DRMWebAPI,可得如下项