最近一个wpf项目需要改写成android项目,思路是在asp.net项目中编写一个通用接口,便于其它平台下调用数据。刚接触到这些东西的时候完全是一头雾水,最根本的原因是不明白网站中的一个网页,为什么其它项目就可以访问它,并获取数据。带着疑问在asp.net项目
最近一个wpf项目需要改写成android项目,思路是在asp.net项目中编写一个通用接口,便于其它平台下调用数据。刚接触到这些东西的时候完全是一头雾水,最根本的原因是不明白网站中的一个网页,为什么其它项目就可以访问它,并获取数据。带着疑问在asp.net项目编写一个简单的数据接口,并新建一个小winform项目直接访问它。本文涉及到的知识点有:在asp.net项目中如何编写一个数据接口;使用反射辨别响应的方法;以及如何获取接口的数据。这里仅仅是介绍如何使用它们,而不讲述使用它们的基本原理,一是本人道行浅薄对基本原理不了解,害怕随便书写误导后人;二是如果阐述其基本原理,势必需要花费大量时间,奈何时间有限。将来如果上述两个条件满足,必会在最下面做出论述,因为这对自己的进步也是一个肯定。闲话少说,开始正文。
主要内容:
1、asp.net项目下编写数据接口
2、使用反射分辨调用方法
3、新建一个winform项目测试接口的正确性
1、在asp.net项目下编写一简单接口
编写一个方法,构造一个json字符串response即可。
private void examinfologin() { string aa = 8; string bb = 9; string roomname = request.form[roomname]; if (roomname == 806) { aa = 7; } stringbuilder jsonstringbuilder = new stringbuilder(); jsonstringbuilder.append({); jsonstringbuilder.append(\uname\:\).append(aa).append(\,); jsonstringbuilder.append(\password\:\).append(bb).append(\); jsonstringbuilder.append(}); response.write(jsonstringbuilder.tostring()); }
2、使用反射选取调用方法
假设在aspx页面中有很多方法,而在使用过程中往往仅需要调用其中的某一个方法,此处用反射选取调用方法。
反射过程中使用的常量:
private const string page_path_info = /appdatainterface/examlogin.aspx;//页面 private const string assembly_name = osceweb;//程序集 private const string class_name = osceweb.appdatainterface.examlogin;//类名
重写oninit方法:
protected override void oninit(eventargs e) { string pathinfo = request.params[path_info]; if (pathinfo.startswith(page_path_info + /)) { string[] namelist = pathinfo.substring(page_path_info.length + 1).split('/'); if (namelist.length < 1) { response.end(); return; } try { assembly assembly = assembly.load(assembly_name); type type = assembly.gettype(class_name); methodinfo method = type.getmethod(namelist[0], system.reflection.bindingflags.nonpublic | system.reflection.bindingflags.instance); method.invoke(this, null); } catch (exception ex) { response.end(); return; } } }
在page_load方法中添加:
if (request.params[path_info].startswith(page_path_info + /)) { response.end(); }
3、新建一winform项目,访问asp.net中数据接口
发布asp.net项目,网址:http://192.168.4.22:8005
1)无需向数据接口传递数据:
private void button1_click(object sender, eventargs e) { string strurl = http://192.168.4.22:8005/appdatainterface/examlogin.aspx/examinfologin; request = (system.net.httpwebrequest)webrequest.create(strurl); response = (system .net.httpwebresponse )request .getresponse (); system.io.streamreader streamreader = new system.io.streamreader(response.getresponsestream(), encoding.utf8); string responsetext = streamreader.readtoend(); streamreader.close(); messagebox.show(responsetext); }
得到的数据是:{uname:8,password:9}
2)以post方式向数据接口传递数据,获取接口数据
private void button2_click(object sender, eventargs e) { string strurl = http://192.168.4.22:8005/appdatainterface/examlogin.aspx/examinfologin; request = (system.net.httpwebrequest)webrequest.create(strurl); request.method = post; request.contenttype = application/x-www-form-urlencoded; string param = roomname=806; asciiencoding encoding = new asciiencoding (); byte[] data = encoding.getbytes(param); request.contentlength = data.length; system.io.stream stream = request.getrequeststream(); stream.write(data, 0, data.length); stream.close(); response = (system.net.httpwebresponse)request.getresponse(); system.io.streamreader streamreader = new system.io.streamreader(response.getresponsestream(), encoding.utf8); string responsetext = streamreader.readtoend(); streamreader.close(); messagebox.show(responsetext); }
得到的数据:{uname:7,password:9}
4、总结
按照上述介绍的一些方法确实能完成项目,但是对其为什么该如此还是充满疑惑,总感觉心中无底、战战兢兢,希望有高手可以对小弟指点一二,不胜感激。