前言

过程,如图:

第一步创建一个帮助类,类里面提供了加密、组装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的更多相关文章

  1. lumen 构建api(dingo api)

    什么是 API API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力, ...

  2. Spring Boot中使用Swagger2构建API文档

    程序员都很希望别人能写技术文档,自己却很不愿意写文档.因为接口数量繁多,并且充满业务细节,写文档需要花大量的时间去处理格式排版,代码修改后还需要同步修改文档,经常因为项目时间紧等原因导致文档滞后于代码 ...

  3. springboot+mybatis-puls利用swagger构建api文档

    项目开发常采用前后端分离的方式.前后端通过API进行交互,在Swagger UI中,前后端人员能够直观预览并且测试API,方便前后端人员同步开发. 在SpringBoot中集成swagger,步骤如下 ...

  4. ASP.NET WebAPI构建API接口服务实战演练

    一.课程介绍 一.王小二和他领导的第一次故事 有一天王小二和往常一下去上早班,刚吃完早餐刚一打开电脑没一会儿.王小二的领导宋大宝走到他的面前,我们现在的系统需要提供服务给其他内部业务系统,我看你平时喜 ...

  5. springboot学习-jdbc操作数据库--yml注意事项--controller接受参数以及参数校验--异常统一管理以及aop的使用---整合mybatis---swagger2构建api文档---jpa访问数据库及page进行分页---整合redis---定时任务

    springboot学习-jdbc操作数据库--yml注意事项--controller接受参数以及参数校验-- 异常统一管理以及aop的使用---整合mybatis---swagger2构建api文档 ...

  6. ASP.NET Core WebApi构建API接口服务实战演练

    一.ASP.NET Core WebApi课程介绍 人生苦短,我用.NET Core!提到Api接口,一般会想到以前用到的WebService和WCF服务,这三个技术都是用来创建服务接口,只不过Web ...

  7. springboot利用swagger构建api文档

    前言 Swagger 是一款RESTFUL接口的文档在线自动生成+功能测试功能软件.本文简单介绍了在项目中集成swagger的方法和一些常见问题.如果想深入分析项目源码,了解更多内容,见参考资料. S ...

  8. 构建 API 的7个建议【翻译】

    迄今为止,越来越多的企业依靠API来为客户提供服务,以确保竞争的优势和业务可见性.出现这个情况的原因是微服务和无服务器架构正变得越来越普遍,API作为其中的关键节点,继承和承载了更多业务. 在这个前提 ...

  9. 用lumen构建API的相关流程

    概述 Lumen是一个基于Laravel的微框架,主要用于小型应用和微服务,专注于性能和速度的优化,该框架一个重要的应用就是构建 RESTAPI. 为什么用Lumen构建REST API Lumen访 ...

  10. Golang:使用 httprouter 构建 API 服务器

    https://medium.com/@gauravsingharoy/build-your-first-api-server-with-httprouter-in-golang-732b7b01f6 ...

随机推荐

  1. Android:EditText限制文字输入

    Android的编辑框控件EditText在平常编程时会经常用到,有时候会对编辑框增加某些限制,如限制只能输入数字,最大输入的文字个数,不能输入 一些非法字符等,这些需求有些可以使用android控件 ...

  2. android VLayout 全面解析

    概述 前不久.阿里新开源了2个东西,Atlas和vlayout.今天我来介绍下vlayout的使用. 在介绍前,先抱怨两句,阿里放开源出来,感觉就是让我们这群人给他们找bug~~我曾遇到一个奇怪的问题 ...

  3. Python 实现小数和百分数的相互转换

    # -*- coding: utf-8 -*- #百分比转换位小数 # -*- coding: utf-8 -*- s = '20%' # 默认要转换的百分比是字符串aa = float(s.stri ...

  4. mysql lower_case_table_names ---- 一律把表名处理为小写

    一.从操作系统说起: 1.我们知道mysql 是跨平台的.它可以在许多平台上运行如windows .linux.unix(mac).linux 是类unix的, 但是windows和linux就有非常 ...

  5. [Jobdu] 题目1493:公约数

    题目描述: 给定两个正整数a,b(1<=a,b<=100000000),计算他们公约数的个数.如给定正整数8和16,他们的公约数有:1.2.4.8,所以输出为4. 输入: 输入包含多组测试 ...

  6. max_int和-1

    #include <stdio.h> int main(int argc, char *argv[]) { unsigned ; ) printf("umax:%u == -1\ ...

  7. PCI-Express协议传输层读书笔记

    http://www.doczj.com/doc/35cb19633169a4517723a3d9-9.html

  8. android.view.animation(1) - alpha、scale、translate、rotate、set的xml属性和用法(转)

    一.ScaleAnimation ScaleAnimation(float fromX, float toX, float fromY, float toY, int pivotXType, floa ...

  9. vss安装及服务器端、客户端配置图文教程

    安装VSS 一.双击setup. 之后点完成.就安装完了! 服务器端VSS配置 一.选择开始——所有程序——打开 一直下一步  到完成 二.然后再打开 说明:把这个enable rights and  ...

  10. jquery 获取绑定事件

    在1.8.0版本之前,我们要想获取某个DOM绑定的事件处理程序可以这样: 1 $.data(domObj,'events');//或者$('selector').data('events') 而从1. ...