phantomjs简单应用

来源:互联网 发布:炉石传说竞技场大数据 编辑:程序博客网 时间:2024/06/05 11:30

</pre>在java中通过runtime.exec(arg)来调用phantomjs得到解析js后的页面。就是通过进程间通信用java调用phantomjs这个组件去请求渲染页面,不过这种做法因为每次都要重新启动phantomjs进程,所以比较慢,还有另外一种直接用phantomjs加载页面后,把内容post给我们自定义的一个http后端接收数据,会更快一点。这样的话在java端就可以获得解析完成后的html页面了,而不是像WebDriver中需要使用Thread.sleep()这样的不确定性的代码来获取可能完成的代码。有一点需要说明:在phantomjs端的js代码千万不要要语法错误,否则js代码编译不同的话,java端就一直等待着,并不会抛异常。再就是由于在使用phantomjs.exe的时候,java端每次都要去开启一个phantomjs进程,时间上消耗还是比较大的。但是最起码来说结果是稳定的。phantomjs实现了无界面webkit,从phantom对象,window对象,web  page模块,file System模块,system模块,web server模块对phantomjs做出介绍:<p></p><p><span style="font-size:14px">phantom对象:定义和</span></p><p><span style="font-size:14px">1.phantom.args String[]获取传给本JS程序的参数,需要与 system.args进行区分(system模块详见下文),后者表示传给phantomjs引擎的参数。例如 phantomjs ./test.js http://baidu.com这句语句,通过phantom.args,我们能得到的参数列表为 ["http://baidu.com"],而通过 system.args则得到 ["./test.js", "http://baidu.com"]这样的参数列表。差异就在于是否包含当前脚本名称。不过 phantom.scriptName这个API提供了获取脚本名称的功能。</span></p><p><span style="font-size:14px">2.<span style="border:0px; font-size:14px; margin:0px; outline:0px; padding:0px; vertical-align:baseline; color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; line-height:30px"><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline"><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline">phantom</span><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline">.</span><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline">cookies</span></span></span><span style="color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; font-size:14px; line-height:30px"> Object[]<span style="color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; font-size:14px; line-height:30px">获取或设置cookies,不过对于设置建议使用其他的API完成。同时相关的API还有:</span></span></span></p><p><span style="font-size:14px"><span style="color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; font-size:14px; line-height:30px"><span style="color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; font-size:14px; line-height:30px"></span></span></span></p><ul style="border:0px; font-size:14px; margin:0px 0px 20px; outline:0px; padding:0px; vertical-align:baseline; list-style-position:initial; color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; line-height:30px"><li style="background-color:transparent; border:0px; margin:0px 0px 0px 30px; outline:0px; padding:0px; vertical-align:baseline"><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline"><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline"><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline">phantom</span><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline">.</span><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline">addCookie</span><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline">(</span><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline">Object</span><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline">)</span></span></span> Boolean:添加cookie值</li><li style="background-color:transparent; border:0px; margin:0px 0px 0px 30px; outline:0px; padding:0px; vertical-align:baseline"><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline"><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline"><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline">phantom</span><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline">.</span><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline">deleteCookie</span><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline">(</span><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline">cookieName</span><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline">)</span></span></span> Boolean:删除指定Cookie值</li><li style="background-color:transparent; border:0px; margin:0px 0px 0px 30px; outline:0px; padding:0px; vertical-align:baseline"><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline"><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline"><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline">phantom</span><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline">.</span><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline">clearCookies</span><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline">(</span><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline">)</span></span></span>:清空所有的cookie</li><li style="background-color:transparent; border:0px; margin:0px 0px 0px 30px; outline:0px; padding:0px; vertical-align:baseline"><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline"><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline"><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline">phantom</span><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline">.</span><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline">cookiesEnabled</span></span></span> Boolean:获取或设置是否支持cookie</li></ul>3.<span style="border:0px; font-size:14px; margin:0px; outline:0px; padding:0px; vertical-align:baseline; color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; line-height:30px"><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline"><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline">phantom</span><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline">.</span><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline">injectJs</span><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline">(</span><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline">fileName</span><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline">)</span></span></span><span style="color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; font-size:14px; line-height:30px"> Boolean:把外部的js文件注入到当前环境中,执行这个方法是,phantomjs首先会从当前目录检索此文件,找不到再从phantom.librarypath指定的路经查找。</span><p></p><p><span style="font-size:14px"><span style="color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; font-size:14px; line-height:30px"><span style="color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; font-size:14px; line-height:30px"><span style="color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; font-size:14px; line-height:30px">4.<span style="border:0px; font-size:14px; margin:0px; outline:0px; padding:0px; vertical-align:baseline; color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; line-height:30px">phantom</span><span style="border:0px; font-size:14px; margin:0px; outline:0px; padding:0px; vertical-align:baseline; color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; line-height:30px">.</span><span style="border:0px; font-size:14px; margin:0px; outline:0px; padding:0px; vertical-align:baseline; color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; line-height:30px">onError当前页面存在js错误,且没有被page.onError捕获,就会被此handle捕获,</span></span></span></span></span></p><p><span style="font-size:14px"><span style="color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; font-size:14px; line-height:30px"><span style="color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; font-size:14px; line-height:30px"><span style="color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; font-size:14px; line-height:30px"><span style="border:0px; font-size:14px; margin:0px; outline:0px; padding:0px; vertical-align:baseline; color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; line-height:30px">5.phantom.exit(参数)退出程序,默认参数为0</span></span></span></span></span></p><p><span style="font-size:14px"><span style="color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; font-size:14px; line-height:30px"><span style="color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; font-size:14px; line-height:30px"><span style="color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; font-size:14px; line-height:30px"><span style="border:0px; font-size:14px; margin:0px; outline:0px; padding:0px; vertical-align:baseline; color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; line-height:30px"></span></span></span></span></span></p><p><span style="font-family:microsoft yahei,Arial,sans-serif; color:#575757"><span style="font-size:14px; line-height:30px">window对象:</span></span></p><p><span style="font-family:'microsoft yahei',Arial,sans-serif"><span style="font-size:14px; line-height:30px"><span style="color:#575757">如果代码运行在window环境下,很方便进行dom方面操作。</span><span style="color:#ff6600">但如果使用web page模块打开页面,不要在此window对象下进行任何DOM相关操作,因为这个window对象不是page对象内的window</span></span></span></p><p><span style="font-family:microsoft yahei,Arial,sans-serif; color:#575757"><span style="font-size:14px; line-height:30px">web page模块:</span></span></p><p><span style="font-family:microsoft yahei,Arial,sans-serif; color:#575757"><span style="font-size:14px; line-height:30px">处理具体的页面,使用时需创建实例:var page=require('webpage').create();</span></span></p><p><span style="font-family:microsoft yahei,Arial,sans-serif; color:#575757"><span style="font-size:14px; line-height:30px">page.cookies Object[]:与上文phantom.cookies类似,表示本url下cookies的读取,类似的API还有addCookie()、deleteCookie()、clearCookie()</span></span></p><p><span style="font-family:microsoft yahei,Arial,sans-serif; color:#575757"><span style="font-size:14px; line-height:30px">2.页面相关内容的API</span></span></p><p><span style="font-family:microsoft yahei,Arial,sans-serif; color:#575757"><span style="font-size:14px; line-height:30px"> page.content <span style="color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; font-size:14px; line-height:30px">String:获取<span style="color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; font-size:14px; line-height:30px">当前页面的html。</span></span></span></span></p><p><span style="font-family:microsoft yahei,Arial,sans-serif; color:#575757"><span style="font-size:14px; line-height:30px"><span style="color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; font-size:14px; line-height:30px">page.plainText String:<span style="color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; font-size:14px; line-height:30px">这是一个只读属性,获取页面去除html标记的文本(考虑</span><span style="border:0px; font-size:14px; margin:0px; outline:0px; padding:0px; vertical-align:baseline; color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; line-height:30px"><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline"><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline">$</span><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline">.</span><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline">text</span><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline">(</span><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline">)</span></span></span><span style="color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; font-size:14px; line-height:30px">)。</span></span></span></span></p><p><span style="font-family:microsoft yahei,Arial,sans-serif; color:#575757"><span style="font-size:14px; line-height:30px"><span style="color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; font-size:14px; line-height:30px">page.url String:<span style="color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; font-size:14px; line-height:30px">只读,获取当前页面的url</span></span></span></span></p><p><span style="font-family:microsoft yahei,Arial,sans-serif; color:#575757"><span style="font-size:14px; line-height:30px"><span style="color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; font-size:14px; line-height:30px">page.setContent():<span style="color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; font-size:14px; line-height:30px">允许修改 </span><span style="border:0px; font-size:14px; margin:0px; outline:0px; padding:0px; vertical-align:baseline; color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; line-height:30px"><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline"><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline">page</span><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline">.</span><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline">content</span></span></span><span style="color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; font-size:14px; line-height:30px">和 </span><span style="border:0px; font-size:14px; margin:0px; outline:0px; padding:0px; vertical-align:baseline; color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; line-height:30px"><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline"><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline">page</span><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline">.</span><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline">url</span></span></span><span style="color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; font-size:14px; line-height:30px">内容,会触发reload。</span></span></span></span></p><p><span style="font-family:microsoft yahei,Arial,sans-serif; color:#575757"><span style="font-size:14px; line-height:30px">3.page.settings Object</span></span></p><p><span style="font-family:microsoft yahei,Arial,sans-serif; color:#575757"><span style="font-size:14px; line-height:30px">对于当前页面的一些配置项,在page.open之前调用,</span></span></p><p><span style="font-family:microsoft yahei,Arial,sans-serif; color:#575757"><span style="font-size:14px; line-height:30px">javascriptEnable默认true:是否执行页面内的javascript</span></span></p><p><span style="font-family:microsoft yahei,Arial,sans-serif; color:#575757"><span style="font-size:14px; line-height:30px">loadImages默认true:是否载入图片</span></span></p><p><span style="color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; font-size:14px; line-height:30px; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline">userAgent</span><span style="background-color:transparent; color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; font-size:14px; line-height:30px"> :传递给服务器的userAgent字符串</span></p><p><span style="color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; font-size:14px; line-height:30px; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline">userName</span><span style="background-color:transparent; color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; font-size:14px; line-height:30px"> :用于http访问授权的用户名</span></p><p><span style="color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; font-size:14px; line-height:30px; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline">password</span><span style="background-color:transparent; color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; font-size:14px; line-height:30px"> :用于http访问授权的密码</span></p><p><span style="color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; font-size:14px; line-height:30px; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline">XSSAuditingEnabled</span><span style="background-color:transparent; color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; font-size:14px; line-height:30px"> 默认 </span><span style="background-color:transparent; color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; font-size:14px; line-height:30px; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline">false</span><span style="background-color:transparent; color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; font-size:14px; line-height:30px">:是否监控跨域请求</span></p><p><span style="color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; font-size:14px; line-height:30px; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline">resourceTimeout</span><span style="background-color:transparent; color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; font-size:14px; line-height:30px"> 单位 </span><span style="background-color:transparent; color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; font-size:14px; line-height:30px; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline">ms</span><span style="background-color:transparent; color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; font-size:14px; line-height:30px">:定义资源请求的超时时间。如果设置了此项,则页面中如果有任何资源超过此时限未请求成功,则页面其他部分也会停止请求,并触发</span><span style="background-color:transparent; color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; font-size:14px; line-height:30px; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline"><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline"><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline">onResourceTimeout</span><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline">(</span><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline">)</span></span></span><span style="background-color:transparent; color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; font-size:14px; line-height:30px">事件处理。</span></p><p><span style="background-color:transparent; color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; font-size:14px; line-height:30px">4.page.custemHeaders Object</span></p><p><span style="font-family:microsoft yahei,Arial,sans-serif; color:#575757"><span style="font-size:14px; line-height:30px"><span style="color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; font-size:14px; line-height:30px">phantom允许在请求时在http请求头部添加额外信息,此设置项对这个page里面所有的请求都生效(包含页面和其他资源的请求)。添加的信息并没有限制,但如果设置 </span><span style="border:0px; font-size:14px; margin:0px; outline:0px; padding:0px; vertical-align:baseline; color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; line-height:30px"><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline"><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline">User</span><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline">-</span><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline">Agent</span></span></span><span style="color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; font-size:14px; line-height:30px">的值,那么这个值会覆盖掉 </span><span style="border:0px; font-size:14px; margin:0px; outline:0px; padding:0px; vertical-align:baseline; color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; line-height:30px"><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline"><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline">page</span><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline">.</span><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline">settings</span></span></span><span style="color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; font-size:14px; line-height:30px">里的设置值。</span></span></span></p><p><span style="font-family:microsoft yahei,Arial,sans-serif; color:#575757"><span style="font-size:14px; line-height:30px"><span style="color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; font-size:14px; line-height:30px">5.<span style="border:0px; font-size:14px; margin:0px; outline:0px; padding:0px; vertical-align:baseline; color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; line-height:30px"><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline"><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline">page</span><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline">.</span><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline">libraryPath</span></span></span><span style="color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; font-size:14px; line-height:30px"> String</span></span></span></span></p><p><span style="font-family:microsoft yahei,Arial,sans-serif; color:#575757"><span style="font-size:14px; line-height:30px"><span style="color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; font-size:14px; line-height:30px"><span style="color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; font-size:14px; line-height:30px"><span style="color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; font-size:14px; line-height:30px">page对象也支持设置js文件路径,同时可以通过相应的</span><span style="border:0px; font-size:14px; margin:0px; outline:0px; padding:0px; vertical-align:baseline; color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; line-height:30px"><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline"><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline">page</span><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline">.</span><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline">injectJs</span><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline">(</span><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline">)</span></span></span><span style="color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; font-size:14px; line-height:30px">方法注入javascript文件。除了 </span><span style="border:0px; font-size:14px; margin:0px; outline:0px; padding:0px; vertical-align:baseline; color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; line-height:30px"><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline"><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline">page</span><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline">.</span><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline">injectJs</span><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline">(</span><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline">)</span></span></span><span style="color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; font-size:14px; line-height:30px">方法外,还有</span><span style="border:0px; font-size:14px; margin:0px; outline:0px; padding:0px; vertical-align:baseline; color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; line-height:30px"><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline"><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline">page</span><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline">.</span><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline">includeJs</span><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline">(</span><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline">)</span></span></span><span style="color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; font-size:14px; line-height:30px">也可以加入javascript文件。它们的区别在于, </span><span style="border:0px; font-size:14px; margin:0px; outline:0px; padding:0px; vertical-align:baseline; color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; line-height:30px"><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline"><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline">page</span><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline">.</span><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline">injectJs</span><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline">(</span><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline">)</span></span></span><span style="color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; font-size:14px; line-height:30px">不强求此文件能访问得到,即使是一个不可访问的资源也可以。</span></span></span></span></span></p><p><span style="font-family:microsoft yahei,Arial,sans-serif; color:#575757"><span style="font-size:14px; line-height:30px"><span style="color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; font-size:14px; line-height:30px"><span style="color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; font-size:14px; line-height:30px"><span style="color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; font-size:14px; line-height:30px">6.</span></span></span></span></span><span style="line-height:30px; color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; font-size:14px; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline"><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline"><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline">page</span><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline">.</span><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline">navigationLocked</span></span></span><span style="background-color:transparent; line-height:30px; color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; font-size:14px"> Boolean 默认 </span><span style="background-color:transparent; line-height:30px; color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; font-size:14px; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline">fasle</span><span style="background-color:transparent; line-height:30px; color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; font-size:14px">设置是否允许离开当前页面,默认是允许。</span></p><p><span style="background-color:transparent; line-height:30px; color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; font-size:14px">7.page.open()</span></p><p><span style="font-family:microsoft yahei,Arial,sans-serif; color:#575757"><span style="font-size:14px; line-height:30px">此方法用于打开一个网页,有三种调用方式open(url,callback)、 open(<span style="color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; font-size:14px; line-height:30px">url,method,callback</span>) 、open(<span style="color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; font-size:14px; line-height:30px">url,method,data,callback</span>)其中callback会在页面载入之后调用,由page.onloadFinash调用,callback会接受一个参数status,值为success或fail,表示页面是否加在成功。</span></span></p><p><span style="font-family:microsoft yahei,Arial,sans-serif; color:#575757"><span style="font-size:14px; line-height:30px">8.page.close</span></span></p><p><span style="font-family:microsoft yahei,Arial,sans-serif; color:#575757"><span style="font-size:14px; line-height:30px">与page.open对应,调用该方法之后会释放page所占内存,在实际应用中并不会完全清楚所占内存,垃圾回收机制也不会回收,<span style="color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; font-size:14px; line-height:30px">但在实际使用中,常常会遇到将一个page实例反复open的情况。在一个页面用完后,记得一定要执行 </span><span style="border:0px; font-size:14px; margin:0px; outline:0px; padding:0px; vertical-align:baseline; color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; line-height:30px"><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline"><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline">page</span><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline">.</span><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline">close</span><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline">(</span><span style="background-color:transparent; border:0px; margin:0px; outline:0px; padding:0px; vertical-align:baseline">)</span></span></span><span style="color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; font-size:14px; line-height:30px">,这样在下一次open的时候,才不会重复分配堆栈空间。</span></span></span></p><p><span style="font-family:microsoft yahei,Arial,sans-serif; color:#575757"><span style="font-size:14px; line-height:30px"><span style="color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; font-size:14px; line-height:30px">9.<span style="border:0px; font-size:14px; margin:0px; outline:0px; padding:0px; vertical-align:baseline; color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; line-height:30px">page</span><span style="border:0px; font-size:14px; margin:0px; outline:0px; padding:0px; vertical-align:baseline; color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; line-height:30px">.</span><span style="border:0px; font-size:14px; margin:0px; outline:0px; padding:0px; vertical-align:baseline; color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; line-height:30px">evaluate</span><span style="border:0px; font-size:14px; margin:0px; outline:0px; padding:0px; vertical-align:baseline; color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; line-height:30px">(</span><span style="border:0px; font-size:14px; margin:0px; outline:0px; padding:0px; vertical-align:baseline; color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; line-height:30px">fn</span><span style="border:0px; font-size:14px; margin:0px; outline:0px; padding:0px; vertical-align:baseline; color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; line-height:30px">,</span><span style="border:0px; font-size:14px; margin:0px; outline:0px; padding:0px; vertical-align:baseline; color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; line-height:30px"> </span><span style="border:0px; font-size:14px; margin:0px; outline:0px; padding:0px; vertical-align:baseline; color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; line-height:30px">[</span><span style="border:0px; font-size:14px; margin:0px; outline:0px; padding:0px; vertical-align:baseline; color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; line-height:30px">param</span><span style="border:0px; font-size:14px; margin:0px; outline:0px; padding:0px; vertical-align:baseline; color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; line-height:30px">]</span><span style="border:0px; font-size:14px; margin:0px; outline:0px; padding:0px; vertical-align:baseline; color:rgb(87,87,87); font-family:'microsoft yahei',Arial,sans-serif; line-height:30px">)</span></span></span></span></p><p><span style="font-family:microsoft yahei,Arial,sans-serif; color:#575757"><span style="font-size:14px; line-height:30px">对于打开的页面,往往需要与其进行交互,在page打开的页面中执行fn函数,如下例子:</span></span></p><p><span style="font-family:'microsoft yahei',Arial,sans-serif"><span style="font-size:14px; line-height:30px"></span></span></p><pre name="code" class="java" style="color: rgb(87, 87, 87); font-size: 14px;">page.open('http://m.bing.com', function(status) {    var title = page.evaluate(function(s) {        return document.querySelector(s).innerText;    }, 'title');    console.log(title);    phantom.exit();});
在这个例子中, page.evaluate()接受两个参数,第一个是必需的,表示需要在page上下文运行的函数 fn;第二个是可选的,表示需要传给 fn的参数 param fn允许有一个返回值return,并且此返回值最终作为 page.evaluate()的返回值。这边对于刚刚命名的 paramreturn有一些额外的说明和注意事项。对于整个phantom进程而言, page.evaluate()是跑在一个沙盒中, fn无法访问一切phantom域中的变量;同样 page.evaluate()方法外部也不应该尝试访问page上下文中的内容。那么如果两个作用域需要交换一些数据,只能依靠 param return。不过限制很大, param return必须为能够转化为JSON字符串,换言之,只能是基本数据类型或者简单对象,像DOM 节点、$对象、function、闭包等就无能为力了。

10.page.render(filename)page.render()能够把当前页面渲染成图片并输出到指定文件中。输出的文件格式由传入的文件扩展名决定,目前支持 PNG、 JPEG、 GIF、 PDF

11page.sendEvent()为了交互的需要(测试的需要),phantom允许通过代码模拟一些交互事件(注意与DOM事件的区分)。 

鼠标事件  :API: sendEvent(mouseEventType[, mouseX, mouseY, button='left'])

mouseEventtype可能的取值为: 'mouseup'、 'mousedown'、 'mousemove''doubleclick'和 'click',这个参数为必须的。
后两个参数为鼠标事件的坐标位置。最后一个参数为鼠标按键,只对需要按键的事件有效,默认为 'left',可能值为 'right'、 'left'、 'middle'

键盘事件  :API: sendEvent(keyboardEventType, keyOrKeys, [null, null, modifier])
keyboardEventType可能的取值为 'keyup'、 'keydown'、 'keypress',第2个参数传入一个键值或一个字符串。键值可以通过 page.event.key来查询调用。第三和第四个参数无效,第五个参数表示同时按下的修饰键。取值情况如下: 0:未使用修饰符、
0x02000000: Shift键被按下、0x04000000: Ctrl键被按下、0x08000000: Alt键被按下

例子:

page.sendEvent('keypress', page.event.key.A, null, null, 0x02000000 | 0x08000000);
12.page.uploadFile(selector, file)页面中常常会有上传文件的操作,但phantom没有界面,因而也就没有办法选择文件上传,通过此方法可以模拟文件上传操作。示例如下:
page.uploadFile('input[name=image]','/path/to/some/photo.jpg');
  • page.onInitialized:在page创建后触发。
  • page.onUrlChanged:在url发生变化时触发。它接受新的url作为参数。首次加载页面,page.onUrlChanged是在 page.onInitialized之后触发。
  • page.onNavigationRequested:如果在 page.navigationLocked中允许页面跳转,此接口才会有意义(参见 page.navigationLocked)。它接受4个参数,先看示例:
page.onNavigationRequested=function(url,type,willNavigate,main){      console.log('Trying to navigate to: '+url);      console.log('Caused by: '+type);      console.log('Will actually navigate: '+willNavigate);      console.log('Sent from the page\'s main frame: '+main);}
  • url表示要跳转到的url
  • type表示产生跳转的原因,可能值有 'Undefined'、 'LinkClicked''FormSubmitted'、 'BackOrForward'、 'Reload'、 'FormResubmitted''Other'
  • willNavigate表示是否会跳转,由 page.navigationLocked控制
  • main表示发生跳转的是否是主frame,如果是主frame则为true,如果为其他frame则为false
  • page.onLoadStarted:在开始载入资源时触发。
  • page.onLoadFinished:页面所有资源载入完成后触发。其实与 page.open()的回调函数等价。它接受一个参数 status,表示加载是否成功。参见 page.open()
  • page.onClosing:当在phantom域调用 page.close()或page上下文调用window.close()时触发。
  • page.onError: 此接口捕获所有page上下文发生的javascript错误。参数是错误信息和调用堆栈,参见 phantom.onError。如果page不处理错误,那么这些错误会冒泡到phantom的onError处理器。
  • page.onCreate:当page创建子窗口时触发,例如在page上下文中使用window.open,但是子窗口再创建子窗口不会触发此事件。
  • page.onResourceRequested:当页面请求一个资源时触发的事件,它接受两个参数,第一个参数是 requestData对象,它有如下属性:
    • id : 资源请求编号
    • method : http请求方法,get/post等
    • url:请求的URL
    • time : 一个Date object,包含响应接收的时间
    • headers : http头部的信息列表

    第二个参数是 networkRequest实例,它包含3个方法:

    • abort():中断当前的请求。这样做会触发onResourceError
    • changeUrl(url):改变当前请求的目标url
    • setHeader(key, value):修改/添加http头部信息
  • page.onResourceReceived:当一个资源请求的响应接收到后触发此事件,它接受一个response对象,这个对象有如下属性:
    • id : 资源请求编号
    • url:请求的URL
    • time : 一个Date object,包含响应接收的时间
    • headers : http头部的信息列表
    • bodySize : 已接收到的数据大小(全部数据或已接收的部分数据)
    • contentType : 指定的内容类型
    • redirectURL : 如果是一个重定向响应,那么此处是重定向到的url
    • stage : “start”/ “end”
    • status : http状态码,如:200
    • statusText : http状态描述,如:OK
  • page.onResourceError:当资源加载失败时,触发此事件。它接收一个resourceError对象,这个对象有如下属性:
    • id:资源请求的编号
    • url:请求的URL
    • errorCode:错误代码
    • errorString:错误信息

可参考如下示例:

page.onResourceError=function(resourceError){    console.log('Unable to load resource (#'+resourceError.id+'URL:'+resourceError.url+')');    console.log('Error code: '+resourceError.errorCode+'. Description: '+resourceError.errorString);};
  • page.onResourceTimeout:在讲 page.settings时曾经提到过这个事件。如果设置了page.settings.resourceTimeout,并且资源在这个时间内没有载入完成,则会触发此事件,它接受一个 request对象,这个对象包含如下属性:
    • id : 资源请求编号
    • method : http请求方法,get/post等
    • url:请求的URL
    • time : 一个Date object,包含响应接收的时间
    • headers : http头部的信息列表
    • errorCode:错误代码
    • errorString:错误信息

Child Process模块

通过Child Process模块,我们能创建子进程,借助 stdin、 stdout、 stderr来实现进程间通信(很C++)。使用子进程能够做很多事情,如打印、发邮件、调用脚本或其他程序(不局限于javascript)。

要使用Child Process模块,我们需要在代码中添加 require("child_process")

以下内容缺乏文档支持,并未经过充分测试,可能存在一定的理解偏差。这部分功能是极有用的,希望在项目中使用的时候注意测试。

Child Process模块本身应该也并完全开发完全。 spawn()、 execFile()可用, exec()fork()尚未实现。

  1. spawn(command, [args], [options])
    最基本的创建进程的方法。前两个参数比较重要,例如现在想从phantom进程中运行一段nodejs脚本,脚本路径为 main.js,这个脚本接受一个参数,假定为 helloworld,那么如果想得到这段脚本的运行结果应该怎么做呢?参考下面的脚本:
    var spawn = require("child_process").spawn;child = spawn('node', ['main.js', 'helloworld']);child.stdout.on("data", function (data) {    console.log("spawnSTDOUT:", JSON.stringify(data))});child.stderr.on("data", function (data) {    console.log("spawnSTDERR:", JSON.stringify(data))});child.on("exit", function (code) {    console.log("spawnEXIT:", code)});setTimeout(function () {    phantom.exit(0)}, 2000);

    其实 spawn()方法没什么神秘的,它就是运行第一个参数表示的命令,第二个参数就是这个命令的参数列表。所以如果要开启一个新的phantom进程,第一个参数为 phantom就行。同样的道理,指定好程序的路径或者是脚本语言解释器的路径,通过这个方法可以做的事情很多。
    比较不方便的是,进程间的通信只能通过 stdin、 stdout、 stderr来完成,调用spawn()方法后,还需要对这些交互信息进行监听,上面的例子中演示了监听 stdoutstderr的方法。
  2. execFile(cmd, args, opts, cb)
    就像刚刚说的, spawn()方法稍微感觉有点麻烦,使用 execFile()能够稍稍简化上面的代码。 execFile()的前三个参数与 spawn()的三个参数完全一样,不同的是它多了一个 cb回调函数,看一个例子就知道这个回调函数有什么用了:
    var execFile = require("child_process").execFile;child = execFile('node', ['main.js', 'helloworld'], null,    function (err, stdout, stderr) {        console.log("execFileSTDOUT:", JSON.stringify(stdout))        console.log("execFileSTDERR:", JSON.stringify(stderr))    });setTimeout(function () {    phantom.exit(0)}, 2000);

    在 execFile()中,对 stdout、 stderr的监听做了封装,简化了我们的代码,不过功能上与 spawn()并无区别。

file system模块

虽然与node.js中文件系统模块名称和调用方法( require("fs"))一样,但不得不说,phantom的文件系统模块总体是比较简单的,API不多但够用,API也不同于node.js的异步回调风格,而是采用stream+同步的风格,浓浓的C++风味。在使用的时间请一定要注意与node.js的文件系统模块做区分。

  1. fs.open(path, mode/opts) File
    open()方法接受两个参数,第一个参数是要打开的文件路径,第二个参数后面还会见到,这里统一说明。如果是字符串,则代表文件打开的模式,可选的有 'r'、 'w'、 'a/+''b'(read时仅支持 'b');如果是一个对象,则表示配置项,一共有两个配置项,分别是mode和 charset, mode就是刚刚提到的打开模式, charset表示文件的编码类型。参阅下面的示例:
    var fs = require("fs");var file = fs.open("main.js", 'r');console.log(file.read());file.close();file = fs.open("main.js", 'a');file.write("123");file.close();setTimeout(function () {    phantom.exit(0)}, 2000);

    对打开的文件,我们可以进行读写操作(具体使用与打开模式有关)。如果对一个文件执行了open,请别忘了在文件使用完成后,再对其执行close。
  2. fs.read(path, mode/opts) String
    fs.read()方法对文件读取做了封装,不必关心文件的打开关闭,返回值为文件内容。
  3. fs.write(path, content, mode/opts)
    fs.write()方法对文件写入做了封装,不必关心文件的打开关闭。
  4. 其他API:
    • fs.size(path) Number:获取文件大小
    • fs.copy(source, destination):复制文件
    • fs.copyTree(source, destination):复制目录树
    • fs.move(source, destination):移动文件
    • fs.moveTree(source, destination):移动目录树
    • fs.remove(file):删除文件
    • fs.removeTree(path):删除目录
    • fs.join(partialPath[]) String:组合路径
    • fs.split(path) String[]:切割路径
    • fs.exist(path) Boolean:文件或目录是否存在
    • fs.isFile(path) Boolean:指定路径是否是文件
    • fs.isDirectory(path) Boolean:指定路径是否是目录
    • fs.list(path) String[]:获取指定目录下的文件/目录名称列表

System模块

在文档一开始就已经提到过system模块,一开始的例子中,我们使用了system模块提供的 args属性。现在重新来认识一下system模块。system模块主要管理着一些与运行环境有关的属性。

  1. system.args String[]
    获取运行phantomjs时传入的所有参数,这个不再赘述。
  2. system.env Object
    获取当前的环境信息。包含操作系统信息、环境变量信息等等。通过下面的代码来查看一下吧:
    var system = require('system');var env = system.env;Object.keys(env).forEach(function (key) {    console.log(key + '=' + env[key]);});setTimeout(function () {    phantom.exit(0)}, 2000);
  3. system.os Object
    获取操作系统信息,返回一个简单对象,这个对象有3个属性: architecture:架构,如“32bit”; name:操作系统名称; version:操作系统版本。
  4. system.pid Number
    获取当前进程的pid。
  5. system.platform String
    永远返回 'phantomjs'

Web Server模块

phantomjs支持一个简单的web server模块, require('webserver')即可引入。web server模块基于mongoose。不过最好不要在生产环境使用这样的服务器模块,因为现阶段此模块仅允许10个并发请求。

看一个简单的例子吧:

var webserver = require('webserver');var server = webserver.create();var service = server.listen(8080, function(request, response) {    response.statusCode = 200;    response.write('&lt;html>&lt;body>Hello!&lt;/body>&lt;/html>')    response.close();});

首先需要创建服务器实例,然后调用 listen()方法监听, listen()方法的第一个参数可以为一个端口号,也可以中 ip:port这样的ip+port组合方式。第二个参数是处理请求的回调方法。下面描述一下 request和 response两个对象。

  • request:
    • method:http请求的方法,get、post等
    • url: 包含http请求URL和get请求的query string(如果有的话)
    • httpVersion:当前采用的http协议的版本
    • headers:所有http请求头部信息,以键值对的形式提供
    • post:请求主体,仅对post和put方法的请求有效
    • postRaw:如果Content-type为 'application/x-www-form-urlencoded'(表单上传的默认值)时,post的原始信息会暂存在此属性中。
  • response:
    • headers:以键值对的形式保存所有的HTTP请求头部的信息,在第一次调用 write()方法前一定要设置
    • setHeader(name, value):设置或添加特定的头部信息
    • header(name):获取特定的头部信息
    • statusCode:设置HTTP状态码
    • setEncoding(encoding): 标明传给 write()的数据需要转换成什么格式,默认为UTF-8。如果数据为二进制字符串,则设置为“binary”
    • write(data):向response中发送数据块,可以多次调用
    • writeHead(statusCode, headers):向response中发送响应头部。 statusCode是一个3位数字,表示HTTP状态码(如404)。后一个参数代码响应头部
    • close():关闭HTTP连接
      • 为了避免客户端检测到连接中断,记得最后再用 write()方法发送一个空字符串(如: response.write(""))。
    • closeGracefully():功能与 close()一样,不过更安全可靠,它能保证响应头部先发送,并自动在响应最后加上 response.write("")




0 0