本文所有的东西都是在dot Net Core 1.1环境+VS2017保证测试通过。
本文接着上次文章接着写的,不了解上篇文章的可能看着有点吃力。我尽量让大家都能看懂。这是上篇文章的连接http://www.cnblogs.com/qulianqing/p/6745409.html。请大家先看一下,心里大致有个了解,然后看这篇博客就容易了。
这里说一下实现的步骤:1. 新建一个ASP dot Net MVC项目,在这里我的项目名为TestAPI
2. 在项目的根目录下添加一个文件夹 名字为Models
3. 在Models文件夹下添加一个Users.cs 类 下面是代码 和上篇博客的Users.cs一样 (主要是为了传输数据方便)
public class Users
{
[Key]
public int ID { get; set; }
public string name { get; set; }
public string pwd { get; set; }
}
Users.cs
4.在右键点击controllers文件夹 选择添加-->控制器 在弹出的对话框中选择 mimial Dependencies 之后等待完成。(这里说一下上篇博客有朋友说
选择 mimial Dependencies会出现错误,我今天又试了一遍,还是没有问题,如果说你的也有问题的话那就选择full Dependencies)
mini)
5.再次右键点击Controllers文件夹 选择添加 ->控制器 在弹出的对话框中选择 第三个,也就是下边高亮的那一个 点击添加按钮
6.点击添加按钮之后,又会出现一个对话框,在对话框中选择点击模型的下拉框,选择Uses.cs 。在数据上下文项点击右边的那个加号,在弹出的对话框中,选将名称更改为Users,最后记得视图的三个选项都要勾选。点击添加 就完成了。
7.删除不必要的东西 (1)删除Views下边的整个Home文件夹里边的东西,(2)删除整个Data文件夹,及内部东西,(3)删除Controllers文 件夹下的HomeController.cs (4) 打开appsettings.json文件夹 ,删除ConnectionStrings项及其内容,
(5)打开Startup.cs文件 删除EF框架自动添加的服务 在ConfigureServices这个方法里边, 这个字符串 services.AddDbContext<UsesContext>options=>options.UseSqlServer(Configuration.GetConnectionString("*****")));
(6)打开Contollers文件夹下的UserController.cs文件,删除下边的系统为我们生成的大部分代码,删除完之后就剩下这些
public class UsersController : Controller
{
// GET: Users
public async Task<IActionResult> Index()
{ }
// GET: Users/Details/5
public async Task<IActionResult> Details(int? id)
{ }
// GET: Users/Create
public IActionResult Create()
{ }
// POST: Users/Create
// To protect from overposting attacks, please enable the specific properties you want to bind to, for
// more details see http://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create([Bind("ID,name,pwd")] Users users)
{ }
// GET: Users/Edit/5
public async Task<IActionResult> Edit(int? id)
{ }
// POST: Users/Edit/5
// To protect from overposting attacks, please enable the specific properties you want to bind to, for
// more details see http://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Edit(int id, [Bind("ID,name,pwd")] Users users)
{ }
// GET: Users/Delete/5
public async Task<IActionResult> Delete(int? id)
{ } // POST: Users/Delete/5
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public async Task<IActionResult> DeleteConfirmed(int id)
{ } }
UsersController.cs
进行到这里我们的基础环境就搭建完毕了,我们这里只用系统为我们生成的View 其他的都不用要,在这里我们的Views文件夹下的Users文件夹的东西我们没有动
二、接下来重点来了
我们要在Controllers调用我们上次写的WebAPI
首先我们依次从index到Create到Update 到Delete依次为大家详解(最后附完整的代码,如果代码阅读能力强的同学,可以直接跳到最后阅读全部的代码)
准备工作,首先我们声明两个全局变量,具体用途在注释中已经说明
//这个baseURL是我的webApi的地址
private static string baseURL = "http://localhost:56853/api/users";
//用于存放所有的用户
private static IList<Users> _context;
构造函数 获取所有的用户信息就是把数据存在 _context 中 方便查找
public UsersController()
{
//实例化对象
_context = new List<Users>();
//获取所有的用户的信息
_context = GetAllUserList(); }
在这里我取数据的使用用的是HttpClient取的远程的API数据,由于取的是JSon字符串数组,我要把它转化为JSon数组,然后再通过JSonConvert进行每一个对象的转化
/// <summary>
/// 获取所有用户的List
/// </summary>
private IList<Users> GetAllUserList()
{
IList<Users> userslist = new List<Users>();
var JsonString = GetALLUserInfoFromAPI();
JArray UsersArray = JArray.Parse(JsonString);
for (int i = ; i < UsersArray.Count; i++)
{
userslist.Add(StringConvertToUser(UsersArray[i].ToString()));
}
return userslist;
}
GetAllUserList
/// <summary>
/// 通过api获取所有的用户的信息
/// </summary>
/// <returns>JSON String</returns>
private string GetALLUserInfoFromAPI()
{
HttpClient client = new HttpClient();
var con = client.GetStringAsync(baseURL);
return con.Result;
}
GetALLUserInfoFromAPI
/// <summary>
/// 将Json对象的字符串转化为users对象
/// </summary>
/// <param name="JsonString">json对象的字符串</param>
/// <returns>Users对象</returns>
private Users StringConvertToUser(string JsonString)
{
return JsonConvert.DeserializeObject<Users>(JsonString);
}
StringConvertToUser
1.index 界面是用来显示数据的。通过上边的操作,我们已经把所有的数据存到 _context 变量中去了,所以在Index中我们只需要调用就可以了。
public async Task<IActionResult> Index()
{
return View(_context);
}
运行结果:
2.接下来我们接着说Create和Rdit和Delete 由于Create和Edit都是向服务器提交数据的,Delete向远程API路由一个ID就结束了。这里我原本准备全文都用HttpClient的可是HttpClient的PostAsync方法实在是不会用,昨天搞了一天都没有结果,于是下边的我换成了WebRequest,我把他们提取到一个方法里了,具体看下边的代码。尤其是我下边注释的行代码,不然浏览器会报415让你摸不着头脑,这个是我自己试出来的,可能会有更好的方法吧。只是我还不知道。
/// <summary>
/// 处理数据
/// </summary>
/// <param name="Data">User实体类</param>
/// <param name="Url">远程API的URL</param>
/// <param name="RequestMethod">请求的方法</param>
/// <returns></returns>
private async Task<string> HandleData(Users Data, string Url, string RequestMethod)
{
string UsersJson = UsersConvertToJson(Data);
var request = WebRequest.CreateHttp(Url);
request.Accept = "application/json";
//下边这行不设置会出现无法识别mediaType 415 这个错误
request.ContentType = "application/json";
request.Method = RequestMethod;
//向request提交数据
using (StreamWriter writer = new StreamWriter(await request.GetRequestStreamAsync()))
{
writer.Write(UsersJson);
}
//获取响应
var reponse = await request.GetResponseAsync();
//返回响应数据
using (StreamReader reader = new StreamReader(reponse.GetResponseStream()))
{
return reader.ReadToEnd();
}
}
private string UsersConvertToJson(Users u)
{
return JsonConvert.SerializeObject(u);
}
UsersConvertToJson
具体用法 Create
/// <summary>
/// 传递数据到远程API的数据库中
/// </summary>
/// <param name="u"></param>
/// <returns></returns>
private async Task<string> CreateAsync(Users u)
{
string url = baseURL;
string requestMethod = "post";
return await HandleData(u, url, requestMethod);
} // GET: Users/Create
public IActionResult Create()
{
return View();
} // POST: Users/Create
// To protect from overposting attacks, please enable the specific properties you want to bind to, for
// more details see http://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create([Bind("ID,name,pwd")] Users users)
{
if (ModelState.IsValid)
{ await CreateAsync(users);
return RedirectToAction("Index");
}
return View();
}
Create
具体用法 Edit
private async Task<string> UpdateAsync(Users u)
{
string url = baseURL + @"/" + u.ID;
string requestMethod = "put";
return await HandleData(u, url, requestMethod);
} // GET: Users/Edit/5
public async Task<IActionResult> Edit(int? id)
{
if (id == null)
{
return BadRequest();
}
var users = _context.FirstOrDefault(u => u.ID == id);
if (users == null)
{
return NotFound();
}
return View(users);
} // POST: Users/Edit/5
// To protect from overposting attacks, please enable the specific properties you want to bind to, for
// more details see http://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Edit(int id, [Bind("ID,name,pwd")] Users users)
{ if (ModelState.IsValid)
{
if (id != users.ID)
{
return BadRequest();
}
try
{
await UpdateAsync(users);
return RedirectToAction("Index");
}
catch
{
if (UsersExist(users.ID))
{
return NotFound();
}
throw;
} }
return View();
}
Edit
private bool UsersExist(int iD)
{
return _context.Any(u => u.ID == iD);
}
UsersExist
具体用法 Delete
private async Task<string> DeleteAsync(Users u)
{
string url = baseURL + @"/" + u.ID;
string requestMethod = "delete";
return await HandleData(u, url, requestMethod);
} // GET: Users/Delete/5
public async Task<IActionResult> Delete(int? id)
{
if (id == null)
{
return BadRequest();
}
var users = _context.FirstOrDefault(u => u.ID == id);
if (users == null)
{
return NotFound();
} return View(users);
} // POST: Users/Delete/5
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public async Task<IActionResult> DeleteConfirmed(int id)
{
var users = _context.SingleOrDefault(u => u.ID == id);
await DeleteAsync(users);
return RedirectToAction("Index");
}
Delete
到这里调用远程API的东西都完成了,我在这里完善了一下 Details这个View
// GET: Users/Details/5
public async Task<IActionResult> Details(int? id)
{
if (id == null)
{
return BadRequest();
}
var users = _context.FirstOrDefault(u => u.ID == id);
if (users == null)
{
return NotFound();
}
return View(users);
}
Details
下边这是测试结果
到这里全部都完成了,并且测试完毕
这是UsersContellers.cs 类的全部代码
using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using TestAPI.Models; namespace TestAPI.Controllers
{
public class UsersController : Controller
{
#region 成员变量
//这个baseURL是我的webApi的地址
private static string baseURL = "http://localhost:56853/api/users";
//用于存放所有的用户
private static IList<Users> _context; #endregion #region 构造函数
public UsersController()
{
//实例化对象
_context = new List<Users>();
//获取所有的用户的信息
_context = GetAllUserList(); } #endregion #region 类内方法 /// https://docs.microsoft.com/en-us/aspnet/web-api/overview/advanced/calling-a-web-api-from-a-net-client /// <summary>
/// 通过api获取所有的用户的信息
/// </summary>
/// <returns>JSON String</returns>
private string GetALLUserInfoFromAPI()
{
HttpClient client = new HttpClient();
var con = client.GetStringAsync(baseURL);
return con.Result;
} private string UsersConvertToJson(Users u)
{
return JsonConvert.SerializeObject(u);
}
/// <summary>
/// 传递数据到远程API的数据库中
/// </summary>
/// <param name="u"></param>
/// <returns></returns>
private async Task<string> CreateAsync(Users u)
{
string url = baseURL;
string requestMethod = "post";
return await HandleData(u, url, requestMethod);
} private async Task<string> UpdateAsync(Users u)
{
string url = baseURL + @"/" + u.ID;
string requestMethod = "put";
return await HandleData(u, url, requestMethod);
}
/// <summary>
/// 处理数据
/// </summary>
/// <param name="Data">User实体类</param>
/// <param name="Url">远程API的URL</param>
/// <param name="RequestMethod">请求的方法</param>
/// <returns></returns>
private async Task<string> HandleData(Users Data, string Url, string RequestMethod)
{
string UsersJson = UsersConvertToJson(Data);
var request = WebRequest.CreateHttp(Url);
request.Accept = "application/json";
//下边这行不设置会出现无法识别mediaType 415 这个错误
request.ContentType = "application/json";
request.Method = RequestMethod;
//向request提交数据
using (StreamWriter writer = new StreamWriter(await request.GetRequestStreamAsync()))
{
writer.Write(UsersJson);
}
//获取响应
var reponse = await request.GetResponseAsync();
//返回响应数据
using (StreamReader reader = new StreamReader(reponse.GetResponseStream()))
{
return reader.ReadToEnd();
}
}
private async Task<string> DeleteAsync(Users u)
{
string url = baseURL + @"/" + u.ID;
string requestMethod = "delete";
return await HandleData(u, url, requestMethod);
}
private bool UsersExist(int iD)
{
return _context.Any(u => u.ID == iD);
} /// <summary>
/// 获取所有用户的List
/// </summary>
private IList<Users> GetAllUserList()
{
IList<Users> userslist = new List<Users>();
var JsonString = GetALLUserInfoFromAPI();
JArray UsersArray = JArray.Parse(JsonString);
for (int i = ; i < UsersArray.Count; i++)
{
userslist.Add(StringConvertToUser(UsersArray[i].ToString()));
}
return userslist;
}
/// <summary>
/// 将Json对象的字符串转化为users对象
/// </summary>
/// <param name="JsonString">json对象的字符串</param>
/// <returns>Users对象</returns>
private Users StringConvertToUser(string JsonString)
{
return JsonConvert.DeserializeObject<Users>(JsonString);
}
#endregion #region Index
// GET: Users
public async Task<IActionResult> Index()
{
return View(_context);
} #endregion #region Details // GET: Users/Details/5
public async Task<IActionResult> Details(int? id)
{
if (id == null)
{
return BadRequest();
}
var users = _context.FirstOrDefault(u => u.ID == id);
if (users == null)
{
return NotFound();
}
return View(users);
} #endregion #region Create // GET: Users/Create
public IActionResult Create()
{
return View();
} // POST: Users/Create
// To protect from overposting attacks, please enable the specific properties you want to bind to, for
// more details see http://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create([Bind("ID,name,pwd")] Users users)
{
if (ModelState.IsValid)
{ await CreateAsync(users);
return RedirectToAction("Index");
}
return View();
} #endregion #region Edit // GET: Users/Edit/5
public async Task<IActionResult> Edit(int? id)
{
if (id == null)
{
return BadRequest();
}
var users = _context.FirstOrDefault(u => u.ID == id);
if (users == null)
{
return NotFound();
}
return View(users);
} // POST: Users/Edit/5
// To protect from overposting attacks, please enable the specific properties you want to bind to, for
// more details see http://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Edit(int id, [Bind("ID,name,pwd")] Users users)
{ if (ModelState.IsValid)
{
if (id != users.ID)
{
return BadRequest();
}
try
{
await UpdateAsync(users);
return RedirectToAction("Index");
}
catch
{
if (UsersExist(users.ID))
{
return NotFound();
}
throw;
} }
return View();
} #endregion #region Delete // GET: Users/Delete/5
public async Task<IActionResult> Delete(int? id)
{
if (id == null)
{
return BadRequest();
}
var users = _context.FirstOrDefault(u => u.ID == id);
if (users == null)
{
return NotFound();
} return View(users);
} // POST: Users/Delete/5
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public async Task<IActionResult> DeleteConfirmed(int id)
{
var users = _context.SingleOrDefault(u => u.ID == id);
await DeleteAsync(users);
return RedirectToAction("Index");
}
#endregion }
}
UsersController.cs
这是git地址 https://github.com/1483523635/dotNetCoreAPIDemoTest
关于HttpClient的学习微软官网上有一篇 https://docs.microsoft.com/en-us/aspnet/web-api/overview/advanced/calling-a-web-api-from-a-net-client 这个我看了一下时间是2014年的,昨天还能看今天就看不到了,可能是要更新吧
这是HttpClient的API说明 https://msdn.microsoft.com/en-us/library/system.net.http.httpclient(v=vs.118).aspx
关于HttpClient的PostAsync方法谁有好的用法,欢迎告诉我,让我学习一下。
在ASP dot Net Core MVC中用Controllers调用你的Asp dotnet Core Web API 实现CRUD到远程数据库中,构建你的分布式应用(附Git地址)的更多相关文章
-
Asp.Net Web API 2(CRUD操作)第二课
Asp.Net Web API 2(CRUD操作)第二课 Asp.Net Web API 导航 Asp.Net Web API第一课:入门http://www.cnblogs.com/aehyok ...
-
ASP.NET Web API 基本操作(CRUD)
上一篇介绍了ASP.NET Web API的基本知识和原理,这一篇我们通过一个更直观的实例,对产品进行CRUD操作(Create/Read/Update/Delete)来继续了解一下它的基本应用. 创 ...
-
ASP.NET Core MVC 打造一个简单的图书馆管理系统 (修正版)(一) 基本模型以及数据库的建立
前言: 本系列文章主要为我之前所学知识的一次微小的实践,以我学校图书馆管理系统为雏形所作. 本系列文章主要参考资料: 微软文档:https://docs.microsoft.com/zh-cn/asp ...
-
ASP.NET Core Web API Cassandra CRUD 操作
在本文中,我们将创建一个简单的 Web API 来实现对一个 “todo” 列表的 CRUD 操作,使用 Apache Cassandra 来存储数据,在这里不会创建 UI ,Web API 的测试将 ...
-
解析ASP.NET WebForm和Mvc开发的区别 分类: ASP.NET 2013-12-29 01:59 11738人阅读 评论(5) 收藏
因为以前主要是做WebFrom开发,对MVC开发并没有太深入的了解.自从来到创新工场的新团队后,用的技术都是自己以前没有接触过的,比如:MVC 和EF还有就是WCF,压力一直很大.在很多问题都是不清楚 ...
-
Asp .net core api+Entity Framework core 实现数据CRUD数据库中(附Git地址)
最近在学dotNetCore 所以尝试了一下api 这个功能 不多说了大致实现如下 1.用vs2017建立一个Asp.net Core Web 应用程序 在弹出的对话框中选择 Web API 项目名 ...
-
在Core环境下用WebRequest连接上远程的web Api 实现数据的简单CRUD(附Git地址)
本文所有的东西都是在dot Net Core 1.1环境+VS2017保证测试通过. 本文接着上次文章接着写的,不了解上篇文章的可能看着有点吃力.我尽量让大家都能看懂.这是上篇文章的连接http:// ...
-
国产中标麒麟Linux部署dotnet core 环境并运行项目 (三) 部署运行WEB API项目
部署dotnet Core Web API 上一步的文章,是我们公司最核心的一个ORM组件,在中标麒麟系统完成了一个插入数据的任务,这一步是将正式的从dot net framework 迁移到 dot ...
-
How ASP.NET Web API 2.0 Works?[持续更新中…]
一.概述 RESTful Web API [Web标准篇]RESTful Web API [设计篇] 在一个空ASP.NET Web项目上创建一个ASP.NET Web API 2.0应用 二.路由 ...
随机推荐
-
opts=opts | |{}
var opts=opts || {}这个语句是一个赋值或者初始化语句 该语句在opts已经被初始化过后opts的值不变,即执行var opts=opts这一部分. 当opts未被初始化,即typeo ...
-
iOS 和 Android 测试托管平台 FIR.im 的注册与常用功能
FIR.im 作为专业的 iOS 和 Android 测试包发布网站, 注册超简单,支持输入网址直接下载和二维码扫描下载.功能类似 TestFlight ,但又比它强大,支持游客访问密码,iOS 和 ...
-
zzuliOJ 1904小火山的股票交易;
#include <stdio.h> #include <algorithm> #include <string.h> using namespace std; # ...
-
深度学习笔记(三 )Constitutional Neural Networks
一. 预备知识 包括 Linear Regression, Logistic Regression和 Multi-Layer Neural Network.参考 http://ufldl.stanfo ...
-
node环境下处理get post
前言:今天刚学get,post.这里只是几下今天的理解.so文章只供新手参考. 编译器是webstorm 搭建后服务器后(具体请查看上篇文章) 在routes文件夹下的index.js文件中写入 如图 ...
-
MySQL数据库数据类型之集合类型SET测试总结
MySQL数据库提供针对字符串存储的一种特殊数据类型:集合类型SET,这种数据类型可以给予我们更多提高性能.降低存储容量和降低程序代码理解的技巧,前面介绍了首先介绍了四种数据类型的特性总结,其后又分别 ...
-
android中保存一个ArrayList到SharedPreferences的方法
保存: public static boolean saveArray() { SharedPrefernces sp=SharedPrefernces.getDefaultSharedPrefern ...
-
SOAP webserivce 和 RESTful webservice 对比及区别(转载)
简单对象访问协议(Simple Object Access Protocol,SOAP)是一种基于 XML 的协议,可以和现存的许多因特网协议和格式结合使用,包括超文本传输协议(HTTP),简单邮件传 ...
-
MAP File
https://warpproject.org/trac/wiki/howto/Linker_scripts_MAP_files Description A MAP file is an output ...
-
nodejs -- fs模块 --->; readFile 函数 1) fs.readFile(filename, ";binary";, function(error, file) 2) response.write(file, ";binary";);
一:代码: 1.1 入口文件: index.js var server = require('./server'); var router = require("./router" ...