构建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 ...
随机推荐
- WinForm下的键盘事件(KeyPress、KeyDown)及如何处理不响应键盘事件
KeyDown事件用来处理功能键:F1 F2 F3... keyPress事件用来处理字符比如说:A B C... 1 2 3... 注:处理该事件时,需要先将窗体的 KeyPreview=true; ...
- servlet响应解析
response对象可以设置一些响应信息 1)设置状态码 response.setStatus(int) 2)设置响应头信息.定时刷新或者间隔 n 秒后跳转 response.setHeader(&q ...
- python随机数seed用法
import random ... def main(): a = random.Random() a.seed(1) print a.random() 这样就可以通过种子取得固定随机值了 网上很多只 ...
- 编译g++后更新libstdc++.so.6链接
若不更新链接,运行时可能会发生错误: ./a.out: /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.14' not found (required by ...
- ISTQB测试人员认证 初级(基础级)大纲
ISTQB测试人员认证 初级(基础级)大纲 ---中文修订版本1(2015年5月6日) 2015-06-22 大纲pdf下载 ISTQB资料中心 在课程大纲中,每个章节都会提供相应的认知水平要求: ...
- Windows操作系统下 使用c++ WIN32API禁用控制台最小化和关闭按钮
#include<Windows.h> //屏蔽控制台最小按钮和关闭按钮 HWND hwnd = GetConsoleWindow(); HMENU hmenu = GetSystemMe ...
- FreeRTOS基础知识
前面一篇文章介绍了一些命名规范之类的基础知识,但是我觉得还缺少一定前言知识,就是裸机和操作系统有什么区别,为什么我们需要学freertos,因为招聘要求?那么为什么招聘网又会有这个要求呢?所以我们为什 ...
- 替换元素节点replaceChild()
替换元素节点replaceChild() replaceChild 实现子节点(对象)的替换.返回被替换对象的引用. 语法: node.replaceChild (newnode,oldnew ) 参 ...
- 彻底征服 Spring AOP 之 理论篇
基本知识 其实, 接触了这么久的 AOP, 我感觉, AOP 给人难以理解的一个关键点是它的概念比较多, 而且坑爹的是, 这些概念经过了中文翻译后, 变得面目全非, 相同的一个术语, 在不同的翻译下, ...
- oracle中select clob的返回类型
当select的字段是clob类型的数据时,但是数据长度在2000字节到4000字节时,默认转为long类型. 所以当用insert into select的时候,预期插入的是clob类型,但是报or ...