【Web API系列教程】1.1 — ASP.NET Web API入门
前言
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入门的更多相关文章
- ASP.NET Web API系列教程目录
ASP.NET Web API系列教程目录 Introduction:What's This New Web API?引子:新的Web API是什么? Chapter 1: Getting Start ...
- ASP.NET Web API系列教程(目录)(转)
注:微软随ASP.NET MVC 4一起还发布了一个框架,叫做ASP.NET Web API.这是一个用来在.NET平台上建立HTTP服务的Web API框架,是微软的又一项令人振奋的技术.目前,国内 ...
- [转]ASP.NET Web API系列教程(目录)
本文转自:http://www.cnblogs.com/r01cn/archive/2012/11/11/2765432.html 注:微软随ASP.NET MVC 4一起还发布了一个框架,叫做ASP ...
- 【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入门 ...
- Web攻防系列教程之文件上传攻防解析(转载)
Web攻防系列教程之文件上传攻防解析: 文件上传是WEB应用很常见的一种功能,本身是一项正常的业务需求,不存在什么问题.但如果在上传时没有对文件进行正确处理,则很可能会发生安全问题.本文将对文件上传的 ...
- 【转】ASP.NET WEB API系列教程
from: 西瓜小强 http://www.cnblogs.com/risk/category/406988.html ASP.NET Web API教程(六) 安全与身份认证 摘要: 在实际的项目应 ...
- Web Api系列教程第2季(OData篇)(二)——使用Web Api创建只读的OData服务
前言 很久没更新了,之前有很多事情,所以拖了很久,非常抱歉.好了,废话不多说,下面开始正题.本篇仍然使用上一季的的项目背景(系列地址http://www.cnblogs.com/fzrain/p/34 ...
- [转]Web Api系列教程第2季(OData篇)(二)——使用Web Api创建只读的OData服务
本文转自:http://www.cnblogs.com/fzrain/p/3923727.html 前言 很久没更新了,之前有很多事情,所以拖了很久,非常抱歉.好了,废话不多说,下面开始正题.本篇仍然 ...
- angular2系列教程(八)In-memory web api、HTTP服务、依赖注入、Observable
大家好,今天我们要讲是angular2的http功能模块,这个功能模块的代码不在angular2里面,需要我们另外引入: index.html <script src="lib/htt ...
随机推荐
- 迅为双核imx6DL核心板_ARM定制专家_Cortex SATA 千兆网 4G GPS
核心板参数 尺寸:51mm*61mm CPU:Freescale Cortex-A9 双核精简版 i.MX6DL,主频 1.2 GHz 内存:1GB DDR3 存储:8GB EMMC 存储 EEPRO ...
- Swift 关键字 inout - 让值类型以引用方式传递
两种参数传递方式 值类型 传递的是参数的一个副本,这样在调用参数的过程中不会影响原始数据. 引用类型 把参数本身引用(内存地址)传递过去,在调用的过程会影响原始数据. 在 Swift 众多数据类型中, ...
- CSS 文字换行与不换行
1. 强制不换行 p{ white-space:nowrap; } 2. 自动换行 p{ word-wrap: break-word; word-break: normal; } 3. 强制英文单词断 ...
- CSS hover 改变另外一个元素状态
Part.1 问题 我们写页面时也不少遇到这个问题,在没有使用任何预处理语言前提下,当hover 一个元素的时候怎么改变其它的元素? 这里我把它分为两种情况(除自身以外) hover时 1: 改变本身 ...
- Laravel Excel安装及最简单使用
官网:https://docs.laravel-excel.com/ 1.安装 1.1.安装要求: PHP: ^7.0 Laravel: ^5.5 PhpSpreadsheet: ^1.6 ...
- tomcat修改编码格式
在TOMCAT中的conf文件夹下server.xml中的 <Connector中添加两个设置useBodyEncodingForURI="true" //设置POST和GE ...
- 四种方案解决ScrollView嵌套ListView问题 [复制链接]
以下文章转自@安卓泡面 在工作中,曾多次碰到ScrollView嵌套ListView的问题,网上的解决方法有很多种,但是杂而不全.我试过很多种方法,它们各有利弊. 在这里我将会从使用ScrollVie ...
- js检测是哪个浏览器
项目中遇到在火狐浏览器下引入iframe页面,导致那个地方感觉掉下去一点,解决方案就是单独对火狐浏览器进行样式处理,需要检测浏览器类型,在网上找到此方法解决问题,也分享给大家 function get ...
- 一次ORA-01555问题分析,及SQL优化。
前言 客户说: 我在数据库上继续运行昨日的脚本,但发现有个子过程在运行10个小时后报错: 烦请协助看看... 错误码是:ORA-01555: snapshot too old: rollback se ...
- Linux思维导图之网络管理
查漏补缺,理解概念,及时总结,欢迎拍砖. IP地址和MAC地址: 1.设计形态不同.IP地址是基于网络拓扑设计出来的,可以人为改动:而MAC地址是制造商烧录好的不能改动,网卡决定了MAC地址,是固定的 ...