Play Framework 控制层发起HTTP请求 (Send Http Request In Controller)
2016-05-25 09:14
901 查看
有时候需要在控制层,也就是Controller或者Action中发起HTTP去第三方站点(也有去本站,分布式的情况下。),这请求可能是同步请求,也可能是异步请求。Play框架都提供了支持。 所涉及的代码: Controller:app/controllers/WebServer.java
Routes: conf/routes
测试类只有测试本站链接与外站链接,还有同步的超时测试,因为比对同步与异步的多个请求,用浏览器测试比较好。Functiontest:test/function/WebServerTest.java
第一个是百度的首页,但是只截取了前100个字符。第二个是本站的链接,虽然是本站,但是如果走HTTP请求,url地址必须全,包括协议。 然后测试同步测试,在浏览器开三个标签页,分别输入:
分别回车确定。 异步的测试,再打开三个标签页,分别输入:
分别回车确定。 结果如下: 同步:
异步:
可以看出同步的三个之间,时间相连,而异步的一个之间,时间没有相连。 这里暂时缺少对异步的超时限制。
package controllers; import java.util.Date; import play.libs.WS; import play.libs.F.Promise; import play.libs.WS.HttpResponse; import play.libs.WS.WSRequest; import play.mvc.Controller; public class WebServer extends Controller{ /** * 同步请求 * @param url 请求的第三方链接 */ public static void sync(String url){ WSRequest wsRequest = WS.url(url); HttpResponse response = wsRequest.get(); renderText(response.getString()); } /** * 带有超时时间的同步请求 * @param url 请求的第三方链接 * @param time 超时的时间 */ public static void syncWithTimeOut(String url, String time){ WSRequest wsRequest = WS.url(url); wsRequest.timeout(time); String words = ""; try{ HttpResponse response = wsRequest.get(); words = response.getString(); }catch(Exception e){ renderText("time out"); } renderText(words); } /** * 异步请求 * @param url 请求的第三方链接 * @throws InterruptedException */ public static void async(String url) throws InterruptedException{ WSRequest wsRequest = WS.url(url); Promise promise = wsRequest.getAsync(); HttpResponse response = await(promise); renderText(response.getString()); } /** * 检测本站链接 */ public static void hello() { renderText("hello world"); } /** * 模拟费时任务链接 * @param time 任务耗费的时长 * @throws InterruptedException */ public static void timeOutWait(long time) throws InterruptedException{ Date date1 = new Date(); String beginDateString = date1.getHours() + ":" + date1.getMinutes() + ":" + date1.getSeconds(); Thread.sleep(time); Date date2 = new Date(); String endDateString = date2.getHours() + ":" + date2.getMinutes() + ":" + date2.getSeconds(); String words = "out yeah! the param time is "+time+". begin: " + beginDateString + " ,end:" + endDateString; renderText(words); } }
Routes: conf/routes
GET /async WebServer.async GET /sync WebServer.sync GET /sync/{time} WebServer.syncWithTimeOut GET /helloworld WebServer.hello GET /timeout/{time} WebServer.timeOutWait
测试类只有测试本站链接与外站链接,还有同步的超时测试,因为比对同步与异步的多个请求,用浏览器测试比较好。Functiontest:test/function/WebServerTest.java
package function; import org.junit.Test; import play.mvc.Http.Response; import play.test.FunctionalTest; public class WebServerTest extends BasisTest { @Test public void testWsSyncOutSite() { Response response = GET("/sync?url=http://www.baidu.com"); assertIsOk(response); String out = response.out.toString(); assertNotNull(out); //因为html转义问题,百度首页开始的对比这里省略,大家可以打印出来。 //assertTrue(out.startsWith("")); } @Test public void testWsSyncInSite() { Response response = GET("/sync?url=http://localhost:9000/helloworld"); assertIsOk(response); String out = response.out.toString(); assertEquals("hello world", out); } @Test public void testWsSyncTimeIn() { Response response = GET("/sync/1s?url=http://localhost:9000/timeout/2000"); assertIsOk(response); String out = response.out.toString(); assertEquals("time out", out); } @Test public void testWsSyncTimeOut() { Response response = GET("/sync/1s?url=http://localhost:9000/timeout/500"); assertIsOk(response); String out = response.out.toString(); assertTrue(out.startsWith("out yeah! the param time is 500.")); } }
第一个是百度的首页,但是只截取了前100个字符。第二个是本站的链接,虽然是本站,但是如果走HTTP请求,url地址必须全,包括协议。 然后测试同步测试,在浏览器开三个标签页,分别输入:
http://localhost:9000/sync?url=http://localhost:9000/timeout/3000
http://localhost:9000/sync?url=http://localhost:9000/timeout/4000
http://localhost:9000/sync?url=http://localhost:9000/timeout/5000
分别回车确定。 异步的测试,再打开三个标签页,分别输入:
http://localhost:9000/async?url=http://localhost:9000/timeout/3000
http://localhost:9000/async?url=http://localhost:9000/timeout/4000
http://localhost:9000/async?url=http://localhost:9000/timeout/5000
分别回车确定。 结果如下: 同步:
out yeah! the param time is 3000. begin: 10:41:45 ,end:10:41:48 out yeah! the param time is 4000. begin: 10:41:48 ,end:10:41:52 out yeah! the param time is 5000. begin: 10:41:52 ,end:10:41:57
异步:
out yeah! the param time is 3000. begin: 10:42:57 ,end:10:43:0 out yeah! the param time is 4000. begin: 10:42:58 ,end:10:43:2 out yeah! the param time is 5000. begin: 10:42:59 ,end:10:43:4
可以看出同步的三个之间,时间相连,而异步的一个之间,时间没有相连。 这里暂时缺少对异步的超时限制。
相关文章推荐
- Http Header里的Content-Type
- 关于HTTP
- 一次线上http接口调用不通相关的解决过程
- wireshark抓包图解 TCP三次握手/四次挥手详解
- http://honda418.iteye.com/blog/337052/
- ios htttp网络请求cookie的读取与写入(NSHTTPCookieStorage)
- ios htttp网络请求cookie的读取与写入(NSHTTPCookieStorage)
- IIS负载均衡-Application Request Route详解第三篇:使用ARR进行Http请求的负载均衡
- HTTP in iOS你看我就够
- 三种方法实现移动端HTTPS加速和省电
- 有关网络编程的一些面试
- cs231n 卷积神经网络与计算机视觉 2 SVM softmax
- 148_okhttp和Gson
- 《图解HTTP》学习笔记(六)-HTTP首部
- 基于事件的开源网络库—libevent:应用介绍
- TCP/IP协议、HTTP协议、SOCKET通讯详解
- Apache的httpd.conf的配置详解
- 转自:http://blog.devtang.com/blog/2012/04/22/use-fmd
- 直接重写service方法 HTTP 304 的理解
- Sublime Text Package Control错误另解