.net中http接口相关
最近要写接口,其中有一个要使用页面去接受数据,想了想怎么处理,想到一个方案。
要求是点击按钮向一个aspx页面post数据并且打开这个页面并显示post来的数据,于是搜索到了一个解决方案
首先在发起跳转和传数据的页面做手脚,搜索到了一个文章,介绍到了一个httphelper,文章链接:http://www.cnblogs.com/gb2013/p/aspnet_post_and_redirect.html
于是用这个成功实现了跳转,但是是当前页面,而不是新开的一个新的页面窗口,于是看这个类里面的PreparePOSTForm方法,然后做了改动,将form加了个target="_blank",于是实现了跳转新打开页面并post数据,该类方法不做解释,看类代码就懂了。
在接收数据的页面,也就是目标aspx页面写了处理请求的方法
pageload代码:
if (!Page.IsPostBack) { ProcessRequest(); }ProcessRequest方法:
// 获取所有的请求信息 string A= Request["A"].ToString(); string B= Request["B"].ToString(); string C= Request["C"].ToString(); string D= Request["D"].ToString(); string E= Request["E"].ToString(); // 先进行验证 string VE= FormsAuthentication.HashPasswordForStoringInConfigFile(A+ B+ C+ D+ E, "MD5"); // 进行判断是不是对的,有没有丢数据 if (VE== E) { // 相等,则可以进行正常操作 // 前台页面的数据绑定等相关操作写在这里 } else { // 不相等,有数据丢失,要求重新发送请求 // 进行数据丢失处理 }
以上方法没有涉及json序列化和加密等相关内容,仅有一个校验数据的过程,若有json和其他加密方式则可以获取请求的数据流进行解析即可。
另,该方法没有返回数据,仅限对方发来请求,接收方处理,但不返回数据或者数据返回需要以请求形式返回,这个是由于httphelper那个方法是提交形式发来的数据,如果需要直接返回则应当使用一般处理程序等其他方法。
将数据处理完成之后返回给发送方
// 初始化 Uri uri = new Uri("http://localhost:888/abc.aspx");// 目标地址 HttpWebRequest request = WebRequest.Create(uri) as HttpWebRequest; request.Method = "POST"; Encoding encoding = Encoding.GetEncoding("utf-8"); // 开始组装请求数据 string A= "a"; string B = "b"; string C= "c"; string D= "d"; string E= FormsAuthentication.HashPasswordForStoringInConfigFile(A+ B+ C+ D+ "A", "MD5"); // 把这些数据组装成请求 string postData = ""; // 组装要返回的数据,如果json需要将这个在序列化一下 byte[] byteData = encoding.GetBytes(postData); request.ContentType = "application/x-www-form-urlencoded"; request.ContentLength = byteData.Length; try { using (Stream postStream = request.GetRequestStream()) { // 发送数据,如果没有后面被注释掉的部分,请求会在这个方法执行完成之后再发送 postStream.Write(byteData, 0, byteData.Length); } //try //{ // using (HttpWebResponse response = request.GetResponse() as HttpWebResponse) // { // StreamReader reader = new StreamReader(response.GetResponseStream()); // string responseStr = reader.ReadToEnd(); // 同理,如果是经过了序列化的流需要在这里进行反序列化等相关操作 // if (responseStr != null && responseStr.Length > 0) // 返回的数据处理 // { // // 完成 // } // else // { // // 失败 // } // } //} //catch (WebException ee) //{ // string error = ee.Message; //} } catch (Exception ex) { string error = ex.Message; }以上就实现了网络接口,仅仅是最基本功能,不包括序列化和加密等操作。
如果接受的是一般处理程序,代码也基本相同,仅仅是返回的时候进行的处理,
返回部分代码如下:
// 返回处理结果 context.Response.ContentType = "application/x-www-form-urlencoded"; context.Response.Write(postData);该段代码仅仅是返回结果的类型处理,其中postData是经过处理的数据,类型与Write方法相符就行,Write方法有4个重载,支持的类型,有:char c, object obj, string s 和 char[] buffer,int index,int count,使用参考文档。
.net MVC里面使用的是controller进行这个操作,里面的实现方式相同。但是controller可以直接返回数据,将控制器的方法的返回类型改一下然后返回就好。
更新————————
今天用接口传图片的时候,双方使用base64串进行传输,传输过程中发现图片数据丢失,于是各种找问题,最后发现是传输过程中对base64进行了解密,导致的数据丢失,接收数据方那边是直接多进行了一次解密,于是发送方进行了URLEncode,于是该问题解决了。