One ASP.NET-使用ASP.NET MVC 4 Beta和ASP.NET Web API 制作JSON Web API

[原文发表地址] One ASP. NET - Making JSON Web APIs with ASP. NET MVC 4 Beta and ASP. NET Web API

[原文发表时间] 2012-02-25 12:07 AM

ASP.NET MVC 4 测试版上周出来了。它有很多新的功能以及一些惊喜,这让我们更接近于"One ASP.NET"的想法。我在这周的MSDN Flash 电子新闻稿(你可以在这里订阅 MSDN Flash;)谈到过这一点。这里是我所说的一部分:

不要把ASP. NET想为一个孤立的小岛。它是大社区里的公民。随着越来越多的ASP. NET 成为开源,而且我们每天努力推动其成为开放的。我们想要让ASP. NET更可插入、 更开放、 更有趣。我们已计划了一件大事情 - 一件会给你惊喜的事情。我希望你加入对话和社区

这里是MVC 4 中改进的一些东西。

在测试版中的新功能

  • ASP.NET Web API
  • 刷新过的和现代化的默认项目模板
  • 新的移动项目模板
  • 许多新的功能,以支持移动应用程序
  • 自定义代码生成
  • 加强对异步方法的支持
  • 版本说明中阅读完整的功能列表

你可能在过去听过我关于LEGO的谈论,展示了如何用NuGet将东西合适地放在一起。我提到过文本中的新功能和Web Forms中的One ASP.NET。这里是我在内部展示了几次的图表。我们会不断添加更多的详细信息来阐释如何将它们合适地放在一起以及你可以用https://asp.net/vnext中的它们来构建什么。

All the parts of ASP.NET, all the subsystems are all part of the larger ASP.NET community

事实上,我专注于One ASP.NET,"WCF Web API"现在是 ASP.NET Web API ,它与 ASP.NET MVC一起使用。即使今天它推出了 MVC 4 测试版,不要让它远离了One ASP.NET的愿景。在 ASP .NET Web Forms 中,你可以使用Web API 没问题。这就是重点。;)

你为什么想要一个 Web API

如果你的应用程序——你的业务数据模型——有一个 API,然后突然你的 Web API 被开放到本机应用程序,iPhone 应用程序,Windows 8应用程序,不管是什么应用程序。它是 Web 服务。还记得那些吗?

我可以将XML 或 JSON 或别的东西与我的 API一起使用。JSON 对于移动的应用程序来说是很不错的选择,因为它连接速度慢。例如你可以从 jQuery 调用一个 API, 并更好地利用客户端的机器和浏览器。你可以制作一个 Gmail 类型的单个页面或者混合页面 ;随便你。

如何将它全部装入OneASP. NET

One ASP.NET 背后的想法是希望人们能够构建丰富的应用程序,它包括了SignalR的实时组件;与 Web API一起使用且干净、 简单的 Api;有KnockoutJS且所有的都在一个页面; MVC 页面,Web Forms页面或Web 页面;以及现有的 ASP.NET系统,比如OData、 ASMX、 和更多。我想要一些开放源项目,例如 JSON.NET,KnockoutJS,SignalR,Backbone, MongoDB,Scaffolding,NHIbernate,Ninject (列表将会继续增加)。 让所有的东西都在相同的ASP .NET LEGO沙盒中运作。我们会把所有这些子组件放在 NuGet 上,它们将住在社区组件的旁边,你只需从一些基本的模板着手,并添加你想要的部分,你就将能够构建ASP.NET应用程序。我想要人们使用他们所想要的部件,并交换出他们不想要的。所有的东西应该在一起工作。我总是说我想像微软一样那么快地把我们可以做到所有东西都成为开放源,我会继续坚持推动的,即使这会杀掉我的老板。

NotTwitter

Lemme 让NotTwitter 应用程序真正快速起来了。这里是一个快速模式:

    1: publicclassNotATweet
    2: {
    3:     publicintID { get; set; }
    4:     publicstringUsername { get; set; }
    5:     publicstringText { get; set; }
    6:     publicDateTime Published { get; set; }
    7: }
    8:  

我将使用默认的基架来获取用户界面,但然后我将安装MvcScaffolding 额外的 NuGet 包,使用资源库模式来封装它。

PS>Scaffold -ModelType NotATweet -DbContext NotTwitterContext -Scaffolder Repository -Force

然后我就会封装一个使用此Repo 的控制器(你可以从用户界面或 NuGet 包控制台中实现这一点):

Scaffold -Controller NotATwitter -ModelType NotATweet -DbContext NotTwitterContext -Scaffolder MvcScaffolding.Controller -Repository

而这里是由此产生的 Scaffolded 的用户界面。

It's Not Twitter

我的页面的控制器是标准票价。现在我会通过添加控制器来添加一个,以此来为我的 NotTwitter 应用程序制作一个API。

我将改变我的路线来让 /api 转到我的应用程序 API 控制器 ;

    1: routes.MapHttpRoute(
    2:     name: "DefaultApi",
    3:     routeTemplate: "api/{id}",
    4:     defaults: new { controller = "NotATwitterAPI", id = RouteParameter.Optional }
    5: );

这里是我的 Web API 控制器代码。要注意几个事情。我说的是与页面控制器使用的相同的Irepository。我在返回适合每个响应的 HTTP 状态代码。请参阅如何创建之后 (我发布的JSON NotATweet表示形式),返回 HttpStatusCode.Created 201,设置标头的位置以包括新资源的位置?

    1: public class NotATwitterAPIController : ApiController
    2: {
    3:     private readonly INotATweetRepository notatweetRepository;
    4:  
    5:     public NotATwitterAPIController(INotATweetRepository notatweetRepository)
    6:     {
    7:         this.notatweetRepository = notatweetRepository;
    8:     }
    9:  
   10:     // GET /api/notatwitterapi
   11:     public IQueryable<NotATweet> Get()
   12:     {
   13:         return notatweetRepository.All;
   14:     }
   15:  
   16:     // GET /api/notatwitterapi/5
   17:     public NotATweet Get(int id)
   18:     {
   19:         var notatweet = notatweetRepository.Find(id);
   20:         if (notatweet == null)
   21:             throw new HttpResponseException(HttpStatusCode.NotFound);
   22:         return notatweet;
   23:     }
   24:  
   25:     // POST /api/notatwitterapi
   26:     public HttpResponseMessage<NotATweet> Post(NotATweet value)
   27:     {
   28:         if (ModelState.IsValid)
   29:         {
   30:             notatweetRepository.InsertOrUpdate(value);
   31:             notatweetRepository.Save();
   32:  
   33:             //Created!
   34:             var response = new HttpResponseMessage<NotATweet>(value, HttpStatusCode.Created);
   35:  
   36:             //Let them know where the new NotATweet is
   37:             string uri = Url.Route(null, new { id = value.ID });
   38:             response.Headers.Location = new Uri(Request.RequestUri, uri);
   39:  
   40:             return response;
   41:  
   42:         }
   43:         throw new HttpResponseException(HttpStatusCode.BadRequest);
   44:     }
   45:  
   46:     // PUT /api/notatwitterapi/5
   47:     public HttpResponseMessage Put(int id, NotATweet value)
   48:     {
   49:         if (ModelState.IsValid)
   50:         {
   51:             notatweetRepository.InsertOrUpdate(value);
   52:             notatweetRepository.Save();
   53:             return new HttpResponseMessage(HttpStatusCode.NoContent);
   54:         }
   55:         throw new HttpResponseException(HttpStatusCode.BadRequest);
   56:     }
   57:  
   58:     // DELETE /api/notatwitterapi/5
   59:     public void Delete(int id)
   60:     {
   61:         var notatweet = notatweetRepository.Find(id);
   62:         if (notatweet == null)
   63:             throw new HttpResponseException(HttpStatusCode.NotFound);
   64:  
   65:         notatweetRepository.Delete(id);
   66:     }
   67: }
 

然后我用Fiddler点击api。注意JSON 如何从另一端跳了出来?

ASP.NET Web API in Fiddler

我将更改接受标头为接受: xml 应用程序 / 和 xml 弹出。你可以插入你自己的,并让 Web API 弹出 iCal 或任何你所喜欢的。你可以制作媒体格式程序或甚至插入其他的默认值。例如,这里是 针对Web API的JSON.NET 格式程序

GET returns a 200 and an XML list of NotTweets

我们现在可以制作 NotTweets 吗?你可以使用工具例如 JSON 格式程序来手工测试 JSON 。现在,我将粘贴一个Json 序列化的 NotTweet:

POST gets back an HTTP 201

注意结果是 HTTP 201 创建的。如果我然后得到 /api,我可以看到它在那儿:

Standard /api GET

我也可以用URL 和查询字符串影响东西,例如GET/api?$orderby=Username HTTP/1.1,所以我可以查询组件,在没有完全买进 OData 样式的Url的情况下,如果不想要的话。

Web API with an orderby querystring

正如我所提到的,我可以将XML 或 JSON 或别的东西与我的 API一起使用。JSON 对于移动的应用程序来说是很不错的选择,因为它连接速度慢。你可以从 jQuery 调用此 API ,并更好地利用客户端的机器和浏览器。

也有"调用"的一面,这是 HttpClient。你可以向其他像 Twitter 的Api 调用并使用 OAuth 进行身份验证。其他人可能会从使用 jQuery 和 Javascript 从客户端调用你的 API,或使用 HttpClient从服务器端调用.

Web API有着比本示例更多的可能性。花一些时间在Henrik的博客(他帮助发明了 HTTP !听听他的播客的插曲)

我们在ASP.NET的网站https://ASP.net/web-api有一个新的部分,那儿有很多的信息。这里是一些用于将 API 轻松地添加到你的应用程序的资源。你甚至可以在服务或其他应用程序中自己托管你的Web API(无需IIS)

相关的链接

· 针对Visual Studio 2010的ASP. NET MVC 4 测试版

· 针对Visual Studio 2010的ASP.NET MVC 4 Web 平台安装程序

· 下载独立的 ASP.NET MVC 4 测试版安装程序可执行文件

· Jon Galloway对 ASP.NET MVC 4 测试版的看法

· Henrik的博客

· 在 ASP .NET Web API中的异步流

· 使用ASP. NET Web API 和ASP. NET Web Forms(请参阅如何将所有的放在一起 !)

· 针对Visual Studio 11 开发人员预览的ASP. NET MVC 4 开发人员预览:

· 针对Visual Studio 11 开发人员预览的ASP.NET MVC 4 开发人员预览 Web 平台安装程序

· 下载安装程序可执行文件

· NuGet

· ASP.NET 中托管的 web API: AspNetWebApi

· 自我托管的Web API AspNetWebApi.Selfhost

· HttpClient 包括 XML JSON 的格式程序: System.Net.Http.Formatting

· 导航和处理 JSON的 JsonValue: System.Json

· 视频: 入门Web API

· 教程:你的第一个 Web API

· 视频: 你的第一个 Web API

· 在 MVC 4 测试版中用ASP .NET Web API 构建 HTTP 服务。

创建一个支持 CRUD 操作的 Web API。