PDO统一接口开发规范1.0 事例

原创 2011年01月19日 19:46:00

这个星期做了一个API接口整合的程序大家还是看程序把!

PDO统一接口开发规范1.0 加密方式

密码加密是MD5  32位加密

syskey 加密是32位安全码

功能描述:

     1: 从A网站登录到B网站(A网站也同时登录)

     2: 从B网站登录到A网站(B网站也同时登录)

注意:

    1:俩个站点的syskey要一样。

    2:俩个站点的用户名和密码要一样。

    3:俩个站点是用XML传输的 编码是gb2312

使用说明:
   1:在项目登录页中添加如下代码:
   #region 动易,动网,Oblog 整合 编写人:JONE 编写时间:2011年1月13日 16:54:30
    if (PDOAction.Instance().Enabled){
        PDOAction.Instance().Login(Username.Text, hashPassword, 1);
    }
    #endregion

  请求

     格式:

POST HTTP/1.1 Content-Type: text/xml; charset=gb2312
<?xml version="1.0" encoding="gb2312"?>
<root>
<appid>程序标识</appid>
<action>操作类型</action>
<syskey>安全码</syskey>
<username>用户名</username>
<可选元素列表 />
</root>

       提供 API 请求类  (PDOAction类)   

代码
/// <summary>
/// 是否开启整合
/// </summary>
/// <returns>true|false</returns>
public bool Enabled
{
get{
string enable = APIConfigs.GetConfigParam("API_Enable");
SysLog.WriterLog(
"PDOAction.Enabled(是否开启整合) " + enable);
if (enable.ToLower() == "true"){
return true;
}
return false;
}
}
/// <summary>
/// 整合登录
/// </summary>
/// <param name="username">用户名</param>
/// <param name="password">用户密码(未加密)</param>
/// <param name="saveDays">保存Cookie的天数</param>
public void Login(string username, string password, int saveDays)
{
try{
string LoginString = "";
Login(username, password, saveDays,
ref LoginString);
Fetch.Trace(LoginString);
SysLog.WriterLog(
"PDOAction.Login.LoginString=" + LoginString);
}
catch(Exception ex){
SysLog.WriterLog(
"PDOAction.Login.LoginString 错误:=" + ex.Message);
}
}
public void Login(string username, string password, int saveDays, ref string LoginString)
{
PDOData pdo
= new PDOData();
pdo.SetValue(
"action", "login", 0);
pdo.SetValue(
"username", username, 1);
pdo.SetValue(
"password", password, 0);
pdo.SetValue(
"userstatus", "1", 0);
pdo.SetValue(
"status", "1", 0);
string pwdkey = APIConfigs.GetConfigParam("API_Key");
pwdkey
= Text.MD5(username + pwdkey);
pdo.SetValue(
"syskey", pwdkey, 0);

int savecookie = 0;
if (saveDays >= 7) savecookie = 1;
if (saveDays >= 30) savecookie = 2;
if (saveDays >= 365) savecookie = 3;

pdo.SetValue(
"savecookie", savecookie.ToString(), 0);
pdo.SendHttpData();
if (pdo.Status == "1")
{
SysLog.WriterLog(
"PDOAction.Login() " + pdo.Message);
//HttpContext.Current.Response.Write(pdo.Message);
//HttpContext.Current.Response.End();
}
HttpContext.Current.Response.Buffer
= true;
LoginString
= pdo.SetCookie(username, password, savecookie.ToString());
}

 

 

 

  响应

      格式:

HTTP/1.1 200 OK Content-Type: text/xml; charset=gb2312 Content-Length: length
<?xml version="1.0" encoding="gb2312"?>
<root>
<appid>程序标识</appid>
<status>操作结果</status>
<body>
  <message>操作不成功时返回的错误描述</message>
 <可选元素列表 />
</body>
</root>

          提供 API 响应的类( pdo 类)

 

代码
private void Pdo_Load(object sender, EventArgs e)
{
#region 初始化操作
// 设置 HTTP 头
Response.ContentType = "text/xml";
Response.ContentEncoding
= System.Text.Encoding.GetEncoding("gb2312");

if (Get("syskey") == "" || Get("username") == ""){
try
{
XmlTextReader reader
= new XmlTextReader(Request.InputStream);
reader.WhitespaceHandling
= WhitespaceHandling.None; xmlDoc.Load(reader);
}
catch (XmlException xmle){
//this.__Finish(1, "获取xmlDoc失败=" + xmle.Message, true);
}
}
if (!PDOAction.Instance().Enabled){
this.__Finish(1, "整合没有开启", true);
}
//分析请求中的数据并将它们加载到 DNTParam[] 中
parameters = GetParamsFromRequest(Request);
// 验证安全码 syskey
if (!CheckSysKey()){
this.__Finish(1, "安全密钥错误!", true);
}
#endregion
#region 提交数据
if (CheckPost())
{
string action = Get("action");
switch (action.ToLower())
{
case "checkname":{
CheckName();
break;
}
case "reguser":{
//RegUser();
break;
}
case "login":
{
UserLogin();
break;
}
case "logout":
{
Logout();
break;
}
case "update":
{
//UpdateUser();
break;
}
case "delete":
{
//DeleteUser();
break;
}
case "lock":
{
//LockUser();
break;
}
case "getinfo":
{
GetInfo();
break;
}
case "checkemail":
{
//CheckEmail();
break;
}
default:{
SaveUserCookie();
this.__Finish(1, "未指定操作类型", true);
break;
}
}
}
#endregion
}
private void __Finish(int status, string message,bool flg)
{
#region API提示信息
XmlTextWriter writer
= null;
try
{
writer
= new XmlTextWriter(Response.Output);
writer.Formatting
= Formatting.Indented;
writer.WriteStartDocument();
writer.WriteStartElement(
"root");
writer.WriteStartElement(
"appid");
writer.WriteString(
"JXXYCMOA");
writer.WriteEndElement();
writer.WriteStartElement(
"status");
writer.WriteString(status.ToString());
writer.WriteEndElement();
writer.WriteStartElement(
"needcookie");
if (null != parameters)
{
writer.WriteString(
"1" == Request.QueryString["needcookie"] ? "1" : "0");
}
writer.WriteEndElement();
writer.WriteStartElement(
"body");
writer.WriteStartElement(
"message");
writer.WriteString(message);
writer.WriteEndElement();

// 将可选的列表追加进来
if (null != parameters && parameters.Length > 0){
foreach (DNTParam param in parameters){
if (param.Name != null && param.Name.Length > 0){
writer.WriteStartElement(param.Name);
writer.WriteString(param.Value);
writer.WriteEndElement();
}
}
}
writer.WriteEndElement();
writer.WriteEndElement();
writer.WriteEndDocument();
}
finally
{
if (null != writer)
{
writer.Close();
writer
= null;
}
}
#endregion
if (flg == true){
Response.End();
}
}

private string Get(string key)
{
string tp = "";
if (string.IsNullOrEmpty(Request.QueryString[key])){
if (xmlDoc != null)
tp
= xmlDoc.DocumentElement.SelectSingleNode(key).InnerText.ToString();
}
else{
tp
= Request.QueryString[key].ToString();
}
if (tp.Length > 0)
return tp;
else
return "";
}

private bool CheckPost()
{
string appid = Get("appid");
string syskey = Get("syskey");
string action = Get("action");
string username = Get("username");
string userTrueIP = Get("userip");

if (appid == null || syskey == null || username == null){
this.__Finish(1, "提交数据非法,操作中止!", true);
return false;
}
if (syskey != Text.MD5(username + APIConfigs.GetConfigParam("API_Key"))){
this.__Finish(1, "所提交的api_key未关联到任何设定程序。" + syskey, true);
return false;
}
return true;
}

 

 

事例代码下载

版权声明:本文为博主原创文章,未经博主允许不得转载。

RESTful的Api设计之统一接口

内容根据 Java RESTful Web Service实战 [韩陆著] 整理 REST统一接口 REST式的Web服务和RPC式的Web服务在接口定义上的区别是,REST使用HTTP通用方法作...
  • wangtongxue123456
  • wangtongxue123456
  • 2017年02月23日 10:38
  • 1664

《移动开发接口及文档编写规范》V1.0

《移动开发接口及文档编写规范》V1.0文档说明 编写整理:童正刚 2015-05 一、概述 ü      有关接口 1、接口是纯数据的交互 APP接口是移动设备和业务之间进行通信的途径。实质...
  • TZG12345
  • TZG12345
  • 2015年05月26日 16:17
  • 6634

统一接口开发架构,统一接口架构实现封装

在一段时间的代码开发过程中和对同事开发的观察,发现在进行以json数据为返回的数据接口时,经常需要针对于具体的功能编写具体的接口,在实现过程中做了很多的重复工作,所以本人就萌发了做一套统一接口开发的架...
  • u012613934
  • u012613934
  • 2017年06月19日 10:58
  • 691

关于RESTful一些注意事项,和自己整理的接口开发规范

最近在研究restful,公司开发要使用,所以自己就去网上找了好些资料,并整理了一套公司开发的接口规范。当然,我也只是刚刚入坑。还不是很全面。但是这就是一个过程。一点点,总会好起来的。以下是就是RES...
  • u013731455
  • u013731455
  • 2017年02月21日 10:59
  • 9909

jQuery源码学习---插件接口的设计

如果jQuery没有插件接口的设计,那么他就像一个光杆司令没有士兵,就是没有手下,只有自己一个封闭的城堡。因此jQuery城堡需要设计一个大门--插件接口,从而打开大门开始招兵买马。当然jQuery除...
  • u010585120
  • u010585120
  • 2016年09月14日 10:37
  • 283

阿里巴巴Java开发规范手册

阿里巴巴 JAVA 开发手册   1 / 32    Java 开发手册  版本号 制定团队 更新日期 备  注  1.0.0 阿里巴巴集团技术部 2016.12.7 首次向 Java 业界...
  • u012162903
  • u012162903
  • 2017年02月19日 17:05
  • 3483

Java项目开发规范参考

iB2Team项目开发规范 By KevinLee 2016-4-20 Email: hi@lidengju.com 小弟不才,仅供参考 1. 目的为了使软件开发过程顺畅,保证软件...
  • u011383131
  • u011383131
  • 2016年04月23日 19:40
  • 6113

PHP:API 接口规范完整版本

整体规范建议采用RESTful 方式来实施。 协议 API与用户的通信协议,总是使用HTTPs协议,确保交互数据的传输安全。 域名 应该尽量将API部署在专用域名之下。 ht...
  • zhs45656
  • zhs45656
  • 2016年08月02日 15:22
  • 1712

RESTful api接口规范

整体规范建议采用RESTful 方式来实施。   协议 API与用户的通信协议,总是使用HTTPs协议,确保交互数据的传输安全。   域名 应该尽量将API部署在专用域名之下。 https://api...
  • u010622769
  • u010622769
  • 2017年01月11日 10:40
  • 6471

笔记--统一编程接口外观模式

外观模式在开发过程中使用频率非常高,它的精髓二字在于封装。通过一个高层次结构为用户提供统一的API入口,使得用户通过一个类型就基本能操作整个系统,这样减少了用户的使用成本,也能提升系统的灵活性。 使用...
  • q178266871
  • q178266871
  • 2016年02月15日 16:26
  • 322
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:PDO统一接口开发规范1.0 事例
举报原因:
原因补充:

(最多只允许输入30个字)