一、API接口的编码

1、首页的页面代码:

    protected void Page_Load(object sender, EventArgs e)
{
/*
* 请求路径:http://xxxx/index.aspx?appkey=&security=&t=&method=&...
* appkey是调用者身份码(系统分配)
* security是当前请求安全码(安全码=MD5(Key + Method),key为系统分配或调用者自行设定)
* t是请求模块(Member用户模块 Berth泊位模块 Transaction交易模块 Operation运维模块 Equipment设备模块 Other其他模块)
* method是请求函数
*/
Response.Expires = ;//页面使用后立即过期
Response.CacheControl = "no-cache";//设置页面不缓存在临时文件中.
DateTime dtStart = DateTime.Now;
if (!IsPostBack)
{
string strT = SZRPP.Common.SZRPPRequest.GetString("t");
//构造分类请求转发地址
string strHeadUrl = ConfigurationManager.AppSettings[strT];
string strQueryUrl = strT + "API/Index.aspx";
string strReturn = "";
string strParm = GetAllParameter();
StreamReader sr = null;
HttpWebResponse res = null;
if (strT != "" && strHeadUrl != "")
{
try
{
//请求转发
// HttpWebRequest 是 WebRequest 的派生类,专门用于 Http
HttpWebRequest req = HttpWebRequest.Create(strHeadUrl + strQueryUrl) as System.Net.HttpWebRequest;
//设置请求方式
req.Method = "POST";
req.ContentType = "application/x-www-form-urlencoded";
//写入流对象
StreamWriter requestWriter = new StreamWriter(req.GetRequestStream());
//写入请求参数
requestWriter.Write(strParm);
//释放写入流对象
requestWriter.Close();
requestWriter = null;
//GetResponse 方法才真的发送请求,等待服务器返回
res = req.GetResponse() as HttpWebResponse;
//以流的形式表示的回应内容
Stream str = res.GetResponseStream();
//将字节流包装为高级的字符流,以便于读取文本内容
sr = new StreamReader(str, System.Text.Encoding.UTF8);
//读取响应内容
strReturn = sr.ReadToEnd();
}
catch (Exception ex)
{
//记录异常日志
SZRPP.Common.Utils.WriteLogFile("请求重定向异常:" + ex.Message + " [" + strHeadUrl + strQueryUrl + "?" + strParm + "]", "异常日志");
}
finally
{
//关闭字符流,字符流底层的字节流将会自动关闭
if (sr != null)
sr.Close();
if (res != null)
res.Close();
}
}
Response.ClearContent();
//输出响应内容
Response.Write(Input.LostHTML(Input.URLDecode(strReturn)));
//TimeSpan tsTotal = DateTime.Now - dtStart;
//SZRPP.Common.Utils.WriteLogFile("请求内容:" + strParm + "\r\n响应内容:" + strReturn + "\r\n耗时:" + tsTotal.TotalSeconds + "秒 来源:" + SZRPPRequest.GetIP() + "\r\n\r\n", "-" + DateTime.Now.Hour + strT + "响应日志", "接口监控详情");
}
Response.End();
} /// <summary>
/// 获取所有参数重新拼接
/// </summary>
private string GetAllParameter()
{
StringBuilder sb = new StringBuilder();
foreach (string strKey in Request.Params.AllKeys)
{
if (SZRPPRequest.GetString(strKey) != "")
{
if (sb.Length > )
sb.Append("&");
sb.Append(strKey + "=" + SZRPPRequest.GetString(strKey));
}
}
return sb.ToString();
}

2、SZRPPRequest类方法(SZRPP.Common.SZRPPRequest.GetString("t"))

 /// <summary>
/// 获得Url或表单参数的值, 先判断Url参数是否为空字符串, 如为True则返回表单参数的值
/// </summary>
/// <param name="strName">参数</param>
/// <returns>Url或表单参数的值</returns>
public static string GetString(string strName)
{
if ("".Equals(GetQueryString(strName)))
{
strName =GetFormString(strName);
return strName;
}
else
{
strName = GetQueryString(strName);
return strName; }
} /// <summary>
/// 获得指定Url参数的值
/// </summary>
/// <param name="strName">Url参数</param>
/// <returns>Url参数的值</returns>
public static string GetQueryString(string strName)
{
if (HttpContext.Current.Request.QueryString[strName] == null)
{
return "";
}
return HttpContext.Current.Request.QueryString[strName];
} /// <summary>
/// 获得指定Url参数的值
/// </summary>
/// <param name="strName">Url参数</param>
/// <returns>Url参数的值</returns>
public static string GetQueryString(string strName)
{
if (HttpContext.Current.Request.QueryString[strName] == null)
{
return "";
}
return HttpContext.Current.Request.QueryString[strName];
}

3、API目录及发布在IIS上后的访问格式:

通过浏览器访问的格式:http://10.10.40.184:6066/Index.aspx?appkey=123456&security=4564646545455&t=Berth&method=getberth

其中【Berth】为【berthAPI】目录,【getberth】为【berthAPI】目录下index.aspx.cs下的【getberth】方法

4、API返回内容页面代码的编写(如【berthAPI】目录下的【index.aspx.cs】代码:

protected void Page_Load(object sender, EventArgs e)
{
APIHelper.CheckRequestSecurity();
Response.Expires = ;
Response.CacheControl = "no-cache";
Response.ClearContent();
if (!IsPostBack)
{
string strMethod = SZRPPRequest.GetString("method").ToString("filtersql").ToLower();
try
{
switch (strMethod)
{
//2.1 获取深圳市行政区列表
case "getcanton":
GetSZCanton();
break;
//2.2 获取某行政区下片区列表
case "getarea":
GetAreaByCa();
break;
//2.3 获取某片区下路段列表
case "getsection":
GetSectionByAr();
break;
//2.4 获取某路段下泊位列表
case "getberthbyse":
GetBerthBySE();
break;
//2.5 获取附近泊位列表(多少米以内)
case "getbearbyberth":
GetBearByBerth();
break;
//2.6 获取行政区下路段列表
case "getsectionbyca":
GetSectionByCA();
break;
//2.7 获取路段的收费规则
case "getchargingrules":
GetChargingRules();
break;
case "getberth":
GetBerthInfo();
break;
default:
break;
}
}
catch (System.Threading.ThreadAbortException) { }
catch (Exception ex)
{
//记录异常日志
SZRPP.Common.Utils.WriteLogFile("BerthAPI发生异常【" + ex.TargetSite.Name + "】:" + ex.Message + " " + ex.StackTrace, "异常日志");
}
}
Response.End();
} #region 获取深圳市行政区列表
/// <summary>
/// 获取深圳市行政区列表
/// </summary>
private void GetSZCanton()
{
StringBuilder sb = new StringBuilder();
CantonBll cantonBll = new CantonBll();
DataTable dt = null;
if (DataCache.GetCache("APICanton") == null)
{
dt = cantonBll.GetList();
DataCache.SetCache("APICanton", dt);
}
else
{
dt = (DataTable)DataCache.GetCache("APICanton");
}
if (dt != null && dt.Rows.Count > )
{
sb.Append("{\"count\":" + dt.Rows.Count + ",");
sb.Append("\"items\":");
sb.Append("[");
foreach (DataRow dr in dt.Rows)
{
sb.Append("{");
sb.Append("\"CantonId\":\"" + dr["CantonId"].ToString() + "\",");
sb.Append("\"CantonCode\":\"" + dr["CantonCode"].ToString() + "\",");
sb.Append("\"CantonName\":\"" + dr["CantonName"].ToString() + "\",");
sb.Append("\"CantonLat\":\"" + dr["CantonLat"].ToString() + "\",");
sb.Append("\"CantonLng\":\"" + dr["CantonLng"].ToString() + "\",");
sb.Append("\"BerthNums\":\"" + dr["BerthNums"].ToString() + "\"");
sb.Append("},");
}
sb.Remove(sb.Length - , );
sb.Append("]}");
APIHelper.ReturnData(APIHelper.ReturnStatus.成功, "success", "成功", sb.ToString());
}
else
{
APIHelper.ReturnData(APIHelper.ReturnStatus.失败, "no_data", "没有行政区", "");
}
}
#endregion #region 单泊位查询
/// <summary>
/// 单泊位信息查询
/// </summary>
private void GetBerthInfo()
{
//泊位编号
string strBerthCode = SZRPPRequest.GetString("berthcode").ToString("filtersql");
BerthBll berthBll = new BerthBll();
DataTable dtBerth = berthBll.GetBerthInfo(strBerthCode);
if (dtBerth != null && dtBerth.Rows.Count > )
{
DataRow dr = dtBerth.Rows[];
StringBuilder sb = new StringBuilder();
//泊位编号
sb.Append("{\"berthcode\":\"" + dr["BerthCode"].ToString() + "\"");
//片区
sb.Append(",\"areaid\":\"" + dr["AreaId"].ToString() + "\"");
//行政区
sb.Append(",\"cantonid\":\"" + dr["CantonId"].ToString() + "\"");
//泊位状态
sb.Append(",\"berthstatus\":\"" + dr["BerthStatus"].ToString() + "\"");
//经度
sb.Append(",\"berthlongitude\":\"" + dr["BerthLongitude"].ToString() + "\"");
//纬度
sb.Append(",\"berthlatitude\":\"" + dr["BerthLatitude"].ToString() + "\"");
//停车状态
sb.Append(",\"parkstatus\":\"" + dr["ParkStatus"].ToString() + "\"}"); APIHelper.ReturnData(APIHelper.ReturnStatus.成功, "success", "成功", sb.ToString());
}
else
APIHelper.ReturnData(APIHelper.ReturnStatus.失败, "berth_not_exist", "抱歉,您输入的泊位号不存在", ""); }
#endregion #region 获取所有的行政区和片区 private void GetCantonAndArea()
{
StringBuilder sb = new StringBuilder(); #region 获取行政区 DataTable dtCanton = null;
if (DataCache.GetCache("APICanton") == null)
{
CantonBll cantonBll = new CantonBll();
dtCanton = cantonBll.GetList();
DataCache.SetCache("APICanton", dtCanton);
}
else
{
dtCanton = (DataTable)DataCache.GetCache("APICanton");
} #endregion #region 获取片区 DataTable dtArea = null;
if (DataCache.GetCache("APIArea") == null)
{
AreaBll areaBll = new AreaBll();
dtArea = areaBll.GetAreaList();
DataCache.SetCache("APIArea", dtArea);
}
else
{
dtArea = (DataTable)DataCache.GetCache("APIArea");
} #endregion if (dtCanton != null && dtCanton.Rows.Count > )
{
if (dtArea != null && dtArea.Rows.Count > )
{
sb.Append("{\"cantons\":");
sb.Append("[");
foreach (DataRow dr in dtCanton.Rows)
{
sb.Append("{");
sb.Append("\"CantonId\":\"" + dr["CantonId"].ToString() + "\",");
sb.Append("\"CantonName\":\"" + dr["CantonName"].ToString() + "\"");
sb.Append("},");
}
sb.Remove(sb.Length - , );
sb.Append("],"); sb.Append("\"areas\":");
sb.Append("[");
foreach (DataRow dr in dtArea.Rows)
{
sb.Append("{");
sb.Append("\"AreaId\":\"" + dr["AreaId"].ToString() + "\",");
sb.Append("\"CantonId\":\"" + dr["CantonId"].ToString() + "\",");
sb.Append("\"AreaName\":\"" + dr["AreaName"].ToString() + "\"");
sb.Append("},");
}
sb.Remove(sb.Length - , );
sb.Append("]}"); APIHelper.ReturnData(APIHelper.ReturnStatus.成功, "success", "成功", sb.ToString());
}
else
{
APIHelper.ReturnData(APIHelper.ReturnStatus.失败, "no_Area", "没有片区数据", "");
}
}
else
{
APIHelper.ReturnData(APIHelper.ReturnStatus.失败, "no_Canton", "没有行政区数据", "");
}
} #endregion

二、接口的请求

     private readonly string url = ConfigurationManager.AppSettings["API"];
        private readonly string versontype = ConfigurationManager.AppSettings["versontype"];
        private readonly string appkey = ConfigurationManager.AppSettings["appkey"];
        private readonly string security = ConfigurationManager.AppSettings["security"];      public ActionResult Login()
{
string login = SZRTCRequest.GetString("login").ToString("filtersql");
string up = SZRTCRequest.GetString("up").ToString("filtersql");
string lastUrl = SZRTCRequest.GetString("u");
string safeCode = SZRTCRequest.GetString("safeCode").ToString("filtersql"); Session["Login"] = null;
ViewBag.LastUrl = lastUrl.ToString();//记录session失效前最后一次访问路径
if (!Request.IsAjaxRequest())
{
return View();
}
Dictionary<string, object> dic=null;
string strJson = "";
try
{
StringBuilder sb = new StringBuilder();
sb.Append(url);
sb.Append("MemberAPI/Index.aspx?versontype=" + versontype);
sb.Append("&appkey="+appkey);
sb.Append("&security=" + oldsecurity);
sb.Append("&t=Member&method=login&mobileno=" + login + "&pwd=" + MD5_SHA.EncryptPassword(up));
sb.Append("&sign="+sign); strJson = CommonLogic.GetJsonStr(sb.ToString()); var jss = new JavaScriptSerializer();
dic = (Dictionary<string, object>)jss.DeserializeObject(strJson);
}
catch (Exception ex)
{
Utils.WriteLogFile("调用Login方法时报错,错误信息:" + ex.Message, "登录异常");
} if (dic != null)
{
int status = int.Parse(dic["status"].ToString());
string msg = dic["msg"].ToString();
if (status == )
{
object data = dic["data"];
Session["Login"] = data;
} return Content(strJson);
}
else
{
return Content("-1"); }
} /// <summary>
/// 根据路径返回json字符
/// </summary>
/// <param name="url">调用接口路径</param>
/// <returns>返回json字符</returns>
public static string GetJsonStr(string url)
{
string message = "";
string strJson = "";
try
{
HttpWebRequest req = null;
HttpWebResponse webResp = null;
req = (HttpWebRequest)WebRequest.Create(url);
req.Method = "POST"; // Post method
req.ContentType = "text/html"; // content type
StreamWriter writer = new StreamWriter(req.GetRequestStream());
writer.WriteLine(message);
writer.Close();
webResp = (HttpWebResponse)req.GetResponse();
Stream answer = webResp.GetResponseStream();
StreamReader answerData = new StreamReader(answer, Encoding.UTF8);
strJson = answerData.ReadToEnd(); }
catch (Exception ex)
{
Utils.WriteLogFile("接口调用出现异常,异常信息:"+ex.Message,"接口调用异常");
}
return strJson;
}

通过HttpWebRequest请求与HttpWebResponse响应方式发布接口与访问接口的更多相关文章

  1. 【转】asp.net(c#)使用HttpWebRequest附加携带请求参数以post方式模拟上传大文件(以图片为例)到Web服务器端

    原文地址:http://docode.top/Article/Detail/10002 目录: 1.Http协议上传文件(以图片为例)请求报文体内容格式 2.完整版HttpWebRequest模拟上传 ...

  2. C#中Post请求的两种方式发送参数链和Body的

    POST请求 有两种方式 一种是组装key=value这种参数对的方式 一种是直接把一个字符串发送过去 作为body的方式 我们在postman中可以看到 sfdsafd sdfsdfds publi ...

  3. C# HttpWebRequest请求远程地址获取返回消息

    HttpWebRequest请求远程地址获取返回消息 /// <summary> /// 请求远程Api获取响应返回字符串 /// </summary> /// <par ...

  4. 通过HttpWebRequest请求https接口

    一.为什么进行代理接口的开发: 有些项目需要访问被墙了哒网站,比如前不久公司开发项目需要使用google地图的接口,而google在中国被墙了,所有打算做一个代理接口服务,将代理放到国外服务器上,通过 ...

  5. 第三篇 :微信公众平台开发实战Java版之请求消息,响应消息以及事件消息类的封装

    微信服务器和第三方服务器之间究竟是通过什么方式进行对话的? 下面,我们先看下图: 其实我们可以简单的理解: (1)首先,用户向微信服务器发送消息: (2)微信服务器接收到用户的消息处理之后,通过开发者 ...

  6. http常见请求头与响应头

    1.HTTP常见的请求头 If-Modified-Since:把浏览器端缓存页面的最后修改时间发送到服务器去,服务器会把这个时间与服务器上实际文件的最后修改时间进行对比.如果时间一致,那么返回304, ...

  7. Django---Http协议简述和原理,HTTP请求码,HTTP请求格式和响应格式(重点),Django的安装与使用,Django项目的创建和运行(cmd和pycharm两种模式),Django的基础文件配置,Web框架的本质,服务器程序和应用程序(wsgiref服务端模块,jinja2模板渲染模块)的使用

    Django---Http协议简述和原理,HTTP请求码,HTTP请求格式和响应格式(重点),Django的安装与使用,Django项目的创建和运行(cmd和pycharm两种模式),Django的基 ...

  8. Android HTTP实例 发送请求和接收响应

    Android HTTP实例 发送请求和接收响应 Android Http连接 实例:发送请求和接收响应 添加权限 首先要在manifest中加上访问网络的权限: <manifest ... & ...

  9. QT--以共享的方式发布应用,QT依赖库

    Building Qt as a Shared Library 因为:QT基本上都是采用动态编译的(被安装的OS中的),(如安装包往往都是默认动态编译处理好的动态库),所以我们采用动态连接的方式进行发 ...

随机推荐

  1. 10.6 CCPC northeast

    1001 Minimum's Revenge 点的编号从 1 到 n ,u  v 的边权是 LCM(u,v) ,求这个图的最下生成树 搞成一颗以 1 为 根 的菊花树 ---------------- ...

  2. boost::spirit unicode 简用记录

    本文简单记录使用boost::spirit解析有中文关键字的字符串并执行响应动作,类似于语法分析+执行. 关键字:字符串解析 boost::spirit::qi::parse qi::unicode: ...

  3. Linux主机共享目录给Windows主机的方法

    Linux主机共享目录可以通过samba来实现 首先,来看下百科上关于samba的介绍: Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件,由服务器及客户端程序构成.SMB(Ser ...

  4. asp.net ajax与jquery的冲突问题解决

    在网上看到有网友说,用了updatepannel这个asp.net ajax异步更新面板后,javascript或者jquery代码不起作用,实际上,可以在updatepannel的触发器中进行设置解 ...

  5. DNS bind子域授权安装

    失败经验:rhel 6.x bind 9.8,两台做子域授权,最后失败.原因不详. 改用rhel 5.5, bind 9.3,同样的配置,就成功了.具体记录一下9.3的配置. 安装:采用安装RHEL时 ...

  6. [并查集] POJ 1611 The Suspects

    The Suspects Time Limit: 1000MS   Memory Limit: 20000K Total Submissions: 35206   Accepted: 17097 De ...

  7. windows内核编程 白话设备栈

    在ntddk.h中定义了该函数原型: #if (NTDDI_VERSION >= NTDDI_WINXP) NTKERNELAPI NTSTATUS IoAttachDeviceToDevice ...

  8. jQuery LigerUI V1.2.2 (包括API和全部源码) 发布

    前言 这次版本主要对树进行了加载性能上面的优化,并解决了部分兼容性的问题,添加了几个功能点. 欢迎使用反馈. 相关链接 API:         http://api.ligerui.com/ 演示地 ...

  9. [转]显卡帝揭秘3D游戏画质特效

    显卡帝揭秘3D游戏画质特效 近几年来,大量采用最新技术制作的大型3D游戏让大部分玩家都享受到了前所未有的游戏画质体验,同时在显卡硬件方面的技术革新也日新月异.对于经常玩游戏的玩家来说,可能对游戏画质提 ...

  10. NFS网络文件系统安装配置

    简介 NFS(Network File System)FS是由Sun开发并发展起来的一项用于在不同机器,不同操作系统之间通过网络共享数据.客户端用mount命令把远程的NFS文件系统挂载到本地即可,操 ...