主页 > 知识库 > 网络编程 > ASP/.NET >

ASP.NET MVC4中调用WEB API的四个方法(一)(2)

来源: 作者: 发表于:2012-06-11 08:23  点击:
因此,现在由于我们的WEB API控制器是customers,因此如何要得到某个顾客的信息,可以如下的方式访问: /api/customers/ALFKI 创建自定义JSON格式化器 在通过浏览器去访问WEB API时,默认的显示方式是XML。Web API框


  因此,现在由于我们的WEB API控制器是customers,因此如何要得到某个顾客的信息,可以如下的方式访问:

  /api/customers/ALFKI


  创建自定义JSON格式化器

  在通过浏览器去访问WEB API时,默认的显示方式是XML。Web API框架会自动根据访问客户端的不同从而返回不同的格式的数据。现在,大多数情况下,用户希望返回的格式数据是JSON形式。然而,在本文写作时,使用默认的Web API提供的JSON格式化处理器以及Entity Framework搭配工作时,会出现一些小BUG.The entities of the EF data model have IsReference property of DataContractAttribute set to True.EF EF数据模型的实体将DataContractAttribute中的IsReference属性设置为true,如下:


   ...
[Serializable()]
[DataContractAttribute(IsReference=true)]
public partial class Customer : EntityObject
{
...
}



  默认情况下,Web API使用的是DataContractJsonSerializer类进行JSON序列化。但默认的JSON序列化类不能处理这样的实体类,并且在运行期间抛出如下异常:

  The type 'WebAPIDemo.Models.Customer' cannot be serialized to JSON because its IsReference setting is 'True'. The JSON format does not support references because there is no standardized format for representing references. To enable serialization, disable the IsReference setting on the type or an appropriate parent class of the type.

  为了克服则个问题,可以创建一个自定义的JSON格式化器。幸运的是,有第三方的JSON序列化器给我们选择使用,比如Json.NET。在本文中,将会简单介绍使用JSON.NET去完成序列化,完整的代码可以在附件中下载。

  一个自定义的序列化器主要是继承了MediaTypeFormatter的基类。我们编写的这个JSON序列化类为JsonNetFormatter,在使用前要确认你的应用工程中已经引用了Json.NET的类库,如下图:

  下面我们来看下JsonNetFormatter的基础代码:


     public class JsonNetFormatter : MediaTypeFormatter
{
...
}
  可以通过重写MediaTypeFormatter中的一些方法如下:
  protected override bool CanReadType(Type type)
{
...
}
  
protected override bool CanWriteType(Type type)
{
...
}
  
protected override Task<object> OnReadFromStreamAsync(Type type, Stream stream,
                                                
        HttpContentHeaders contentHeaders,
                                              
          FormatterContext formatterContext)
{
...
}
  
protected override Task OnWriteToStreamAsync(Type type, object value, Stream stream,
                                     
          HttpContentHeaders contentHeaders,
                                     
          FormatterContext formatterContext,
                               
                TransportContext transportContext)
{
...
}



  具体的代码在附件中可以详细查看。一旦创建了JSON序列化器后,就需要告诉Web API框架去替换使用原先默认的JSON序列化框架。可以在global.asx中实现:


  protected void Application_Start()
{
    HttpConfiguration config = GlobalConfiguration.Configuration;
    JsonSerializerSettings settings = new JsonSerializerSettings();
    settings.Converters.Add(new IsoDateTimeConverter());
    JsonNetFormatter formatter = new WebAPIDemo.Http.Formatters.JsonNetFormatter(settings);
    config.Formatters.Insert(0, formatter);
  
    AreaRegistration.RegisterAllAreas();
    RegisterGlobalFilters(GlobalFilters.Filters);
    RegisterRoutes(RouteTable.Routes);
    BundleTable.Bundles.RegisterTemplateBundles();
}



  其中请注意粗体字部分,这里创建了JSON自定义器的实例,并且增加到以HttpConfiguration类的配制的序列化配制集合中。

  这样,我们就可以开始在客户端中调用WEB API,并使用自定义的JSON解析器进行处理。


  使用jQuery 调用WEB API

  接下来,我们在Index控制器中新建立一个视图,如下图:

  接下来就可以根据实际需要,决定在页面中显示customer表中的多少列,最后的页面显示如下:

  当页面加载时,使用GET()方法去调出customer表的所有数据,而当使用INSERT,UPDATE,DELETE功能时,是通过jQuery去调用web api的。下面我们学习下通过jQuery去调用WEB API。

  首先,我们设计每一行的HTML代码,如下:


  <table id="customerTable" border="0" cellpadding="3">
    <tr>
        <th>Customer ID</th>
        <th>Company Name</th>
        <th>Contact Name</th>
        <th>Country</th>
        <th>Actions</th>
    </tr>
    <tr>
        <td><input type="text" id="txtCustomerId" size="5"/></td>
        <td><input type="text" id="txtCompanyName" /></td>
        <td><input type="text" id="txtContactName" /></td>
        <td><input type="text" id="txtCountry" /></td>
        <td><input type="button" name="btnInsert" value="Insert" /></td>
    </tr>
</table>


有帮助
(0)
0%
没帮助
(0)
0%