前言

HTTP不仅仅服务于web页面。同一时候也是构建暴露服务和数据的API的强大平台。HTTP有着简单、灵活和无处不在的特点。你能想到的差点儿全部平台都包括有一个HTTP库。所以HTTP服务能够遍及广泛的client,包括浏览器、移动设备和传统桌面应用程序。

ASP.NET Web API是一个在.NET框架上构建web API的框架。在本教程中,你将使用ASP.NET Web API来创建一个返回产品列表的web API。

创建Web API项目

在本教程中,你将使用ASP.NET Web API来创建一个返回产品列表的web API。

前端页面使用jQuery来显示结果。

开启Visual Studio并在開始页面选择New Project。或者在File目录下选择New。然后选择Project。

在Template面板中,选择Installed Templates。然后展开Visual C#节点。

在Visual C#节点下。选择Web。

在项目模板列表中。选择ASP.NET Web Application。

命名项目为“ProductsApp”并点击OK。

在NEW ASP.NET Project对话框中,选择Empty模板。在”Add folders and core references for”,选中Web API。点击OK。

凝视:你也能够用“Web API”模板来创建Web API。

Web API模板使用了ASP.NET MVC来提供API的帮助页面。我在本教程中使用Empty模板是由于我希望不用MVC来展示Web API。通常,你不必了解ASP.NET MVC就能使用Web API。

加入模型

模型是在你的应用程序中表示数据的对象。

ASP.NET Web API能够将你的模型自己主动序列化成JSON、XML或其它格式。然后将其序列化数据写入到HTTP响应消息的body中。

仅仅要client能够读取序列化格式,它就能够反序列化出对象。

差点儿全部client都能解析XML或JSON。并且。client还能通过在HTTP请求的Accept header中设置来指明它想要的格式。

让我们来创建一个表示产品的简单模型吧。

假设Solution Explorer没有显示出来,点击View菜单,然后选择Solution Explorer。在Solution Explorer中。右击Models目录。从上下文菜单中选择Add。然后选择Class。

命名该类为“Product”。加入下面属性到Product类中。

namespace ProductsApp.Models
{
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public string Category { get; set; }
public decimal Price { get; set; }
}
}

加入控制器

在Web API中,控制器(controller)是处理HTTP请求的对象。

我们将加入一个能够依据ID来返回多个或一个产品的控制器。

备注:假设你还没有使用过ASP.NET MVC,你应该已经对控制器非常熟悉了。Web API的控制器和MVC的控制器非常相近。可是它继承的是ApiController而不是Controller。

在Solution Explorer中,右击Controllers目录。选择Add,然后选择Controller。

在Add Scaffold对话框中,选择Web API Controller – Empty。

点击Add。

在Add Controller对话框,给控制器命名为”ProductsController”。

点击Add。

接下来便会在Controllers目录下创建一个名为ProductsController.cs的文件。

备注:事实上你不必非得把控制器加入到Controllers目录下。目录名称仅仅是为了更方便你组织源文件。

假设文件没有打开,那就双击文件打开它。在文件里替换成下面代码:

using ProductsApp.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Web.Http; namespace ProductsApp.Controllers
{
public class ProductsController : ApiController
{
Product[] products = new Product[]
{
new Product { Id = 1, Name = "Tomato Soup", Category = "Groceries", Price = 1 },
new Product { Id = 2, Name = "Yo-yo", Category = "Toys", Price = 3.75M },
new Product { Id = 3, Name = "Hammer", Category = "Hardware", Price = 16.99M }
}; public IEnumerable<Product> GetAllProducts()
{
return products;
} public IHttpActionResult GetProduct(int id)
{
var product = products.FirstOrDefault((p) => p.Id == id);
if (product == null)
{
return NotFound();
}
return Ok(product);
}
}
}

为了让演示样例简单化,products被存储在控制器类中的固定数组中。当然,在实际应用程序中,你可能想要查询数据库或使用其它外部数据源。

控制器定义了两个返回产品的方法:

1. GetAllProducts方法将整个产品列表作为IEnumerable类型返回。

2. GetProduct方法通过它的ID来查找单个产品。

没错,你已经有一个能够使用的web API了。控制器上的每一个方法都相应一个或多个URI:

Controlle Method URI
GetAllProducts /api/products
GetProduct /api/products/id

对于GetProduct方法,URI中的id是一个占位符。比如。为了得到一个ID为5的产品,URI是api/products/5。

使用JavaScript和jQuery来调用Web API

在本节中,我们将加入一个使用AJAX来调用Web API的HTML页面。我们将使用jQuery来产生AJAX调用并用返回结果来更新页面。

在Solution Explorer中,右击项目并选择Add,然后选择New Item。

在Add New Item对话框中,选择Visual C#下的Web节点,然后选择HTML Page选项。

命名页面为“index.html”。

用下面代码替换文件里的全部:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Product App</title>
</head>
<body> <div>
<h2>All Products</h2>
<ul id="products" />
</div>
<div>
<h2>Search by ID</h2>
<input type="text" id="prodId" size="5" />
<input type="button" value="Search" onclick="find();" />
<p id="product" />
</div> <script src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-2.0.3.min.js"></script>
<script>
var uri = 'api/products'; $(document).ready(function () {
// Send an AJAX request
$.getJSON(uri)
.done(function (data) {
// On success, 'data' contains a list of products.
$.each(data, function (key, item) {
// Add a list item for the product.
$('<li>', { text: formatItem(item) }).appendTo($('#products'));
});
});
}); function formatItem(item) {
return item.Name + ': $' + item.Price;
} function find() {
var id = $('#prodId').val();
$.getJSON(uri + '/' + id)
.done(function (data) {
$('#product').text(formatItem(data));
})
.fail(function (jqXHR, textStatus, err) {
$('#product').text('Error: ' + err);
});
}
</script>
</body>
</html>

有好几个方法去得到jQuery。在本例中,我使用Microsoft Ajax CDN。你也能够在http://jquery.com/下载它。让ASP.NET “Web API”项目包括jQuery。

得到产品列表

为了得到Products列表。能够发送一个HTTP的GET请求到“/api/products”。

jQuery的getJSON函数会发送AJAX请求。

当中包括了JSON对象数组。done函数指定了一个当请求成功时触发的回调。在回调中。我们用产品信息更新DOM。

$(document).ready(function () {
// Send an AJAX request
$.getJSON(apiUrl)
.done(function (data) {
// On success, 'data' contains a list of products.
$.each(data, function (key, item) {
// Add a list item for the product.
$('<li>', { text: formatItem(item) }).appendTo($('#products'));
});
});
});

通过ID得到产品

假设想要通过ID来取得产品,能够发送HTTP的GET请求到”/api/products/id“,当中id就是产品的ID。

function find() {
var id = $('#prodId').val();
$.getJSON(apiUrl + '/' + id)
.done(function (data) {
$('#product').text(formatItem(data));
})
.fail(function (jqXHR, textStatus, err) {
$('#product').text('Error: ' + err);
});
}

我们仍然使用getJSON来发送AJAX请求,可是这次我们将ID放到URI请求中。它的响应会是一个代表了单个产品的JSON对象。

执行应用程序

按F5開始调试应用程序,web页面看起来会是下面这样:

为了通过ID获得产品,输入ID并点击Search。

假设你输入了一个无效的ID,那么server就会返回HTTP错误消息。

使用F12查看HTTP请求和响应

当你工作于HTTP服务时,假设能够查看HTTP请求和响应的具体无疑是非常有帮助的。

你能够在IE9中使用F12开发人员工具来做这些操作。在IE9中,按F12来打开工具。点击Network面板,并点击Start Capturing。如今返回到web页面,并按F5来又一次载入web页面。

IE将会捕捉到浏览器和webserver之间的HTTP传输。下图显示了一个页面的全部HTTP传输。

定位到相对URI”api/products/“。选中并点击Go to detailed view。

在具体视图中,这里多个面板用于查看请求和响应的header和body。

比如。假设你点击Request headers,你就会看到client在Accept header请求了”application/json“。

假设你点击了Response body,你就会看到产品列表怎样被序列化成JSON。其它浏览器也有类似的功能。还有一个实用的工具是Fiddler,它是一个web调试代理工具。你能够使用Fiddler来查看HTTP传输,也能够合成HTTP请求,后者能够给予你在请求上对于HTTP头部的全然控制。

【Web API系列教程】1.1 — ASP.NET Web API入门的更多相关文章

  1. ASP.NET Web API系列教程目录

    ASP.NET Web API系列教程目录 Introduction:What's This New Web API?引子:新的Web API是什么? Chapter 1: Getting Start ...

  2. ASP.NET Web API系列教程(目录)(转)

    注:微软随ASP.NET MVC 4一起还发布了一个框架,叫做ASP.NET Web API.这是一个用来在.NET平台上建立HTTP服务的Web API框架,是微软的又一项令人振奋的技术.目前,国内 ...

  3. [转]ASP.NET Web API系列教程(目录)

    本文转自:http://www.cnblogs.com/r01cn/archive/2012/11/11/2765432.html 注:微软随ASP.NET MVC 4一起还发布了一个框架,叫做ASP ...

  4. 【ASP.NET Web API教程】1 ASP.NET Web API入门

    原文 [ASP.NET Web API教程]1 ASP.NET Web API入门 Getting Started with ASP.NET Web API第1章 ASP.NET Web API入门 ...

  5. Web攻防系列教程之文件上传攻防解析(转载)

    Web攻防系列教程之文件上传攻防解析: 文件上传是WEB应用很常见的一种功能,本身是一项正常的业务需求,不存在什么问题.但如果在上传时没有对文件进行正确处理,则很可能会发生安全问题.本文将对文件上传的 ...

  6. 【转】ASP.NET WEB API系列教程

    from: 西瓜小强 http://www.cnblogs.com/risk/category/406988.html ASP.NET Web API教程(六) 安全与身份认证 摘要: 在实际的项目应 ...

  7. Web Api系列教程第2季(OData篇)(二)——使用Web Api创建只读的OData服务

    前言 很久没更新了,之前有很多事情,所以拖了很久,非常抱歉.好了,废话不多说,下面开始正题.本篇仍然使用上一季的的项目背景(系列地址http://www.cnblogs.com/fzrain/p/34 ...

  8. [转]Web Api系列教程第2季(OData篇)(二)——使用Web Api创建只读的OData服务

    本文转自:http://www.cnblogs.com/fzrain/p/3923727.html 前言 很久没更新了,之前有很多事情,所以拖了很久,非常抱歉.好了,废话不多说,下面开始正题.本篇仍然 ...

  9. angular2系列教程(八)In-memory web api、HTTP服务、依赖注入、Observable

    大家好,今天我们要讲是angular2的http功能模块,这个功能模块的代码不在angular2里面,需要我们另外引入: index.html <script src="lib/htt ...

随机推荐

  1. 乐视max2 刷入第三方recovery 然后刷入root 包 root

    乐视max2 刷入第三方recovery 然后刷入root 包 root 第三方recovery:为奇兔 刷入root 包 https://share.weiyun.com/ddcdd5ea83956 ...

  2. Win10浏览器Spartan无法全屏

    昨天尝鲜win10 Build 10074 msdn pro版,新版微软吹嘘的Spartan浏览器看视频是无法像IE一样全屏的.网上搜索了一下也没有解决方法.不过看到一个可以打开隐藏设置实验功能的方法 ...

  3. Swift protocol extension method is called instead of method implemented in subclass

    Swift protocol extension method is called instead of method implemented in subclass protocol MyProto ...

  4. CAD参数绘制直径标注(com接口)

    主要用到函数说明: _DMxDrawX::DrawDimDiametric 绘制一个直径标注.详细说明如下: 参数 说明 DOUBLE dChordPointX 在被标注的曲线上的第一个点X值 DOU ...

  5. CAD参数绘制椭圆弧(com接口)

    在CAD设计时,需要绘制椭圆弧,用户可以设置椭圆弧基本属性. 主要用到函数说明: _DMxDrawX::DrawEllipseArc 绘制椭圆弧.详细说明如下: 参数 说明 DOUBLE dCente ...

  6. git 支持tree命令

    由于git 里面是不支持tree命令的 有两种方法可以达到tree的效果 1.使用 winpty tree.com 2.安装tree.exe可执行文件 下载链接: https://sourceforg ...

  7. 第1节 yarn:13、yarn资源调度的介绍

    Yarn资源调度 yarn集群的监控管理界面: http://192.168.52.100:8088/cluster jobHistoryServer查看界面: http://192.168.52.1 ...

  8. 全国高校绿色计算大赛 预赛第一阶段(Python)

    第1关将字符串反转 #!/usr/bin/env python # -*- coding: utf-8 -*- class Task: def inversion(self, str): # **** ...

  9. 性能测试培训day1

    测试本质: 1构造测试数据和期望结果 2执行 3验证 自动化测试: 写完代码,单元测试测代码逻辑,单元测试搞清楚代码逻辑就行了(白盒测试)先静态,运行前用工具扫描BUG例如(a==11写成a=11), ...

  10. Python之“Hello World”

    Python之“Hello World” 了解Python: 编译型和解释型 编译:把明文代码执行前,先转换成二进制,在执行.这个过程叫编译 解释器:将明文代码转成二进制的 Linux中,gcc编译, ...