如何在JSP中使用aa:http请求(aa:http详解)

nandy007
   2013-12-25 09:40:18发布  2017-02-22 11:47:27更新 2收藏, 2434浏览
ExMobi服务端技术
0

aa:http标签是页面抓取集成使用最广泛的一个标签,它主要实现的是一个HTTP协议的交互。

所以使用该标签前需要先对HTTP协议做个了解,请看此贴http://bbs.exmobi.cn/thread-1292-1-1.html

通过对HTTP协议的了解,我们知道一个HTTP协议的交互是包含请求和响应的。

所以aa:http标签的主要功能就是:请求信息的重组、请求的发送、响应信息的获取

这里需要说明的就是信息的重组

aa:http标签的基本写法为(本文涉及的所有{}包含的内容均为动态内容,视具体情况设置):

<aa:http id="{httpid}"/>

这种写法我们通常称为默认请求。通常一个HTTP请求是需要包含URL、method、头信息和请求正文的,那么这种默认请求中我们看不到任何URL的信息,是不是就意味它没有URL呢?答案当然是否定的,因为它不符合HTTP协议规范。但是这个请求却能正常发送出去,这是为什么呢?

这就是默认请求的特点:客户端请求的基本数据会作为默认请求的基本信息进行提交。

也就说,假设客户端有这么一个表单

<form action="http://domain/login.do" method="post">
用户名<input type="text" name="usr"/>
密码<input type="password" name="psw"/>
<input type="submit" value="Login"/>
</form>

给表单提交的action配置mapp路由进到JSP中,发起的默认请求的URL就是http://domain/login.do,method就是post,请求正文就是usr={usr}&psw={psw}

但是,很多时候,默认请求仅仅是为了把数据提交到JSP中,实际的aa:http请求的参数是需要重组的。

重组有两种方式:一种是在原来基础上进行修改;另一种是全新重组

在原来的基础上进行修改,实际上就是把需要修改的内容进行修改即可,aa:http标签支持对URL、method、请求和响应编码、响应内容类型(mimetype)的设置,其下的aa:param(键值对参数)、aa:content(非键值对参数)、aa:header(头信息)等标签可以设置请求正文和请求头。

比如上面的请求如果实际的action是http://domain/check.do,那么我们可以重组aa:http为

<aa:http id="{httpid}" url="http://domain/check.do"/>

如果是全新的重组,就是要清空默认请求,那么可以在aa:http标签中设置属性keepreqdata=false,需要注意的是,一旦设置了该属性,aa:http请求的默认内容就是空的,如果仍然继续发起默认请求,那么将会报错,因为默认的URL、method、头信息、请求正文都已经没有了,所以,如果是全新重组,需要把URL、method、头信息、请求正文等进行设置,一般头信息可以不设置,视具体情况而定,因为很多请求对请求头没有硬性要求。

前面的表单提交不符合要求,请求正文是json,那么可以重组请求:

<aa:http id="{httpid}" url="http://domain/check.do" method="post" keepreqdata="false">
<aa:content>
{"usr" :"<%=aa.getReqParameterValue("usr")%>", "psw":"<%=aa.getReqParameterValue("psw")%>"}
</aa:content>
</aa:http>

这样就完成了一个请求信息的重组。

在重组过程中,我们需要使用一些aa工具集函数来获取客户端请求过来的头信息、URL、键值对参数、非键值对参数等等来重组请求,比如上面的aa.getReqParameterValue(usr)函数就是获取客户端表单提交的键值对的参数usr的值。

1)       获取头信息

获取某个header的头信息方法如下:

String header = aa.getReqHeaderValue(“{headerName}”);

获取headers下的所有header的头信息方法如下:

HashMap<String, String> headers = aa.getReqAllHeader();

比如,要获取客户端请求的url是什么,可以通过如下方法:

String url = aa.getReqHeaderValue(“url”);// 得到http://domain/app/template/login.jsp

1)       获取参数信息

参数分为键值对(形如:a=1&b=2)参数和非键值对(一般为XML、JSON等文本)参数,而键值对参数有可能是在URL中,也有可能是在请求体中。

URL中的键值对参数值获取方法如下:

String para = aa.getReqParameterValueFromUrl(“paraName”);//获取某个url参数值
Map<String, Object> pmap = aa.getReqParametersFromUrl();//获取全部url中的参数

请求体中的键值对参数值获取方法如下:

String para = String para = aa.getReqParameterValue(“{paraName}”);//获取某个请求体参数值
Map<String, Object> pmap = aa.getReqParameters();//获取全部请求体中的参数

获取非键值对参数值的方法如下:

String reqContent = aa.getReqContent();//获取请求体中的非键值对参数

比如:客户端请求一个地址为http://domain/index.jsp?type=mobile那么要获取type参数的值mobile的方法为:

String type = aa. getReqParameterValueFromUrl (“type”);//得到的值为mobile

1)       获取附件信息

附件信息一般包含文件名、文件的字节流、文件的物理地址等信息。常用的方法有:

byte[]  file = aa.getReqAttachBody("{file}");//获取某个文件控件参数下文件的字节流
String fileName =  aa.getReqAttachName(“{file}”);//获得文件控件参数下文件的名称
boolean isDownload = aa.isDownload();//获得客户端请求的附件是否是做下载操作

具体重组成什么内容应该按照该请求的要求进行重组,如果请求报错,或者响应内容不正确,应该检查请求的URL、method、有信息、请求正文等关键信息。

下载APP
扫码下载栗子社区APP