文档章节

Play 1.x框架学习之三:控制层发起HTTP请求 (Send Http Request In Controller)

奋斗到天明
 奋斗到天明
发布于 2015/08/27 16:22
字数 833
阅读 146
收藏 0
点赞 0
评论 0

有时候需要在控制层,也就是Controller或者Action中发起HTTP去第三方站点(也有去本站,分布式的情况下。),这请求可能是同步请求,也可能是异步请求。Play框架都提供了支持。 所涉及的代码: Controller:app/controllers/WebServer.java

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

可以看出同步的三个之间,时间相连,而异步的一个之间,时间没有相连。 这里暂时缺少对异步的超时限制。

© 著作权归作者所有

共有 人打赏支持
奋斗到天明
粉丝 18
博文 112
码字总数 82707
作品 0
昌平
程序员
中英文对照 介绍Play Framework 框架的控制器(Controller)

下面内容来自 Play 的官方文档中关于控制器一节的内容。 原文:http://www.playframework.org/documentation/1.0.3/controllers 翻译:红薯 (http://my.oschina.net/javayou) 转载请注明出处...

红薯 ⋅ 2010/07/07 ⋅ 13

从Spring + Ejb + Struts2 迁移到Play 1.x 框架 之一

原来项目比较古老,前台是用delphi,后台有用Ejb做……这货已经很少有人见过了……,现在公司主要项目都转到play上,所以这个项目也重构。 第一阶段是将SSE 迁移到play,尽量不改动代码,只要...

刀狂剑痴 ⋅ 2015/08/27 ⋅ 0

一个http请求在play框架中的前世今生

最近研究了一下Play框架底层对于http请求的处理流程,总结如下。(注:Play版本的是1.2.4,其它版本的实现可能会有所不同) 如上图,一个http请求在play框架中,要被三个不同的模块依次处理,...

2k10 ⋅ 2015/03/20 ⋅ 0

[转]应用struts1.x框架的session管理

如果应用了Struts 1.x框架,那么在任何一个Action被访问之前,都会经过ActionServlet来控制转向,ActionServlet类中在接收到我们客户端的请求(*.do)后(之前会做一系列初始化工作),并不是直接...

于子洋 ⋅ 2010/03/08 ⋅ 0

Play框架快速进行Java Web

您所在的位置:开发 > Java > Java框架 > 使用Play框架快速进行Java Web应用开发 使用Play框架快速进行Java Web应用开发 2010-11-17 12:59 成富 developerworks 我要评论(1) 字号:T | T Pla...

lhanoo ⋅ 2011/12/05 ⋅ 0

Play源码深入之三:一次访问的前半生-请求

接着上篇,play初始化完成之后,第一个请求来到了PlayHandler中,我们看PlayHandler如何处理。 Netty调用play.server.PlayHandler:messageReceived()方法,play将netty的httprequest转化成自...

刀狂剑痴 ⋅ 2015/08/27 ⋅ 0

英文对照 介绍Play Framework 框架 Ajax

Play框架中的Ajax h1. Ajax in the Play framework Play框架允许你简单的使用Ajax请求,默认使用JQuery, 这一节描述了如何有效地在框架里使用jQuery。 The Play framework allows you to e...

lyuehh ⋅ 2010/08/08 ⋅ 1

Play之Scala-Web项目运行流程-简单分析(2)

为了方便开发,我们将此工程转化为Eclipse项目,然后通过sftp下载到本地并导入到Eclipse里分析! 如果您的项目还在运行,就关了(通过Ctr+C吧)它,然后进入play命令行下: [root@centos6-vb...

hanzhankang ⋅ 2014/03/07 ⋅ 0

springMVC --(讲解1)介绍

springMVC处理请求流程 1.客户端发起一个http请求 2.该请求被springMVC的DispacherServlet(控制器)进行拦截匹配,匹配到了委托给HandleRequest(处理器) 3.处理器会调用HandlerMapping与Handl...

求是科技 ⋅ 2016/10/06 ⋅ 0

中英文对照 介绍Play Framework 框架 路由(Route)

路由 h1. HTTP routing 路由组件负责将HTTP请求交给对应的action处理(一个控制器的静态公共方法) The router is the component in charge of translating incoming HTTP Requests into acti...

lyuehh ⋅ 2010/07/11 ⋅ 1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

istio 文档

https://istio.io/docs/concepts/ https://istio.io/docs/concepts/traffic-management/handling-failures/ https://istio.io/docs/concepts/traffic-management/rules-configuration/......

xiaomin0322 ⋅ 18分钟前 ⋅ 0

编程语言的作用及与操作系统和硬件的关系

一、编程语言的作用及与操作系统和硬件的关系 作用:编程语言是计算机语言,是一种程序员与计算机之间沟通的介质,通过编程语言可以使得计算机能够根据人的指令一步一步去工作,完成某种特定...

slagga ⋅ 28分钟前 ⋅ 0

runtime实现按钮点击事件

也不能说是实现吧,,,就是有点类似于RAC里边的写法,不用给btn添加另外的点击事件,就那个add...select...这样子很不友好,来看下代码: [self.btn handleControlEvent:UIControlEventTou...

RainOrz ⋅ 29分钟前 ⋅ 0

Windows系统运维转linux系统运维的经历

开篇之前,首先介绍一下我的背景把:我是一个三线城市的甲方运维。最近,在《Linux就该这么学》书籍的影响下和朋友小A(Linux运维已经三年了,工资也比我的高很多)的影响下,决定转行。最近...

linux-tao ⋅ 30分钟前 ⋅ 0

zip压缩工具,tar打包工具

zip压缩工具 zip打包工具跟前面说到的gzip,bz2,xz 工具最大的不一样是zip可以压缩目录。如果没有安装,需要使用yum install -y zip 来安装。安装完之后就可以直接使用了,跟之前提到的压缩...

李超小牛子 ⋅ 37分钟前 ⋅ 0

使用npm发布自己的npm组件包

一、注册npm账号 官网:https://www.npmjs.com/signup 注册之后需要进行邮箱验证,否则后面进行组件包发布时候会提示403错误,让进行邮箱核准。 二、本地新建一个文件夹,cd进入后使用npm i...

灰白发 ⋅ 39分钟前 ⋅ 0

010. 深入JVM学习—垃圾收集策略概览

1. 新生代可用GC策略 1. 串行GC(Serial Copying) 算法:复制(Copying)清理算法; 操作步骤: 扫描年轻代中所有存活的对象; 使用Minor GC进行垃圾回收,同时将存活对象保存到“S0”或“S...

影狼 ⋅ 40分钟前 ⋅ 0

JVM性能调优实践——JVM篇

在遇到实际性能问题时,除了关注系统性能指标。还要结合应用程序的系统的日志、堆栈信息、GClog、threaddump等数据进行问题分析和定位。关于性能指标分析可以参考前一篇JVM性能调优实践——性...

Java小铺 ⋅ 41分钟前 ⋅ 0

误关了gitlab sign-in 功能的恢复记录

本想关sign-up的,误点了sign-in 退出后登录界面提示: No authentication methods configured 一脸懵逼.. 百度后众多方案说修改application_settings 的 signin_enabled字段; 实际上新版本字段...

铂金蛋蛋 ⋅ 41分钟前 ⋅ 0

登录后,后续请求接口没有带登录cookie可能原因

1.XMLHttpRequest.withCredentials没设置好,参考https://developer.mozilla.org/zh-CN/docs/Web/API/XMLHttpRequest/withCredentials...

LM_Mike ⋅ 42分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部