文档章节

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

奋斗到天明
 奋斗到天明
发布于 2015/08/27 16:22
字数 833
阅读 211
收藏 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

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

奋斗到天明
粉丝 19
博文 112
码字总数 82707
作品 0
昌平
程序员
私信 提问
加载中
请先登录后再评论。
Netty那点事(三)Channel与Pipeline

Channel是理解和使用Netty的核心。Channel的涉及内容较多,这里我使用由浅入深的介绍方法。在这篇文章中,我们主要介绍Channel部分中Pipeline实现机制。为了避免枯燥,借用一下《盗梦空间》的...

黄亿华
2013/11/24
2W
22
记一次失败的Perl + Nginx + FastCGI 配置过程

这两天心血来潮,不知道为什么和 Perl + Nginx + FastCGI 配置 耗上了。但是失败了,记录如下: 1)安装Nginx 1.4.3 ,我的是WINDOWS 7 系统,修改配置文件如下: location ~ .(pl|cgi|perl)?...

通吃岛-低手哥
2013/10/27
1.8K
7
访问安全控制解决方案

本文是《轻量级 Java Web 框架架构设计》的系列博文。 今天想和大家简单的分享一下,在 Smart 中是如何做到访问安全控制的。也就是说,当没有登录或 Session 过期时所做的操作,会自动退回到...

黄勇
2013/11/03
3.6K
8
用vertx实现高吞吐量的站点计数器

工具:vertx,redis,mongodb,log4j 源代码地址:https://github.com/jianglibo/visitrank 先看架构图: 如果你不熟悉vertx,请先google一下。我这里将vertx当作一个容器,上面所有的圆圈要...

jianglibo
2014/04/03
4.3K
3
Flappy Bird(安卓版)逆向分析(一)

更改每过一关的增长分数 反编译的步骤就不介绍了,我们直接来看反编译得到的文件夹 方法1:在smali目录下,我们看到org/andengine/,可以知晓游戏是由andengine引擎开发的。打开/res/raw/at...

enimey
2014/03/04
6.2K
18

没有更多内容

加载失败,请刷新页面

加载更多

Subversion存储库中“分支”,“标记”和“主干”的含义是什么?

问题: I've seen these words a lot around Subversion (and I guess general repository) discussions. 我已经在Subversion(我猜通用存储库)讨论中看到了很多这样的话。 I have been us......

富含淀粉
55分钟前
5
0
《Java8实战》笔记(03):Lambda表达式

本文源码 Lambda 管中窥豹 可以把Lambda表达式理解为简洁地表示可传递的匿名函数的一种方式:它没有名称,但它有参数列表、函数主体、返回类型,可能还有一个可以抛出的异常列表。 Lambda表达...

巨輪
57分钟前
7
0
从其他文件夹导入文件 - Importing files from different folder

问题: I have the following folder structure. 我有以下文件夹结构。 application/app/folder/file.py and I want to import some functions from file.py in another Python file which r......

javail
今天
22
0
大数据研发学习之路--Hadoop集群搭建

阅读编译文档 准备一个hadoop源码包,我选择的hadoop版本是:hadoop-2.7.7-src.tar.gz,在hadoop-2.7.7的源码 包的根目录下有一个文档叫做BUILDING.txt,这其中说明了编译hadoop所需要的一些...

DSJ-shitou
今天
8
0
OSChina 周五乱弹 —— 特么是别的公司派来的特洛伊木马吧?

Osc乱弹歌单(2020)请戳(这里) 【今日歌曲】 小小编辑推荐:《我会守在这里》- 毛不易 《我会守在这里》- 毛不易 手机党少年们想听歌,请使劲儿戳(这里) @FalconChen :股市连跪了五天,...

小小编辑
今天
77
2

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部