构建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 ...
随机推荐
- java反射详解及说明
首先写一个Person类: package lltse.base.reflectdemo; public class Person { private String name ="张三&qu ...
- JS和JSP的差别
近期非常多同学在纠结于名词缩写之间的相似性.因此本人也来写一篇,讲讲JS和JSP的差别. SUN首先发展出SERVLET,其功能比較强劲,体系设计也非常先进,仅仅是,它输出HTML语句还是採用了老的C ...
- DevExpress中GridControl列转义的实现方法
/// <summary> /// CustomColumnDisplayText Helper /// </summary> /// <param name=" ...
- Python 实现小数和百分数的相互转换
# -*- coding: utf-8 -*- #百分比转换位小数 # -*- coding: utf-8 -*- s = '20%' # 默认要转换的百分比是字符串aa = float(s.stri ...
- 微信小程序请求wx.request数据,渲染到页面
先说一下基本使用.官网也有. 比如说你在App.js里面有这些变量.想修改某些值. data: { main_view_bgcolor: "", border: "&qu ...
- ui-router详解(二)ngRoute工具区别
我们了解 angular.js 是一种富客户端单页面应用,所以要在一个页面呈现不同的视图,路由起到了至关重要的作用. angular.js 为我们封装好了一个路由工具 ngRoute ,它是一种靠ur ...
- C++知识点 笔试常见
C++知识点 一.#include “filename.h”和#include <filename.h>的区别 #include “filename.h”是指编译器将从当前工作目录上开 ...
- Java类的实例化的初始化过程
A a = new A(); new 创建对象过程: 1.类加载 代码验证 2.给对象在内存(堆)中分配空间(给属性赋值): 3.属性赋默认值: byte,short.int,long -&g ...
- 【亲测好用!】shell批量采集百度下拉框关键词
[亲测好用!]shell批量采集百度下拉框关键词 SEO工具 方法 11个月前 (11-18) 2153浏览 3条评论 百度已收录 一直想写一篇用shell采集百度下拉框关键词的教程,个人感觉用 ...
- nyoj746 整数划分(四)
整数划分(四) 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 暑假来了,hrdv 又要留学校在参加ACM集训了,集训的生活非常Happy(ps:你懂得),可是他最近遇到 ...