在Core环境下用WebRequest连接上远程的web Api 实现数据的简单CRUD(续)
这篇博客是上篇博客的续写,上篇博客用的是HttpClient取远程数据,用WebRequest提交,更新,删除数据。
今天进行了一下修改,全程用的都是HttpClient
说一下实现过程吧。
在实现的过程中,我发现了PostAsync和PutAsync需要的参数都是一个类型的,DeleteAsyc和GetAsync需要的参数都是一个类型的。那么这就省很多事了只用一个方法+反射,里边再加一个if{...}else{...}就可解决四个问题了。
主要就是添加了HandleDataFactoryAsync这个方法里边注释写的很详细。
/// <summary>
/// 这是用HttpClient调用Web Api实现CRUD到数据库中
/// </summary>
/// <param name="u">数据</param>
/// <param name="url">请求的url</param>
/// <param name="RequestType">请求的类型</param>
/// <returns></returns>
private async Task<string> HandleDataFactoryAsync(Users u, string url, string RequestType)
{
//声明一个HttpClient类
HttpClient client = new HttpClient();
//将Users转化为JSon字符串
string jsonString = UsersConvertToJson(u);
//声明一个String类型的Context在提交数据时需要用到这个参数
var context = new StringContent(jsonString, Encoding.UTF8, "application/json");
//设置反射需要获取的方法名称
string method = RequestType + "Async"; //我这里将两步写在了一起
//1.通过获取所有的方法
//2.通过linq语句查询我需要的方法
//当然也可以直接GetMethod(MethodName)
//我感觉那样的话可能会抛“方法找不到”的异常
//我用Linq查询避免了
MethodInfo info = client.GetType().GetMethods().FirstOrDefault(m => m.Name == method);
if (info != null)
{
HttpResponseMessage result; //由于put和post需要的参数类型和数目一致所以放在一块处理了
//get和delete也一样
if (method == "PutAsync" || method == "PostAsync")
{
//激活这个方法并且传递所需要的参数
result= await (Task<HttpResponseMessage>)info.Invoke(client, new Object[] { url, context });
}
else
{
result = await (Task<HttpResponseMessage>)info.Invoke(client, new Object[] { url });
}
//将响应内容返回
return await result.Content.ReadAsStringAsync(); } return ""; }
修改用法
/// <summary>
/// 传递数据到远程API的数据库中
/// </summary>
/// <param name="u"></param>
/// <returns></returns>
private async Task<string> CreateAsync(Users u)
{
string url = baseURL;
string requestMethod = "Post";
//return await HandleDataAsync(u, url, requestMethod);
return await HandleDataFactoryAsync(u, url, requestMethod);
} private async Task<string> UpdateAsync(Users u)
{
string url = baseURL + @"/" + u.ID;
string requestMethod = "Put";
// return await HandleDataAsync(u, url, requestMethod);
return await HandleDataFactoryAsync(u, url, requestMethod);
}
private async Task<string> DeleteAsync(Users u)
{
string url = baseURL + @"/" + u.ID;
string requestMethod = "Delete";
//return await HandleDataAsync(u, url, requestMethod);
return await HandleDataFactoryAsync(u, url, requestMethod); }
注释掉的那行是原来调用WebRequest的方法,别的都没有改变。
这是整个类
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.Reflection;
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 类内方法 /// <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 HandleDataAsync(u, url, requestMethod);
return await HandleDataFactoryAsync(u, url, requestMethod);
} private async Task<string> UpdateAsync(Users u)
{
string url = baseURL + @"/" + u.ID;
string requestMethod = "Put";
// return await HandleDataAsync(u, url, requestMethod);
return await HandleDataFactoryAsync(u, url, requestMethod);
}
private async Task<string> DeleteAsync(Users u)
{
string url = baseURL + @"/" + u.ID;
string requestMethod = "Delete";
//return await HandleDataAsync(u, url, requestMethod);
return await HandleDataFactoryAsync(u, url, requestMethod); }
private bool UsersExist(int iD)
{
return _context.Any(u => u.ID == iD);
}
/// <summary>
/// 用WebRequest处理数据
/// </summary>
/// <param name="Data">User实体类</param>
/// <param name="Url">远程API的URL</param>
/// <param name="RequestMethod">请求的方法</param>
/// <returns></returns>
private async Task<string> HandleDataAsync(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();
}
} /// <summary>
/// 这是用HttpClient调用Web Api实现CRUD到数据库中
/// </summary>
/// <param name="u">数据</param>
/// <param name="url">请求的url</param>
/// <param name="RequestType">请求的类型</param>
/// <returns></returns>
private async Task<string> HandleDataFactoryAsync(Users u, string url, string RequestType)
{
//声明一个HttpClient类
HttpClient client = new HttpClient();
//将Users转化为JSon字符串
string jsonString = UsersConvertToJson(u);
//声明一个String类型的Context在提交数据时需要用到这个参数
var context = new StringContent(jsonString, Encoding.UTF8, "application/json");
//设置反射需要获取的方法名称
string method = RequestType + "Async"; //我这里将两步写在了一起
//1.通过获取所有的方法
//2.通过linq语句查询我需要的方法
//当然也可以直接GetMethod(MethodName)
//我感觉那样的话可能会抛“方法找不到”的异常
//我用Linq查询避免了
MethodInfo info = client.GetType().GetMethods().FirstOrDefault(m => m.Name == method);
if (info != null)
{
HttpResponseMessage result; //由于put和post需要的参数类型和数目一致所以放在一块处理了
//get和delete也一样
if (method == "PutAsync" || method == "PostAsync")
{
//激活这个方法并且传递所需要的参数
result= await (Task<HttpResponseMessage>)info.Invoke(client, new Object[] { url, context });
}
else
{
result = await (Task<HttpResponseMessage>)info.Invoke(client, new Object[] { url });
}
//将响应内容返回
return await result.Content.ReadAsStringAsync(); } return ""; }
/// <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
感觉HttpClient比WebRequest好用一点。毕竟都差不多吧,只不过是是现的方式不一样,用法不一样。又让我体验了一把反射的魅力。
这个是连接Web Api的git地址 https://github.com/1483523635/dotNetCoreAPIDemoTest
这个是用到的Web Api的git地址https://github.com/1483523635/dotNetCoreAPIDemo
在Core环境下用WebRequest连接上远程的web Api 实现数据的简单CRUD(续)的更多相关文章
- 在Core环境下用WebRequest连接上远程的web Api 实现数据的简单CRUD(附Git地址)
本文所有的东西都是在dot Net Core 1.1环境+VS2017保证测试通过. 本文接着上次文章接着写的,不了解上篇文章的可能看着有点吃力.我尽量让大家都能看懂.这是上篇文章的连接http:// ...
- .Net Core 环境下构建强大且易用的规则引擎
本文源码: https://github.com/jonechenug/ZHS.Nrules.Sample 1. 引言 1.1 为什么需要规则引擎 在业务的早期时代,也许使用硬编码或者逻辑判断就可以满 ...
- linux下使用FreeRDP 连接 Windows 远程桌面
linux下使用FreeRDP 连接 Windows 远程桌面 简介 FreeRDP 是一款开源的远程桌面系统,支持多种平台, 在 ubuntu 中使用 FreeRDP 可以很方便的登录到 win ...
- 尝新体验ASP.NET Core 6预览版本中发布的最小Web API(minimal APIS)新特性
本文首发于<尝新体验ASP.NET Core 6预览版本中发布的最小Web API(minimal APIS)新特性> 概述 .NET开发者们大家好,我是Rector. 几天前(美国时间2 ...
- 在公网上布署Web Api的时候,不能调用,返回404
在internet上布署web API做的站点时,发现不能调用web api的任何action, 返回404. 经过很多的努力,也找不到原因,环境是win server 2008, IIS 75. n ...
- Windows环境下IOS APP打包上传AppStore详细流程
我们知道在上架苹果应用过程中,申请发布证书需要用到钥匙串,上传ipa需要用到xcode或Application loader提交构建版本,这都需要Mac苹果机. 本文介绍如何在Windows环境下申请 ...
- [Docker] Windows 宿主环境下,共享或上传文件到容器的方法
需求如题. 解决方案1 - 挂载目录(适用于创建新的容器) 格式-v 容器目录 或 -v 本地目录:容器目录 范例Linux宿主环境下:使用镜像 nginx:latest,以后台模式启动一个容器,将容 ...
- Windows环境下,将Django部署到Apache Web Server
在Windows上部署Django(用mod_wsgi)会出现各种奇怪的问题,现简单记录下配置过程及遇到的错误及解决方法. 环境搭建 ...
- virtualenv 环境下 Nginx + Flask + Gunicorn+ Supervisor 搭建 Python Web
在这篇文章里,我们将搭建一个简单的 Web 应用,在虚拟环境中基于 Flask 框架,用 Gunicorn 做 wsgi 容器,用 Supervisor 管理进程,然后使用 Python 探针来监测应 ...
随机推荐
- NumPy入门及基础
1.1 NumPy 数组对象 NumPy中的ndarray是一个多维数组对象,该对象由两部分组成: 实际的数据; 描述这些数据的元数据. 大部分的数组操作仅仅修改元数据部分,而不改变底层的实际 ...
- vue2.0transition过渡的使用介绍
直接上代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...
- 【C语言】模拟实现printf函数(可变参数)
一.printf函数介绍 printf功能 printf函数是格式化输出函数,一般用于向标准输出设备按规定格式输出信息. printf原型 int printf( const char* format ...
- 为什么使用 Containjs 模块化管理工具效率高?
为什么使用 Containjs 模块化管理工具效率高? 要说明这个首先得说明一下,Containjs 的模块加载原理. 第一步,首先使用异步加载(ajax)在 js 目录下的 app.js 入口模块( ...
- java 8 Hashmap深入解析 —— put get 方法源码
每个java程序员都知道,HashMap是java中最重要的集合类之一,也是找工作面试中非常常见的考点,因为HashMap的实现本身确实蕴含了很多精妙的代码设计. 对于普通的程序员,可能仅仅能说出Ha ...
- JQ实战一之烟花
本次的效果大概为当用户点击网页时,网页下方弹出一个类似烟花的长条条,然后在桌面上散开以达成类似烟花的特效.话不多说先上图. 首先布局,布局很简单 <style> body { backgr ...
- poptest老李谈数据结构中深度优先和广度优先
poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:908821478,咨询电话010-845052 ...
- Android 微信第三方登录
步骤一 微信开发者平台 我开始的解决思路是,去微信开发者平台看API文档. 这个API文档的主要意思呢,有三点: 1.你得下载这几样东西(下载链接),一个是他的范例代码,一个是他的签名生成工具. 2. ...
- 使用U盘安装ubuntu 12.04(使用大白菜u盘启动工具)
家里有个u盘启动盘,用大白菜U盘工具做的. 1.把iso文件放到u盘里,把ISO文件中的casper目录下的vmlinuz和initrd拷贝到u盘根目录下: 2.修改启动顺序,选u盘启动: 3.启动时 ...
- 关于html5调用手机相机(原创)
很久没写随笔了 从ios6开始,webview支持html <input type="file">标签,用来调取手机的相册和相机,但是没有权限提示,不知道是不是我写的有 ...