构建API
前言
过程,如图:

第一步创建一个帮助类,类里面提供了加密、组装Url等方法,代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.IO;
using System.Net;
using System.Security.Cryptography;
using System.Text; namespace APIClient.Content
{
public class WebHelper
{ #region 获得客户端时间+ public static int GetTimeZ(DateTime time)
public static int GetTimeZ(DateTime time)
{
var startTime = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(, , ));
return (int)(time - startTime).TotalSeconds;
}
#endregion #region 加密key+private string CreateSign(Dictionary<string, string> paramList, string appKey)
public static string CreateSign(Dictionary<string, string> paramList, string appKey)
{
var str = paramList.OrderBy(c => c.Key).Aggregate(string.Empty, (current, item) => current + item.Value);
return MD5(str + appKey).ToLower();//调用MD5
}
#endregion #region 执行HTTP GET请求+ public static string DoGet(string url, IDictionary<string, string> parameters)
public static string DoGet(string url, IDictionary<string, string> parameters)
{
if (parameters != null && parameters.Count > )
{
if (url.Contains("?"))
{
url = url + "&" + BuildPostDate(parameters); //调用BuildPostDate
}
else
{
url = url + "?" + BuildPostDate(parameters);
}
} HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
req.Method = "GET";
req.KeepAlive = true;
req.UserAgent = "ADCSDK";
req.ContentType = "application/x-www-form-urlencoded;charset=utf-8";
HttpWebResponse rsp = (HttpWebResponse)req.GetResponse();
Encoding encoding = Encoding.GetEncoding(rsp.CharacterSet);
return GetResponseAsString(rsp, encoding); //调用GetResponseAsString
} #endregion #region MD5加密+ public static string MD5(string input)
/// <summary>
/// MD5加密 (添加命名空间;using System.Security.Cryptography;)
/// </summary>
/// <param name="input">输入字符串</param>
/// <returns>加密后的字符串</returns>
public static string MD5(string input)
{
if (string.IsNullOrEmpty(input))
{
return string.Empty;
} var md5 = new MD5CryptoServiceProvider();
var inputBytes = Encoding.UTF8.GetBytes(input);
var outPutbytes = md5.ComputeHash(inputBytes);
return BitConverter.ToString(outPutbytes).Replace("-", "");
}
#endregion #region 组装普通文本请求参数+ private static string BuildPostDate(IDictionary<string, string> parameters)
private static string BuildPostDate(IDictionary<string, string> parameters)
{
StringBuilder postDate = new StringBuilder();
bool hasParam = false;
IEnumerator<KeyValuePair<string, string>> dem = parameters.GetEnumerator();
while (dem.MoveNext())
{
string name = dem.Current.Key;
string value = dem.Current.Value;
if (!string.IsNullOrEmpty(name) && !string.IsNullOrEmpty(value))
{
if (hasParam)
{
postDate.Append("&");
}
postDate.Append(name);
postDate.Append("=");
postDate.Append(Uri.EscapeDataString(value));
hasParam = true;
}
}
return postDate.ToString();
}
#endregion #region 把响应流转换为文本+ private static string GetResponseAsString(HttpWebResponse rsp, Encoding encoding)
private static string GetResponseAsString(HttpWebResponse rsp, Encoding encoding)
{
StringBuilder result = new StringBuilder();
Stream stream = null;
StreamReader reader = null; try
{
stream = rsp.GetResponseStream();
reader = new StreamReader(stream, encoding);
var buffer = new char[];
int readBytes;
while ((readBytes = reader.Read(buffer, , buffer.Length)) > )
{
result.Append(buffer, , readBytes);
}
}
finally
{
if (reader != null) reader.Close();
if (stream != null) stream.Close();
if (rsp != null) rsp.Close();
}
return result.ToString();
}
#endregion }
}
第二步服务器端创建一个API(参数协商定义),代码如下:
public ActionResult Reg(int productId, string version, string source, string userName, string timeZ, string sign)
{
if (string.IsNullOrEmpty(version))
return Content("productId");
if (string.IsNullOrEmpty(version))
return Content("version");
if (string.IsNullOrEmpty(version))
return Content("source");
if (string.IsNullOrEmpty(version))
return Content("userName");
if (string.IsNullOrEmpty(version))
return Content("timeZ");
if (string.IsNullOrEmpty(version))
return Content("sign1"); var dict = new Dictionary<string, string>
{
{"productId", productId.ToString()},
{"version", version},
{"source", source},
{"userName", userName},
{"timeZ", timeZ},
}; var checkSign =WebHelper.CreateSign(dict, "zz680000f7-6834");//sign 是数据库中一个key,这里是为了方便,应当是根据productId值从数据库中取出相应的key与程序传过来的key比较 if (sign.ToLower() != checkSign.ToLower())
{
return Content("sign2");
}
//调用接口之后还应当在数据库中插入一条日志数据
return Content("");
}
第三步应用程序创建一个方法,请求API,代码如下:
public ActionResult List()
{
RegTest();
return View();
}
//参数
private const string APIUrl = "http://localhost:4023/APISever/";
private const int ProductId = ;
private const string AppKey = "zz680000f7-68341";//680000f7-6834-4b5f-8534-70cea7fd641b //注册接口
public void RegTest()
{
var url = string.Format("{0}reg", APIUrl);
var dict = new Dictionary<string, string>
{
{"productId", ProductId.ToString()},
{"version", "1.0.0.1"},
{"source", "lg"},
{"userName", "zlzl"},
{"timeZ",WebHelper.GetTimeZ(DateTime.Now).ToString()},//调用GetTimeZ
}; dict["sign"] =WebHelper.CreateSign(dict, AppKey);//调用CreateSign var result = WebHelper.DoGet(url, dict);//调用DoGet
Response.Write(string.Format("注册接口测试结果:{0}",result));
}
构建API的更多相关文章
- lumen 构建api(dingo api)
什么是 API API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力, ...
- Spring Boot中使用Swagger2构建API文档
程序员都很希望别人能写技术文档,自己却很不愿意写文档.因为接口数量繁多,并且充满业务细节,写文档需要花大量的时间去处理格式排版,代码修改后还需要同步修改文档,经常因为项目时间紧等原因导致文档滞后于代码 ...
- springboot+mybatis-puls利用swagger构建api文档
项目开发常采用前后端分离的方式.前后端通过API进行交互,在Swagger UI中,前后端人员能够直观预览并且测试API,方便前后端人员同步开发. 在SpringBoot中集成swagger,步骤如下 ...
- ASP.NET WebAPI构建API接口服务实战演练
一.课程介绍 一.王小二和他领导的第一次故事 有一天王小二和往常一下去上早班,刚吃完早餐刚一打开电脑没一会儿.王小二的领导宋大宝走到他的面前,我们现在的系统需要提供服务给其他内部业务系统,我看你平时喜 ...
- springboot学习-jdbc操作数据库--yml注意事项--controller接受参数以及参数校验--异常统一管理以及aop的使用---整合mybatis---swagger2构建api文档---jpa访问数据库及page进行分页---整合redis---定时任务
springboot学习-jdbc操作数据库--yml注意事项--controller接受参数以及参数校验-- 异常统一管理以及aop的使用---整合mybatis---swagger2构建api文档 ...
- ASP.NET Core WebApi构建API接口服务实战演练
一.ASP.NET Core WebApi课程介绍 人生苦短,我用.NET Core!提到Api接口,一般会想到以前用到的WebService和WCF服务,这三个技术都是用来创建服务接口,只不过Web ...
- springboot利用swagger构建api文档
前言 Swagger 是一款RESTFUL接口的文档在线自动生成+功能测试功能软件.本文简单介绍了在项目中集成swagger的方法和一些常见问题.如果想深入分析项目源码,了解更多内容,见参考资料. S ...
- 构建 API 的7个建议【翻译】
迄今为止,越来越多的企业依靠API来为客户提供服务,以确保竞争的优势和业务可见性.出现这个情况的原因是微服务和无服务器架构正变得越来越普遍,API作为其中的关键节点,继承和承载了更多业务. 在这个前提 ...
- 用lumen构建API的相关流程
概述 Lumen是一个基于Laravel的微框架,主要用于小型应用和微服务,专注于性能和速度的优化,该框架一个重要的应用就是构建 RESTAPI. 为什么用Lumen构建REST API Lumen访 ...
- Golang:使用 httprouter 构建 API 服务器
https://medium.com/@gauravsingharoy/build-your-first-api-server-with-httprouter-in-golang-732b7b01f6 ...
随机推荐
- some nets were not able to be matched
原因是:PCB画好之后再次更改原理图,将更改后的原理图更新至PCB的时候会导致原理图中新生成的网络和PCB中原有的网络名不匹配 解决办法:PCB---设计----网络表---编辑网络,把PCB中不匹配 ...
- python 日志的配置,python对日志封装成类,日志的调用
# python 日志的配置,python对日志封装成类,日志的调用 import logging # 使用logging模块: class CLog: # --------------------- ...
- unity, 忽略碰撞
一,layer之间忽略碰撞. Edit->Project Settings->Physics->Layer Collision Matrix 二,collider之间忽略碰撞. vo ...
- 并发登录人数控制--Shiro系列(二)
为了安全起见,同一个账号理应同时只能在一台设备上登录,后面登录的踢出前面登录的.用Shiro可以轻松实现此功能. shiro中sessionManager是专门作会话管理的,而sessinManage ...
- 使用API Gateway
http://dockone.io/article/482 [编者的话]本系列的第一篇介绍了微服务架构模式.它讨论了采用微服务的优点和缺点,除了一些复杂的微服务,这种模式还是复杂应用的理想选择. Do ...
- iOS开发之使用AFN上传图片
//1.创建管理者对象 AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; manager.responseSerializ ...
- 0067 MySQL的日期字段的取值用单引号
这两天在做sql练习题http://www.cnblogs.com/zxx193/p/4000467.html的时候,涉及到下面的建表+插数据操作 CREATE TABLE t1( s_no VARC ...
- javascript 异步实现方案
1.回调函数 fn1( fn2 ); 2.事件监听 fn1.on('done', fn2); function fn1() { setTimeout(function(){ fn1.trigger(' ...
- Eclipse中安装JBoss Tools插件
1.先访问JBoss Tools网站,看看上面怎么说: http://tools.jboss.org -> 进入下载界面 看到下面这句话: Drag and drop this icon in ...
- Unix系统编程()改变信号处置:signal
Unix系统提供了两种方法来改变信号处置:signal和sigaction.这篇描述的是signal系统调用,是设置信号处理的原始API,所提供的接口比sigaction简单.另一方面,sigacti ...