本文最初发表在GroovyMag的 2013年1月号上。
不可否认,万维网已经绝对成为信息存储和传递的组成部分。 每天有超过6亿个站点提供超过800亿个单独页面,并且每天还会添加更多页面和Web服务( http://news.netcraft.com/archives/2012/09/10/september-2012-web- server-survey.html )。 每个站点的背后都是–您猜对了! – Web服务器。 如今,我们有大量用于提供内容的JVM Web服务器替代品,还有一些严肃的Groovy和polyglot竞争者。 在本文中,我将详细介绍一些替代方案,重点放在可嵌入的选项上,并描述Groovy可以使事情变得比传统的仅Java实现和配置容易得多。 好
配置一些不同的服务器来承载单个服务,该服务可以反转查询参数并返回结果。 所有这些解决方案都可以嵌入Groovy程序中,几乎不需要外部配置。 注意:所描述的某些解决方案适用于生产环境,而其他解决方案则更适用于较小的任务,例如专门为内部网络提供文档或提供简单的测试环境。
测试项目
为了提供一个用于站立多个Web服务器并演示各种HTTP请求的环境,我们将使用Gradle构建和一些简单的Spock测试。 完整的源代码可从https://github.com/kellyrob99/groovy-http获得 ,我希望您可以克隆一个副本以进一步了解。 该项目与以前使用的项目相同(GroovyMag,2012年12月),用于详细说明Groovy与http客户端一起使用的情况,但也扩展了其以查看服务器端功能。 它包括Gradle包装器,因此您应该能够通过简单地调用./gradlew build来签出它并运行所有测试。
Java 1.6 HttpServer
从Java 1.6开始,包含Server的HttpServer是在Java中提供无外部库依赖性的内容的最简单选择。 站起来的服务器非常简单,不需要任何外部配置-或其他很多东西。 您只需创建服务器,声明一些上下文(与路径匹配),然后为每个上下文分配一个处理程序即可。 清单1显示了Groovy中用于配置服务器以承载“反向”服务的整个代码。
//configuring a Java 6 HttpServer
InetSocketAddress addr = new InetSocketAddress(HTTP_SERVER_PORT)
httpServer = com.sun.net.httpserver.HttpServer.create(addr, 0)
httpServer.with {
createContext('/', new ReverseHandler())
createContext('/groovy/', new GroovyReverseHandler())
setExecutor(Executors.newCachedThreadPool())
start()
}
清单1:在Groovy中配置HttpServer
因此,我们将绑定到传入请求的端口,为根上下文路径上的所有请求分配处理程序,为服务器配置线程池并启动它。 我们唯一需要提供的部分是处理程序,清单2显示了实现HttpHandler的Java版本。它所做的只是反向返回单个预期的'string'参数。 如果缺少参数,它还会执行一些简单的错误处理,并在这种情况下返回HTTP 400错误的请求代码。
class ReverseHandler implements HttpHandler {
@Override
public void handle(HttpExchange httpExchange) throws IOException
{
String requestMethod = httpExchange.getRequestMethod();
if (requestMethod.equalsIgnoreCase('GET')) {
Headers responseHeaders = httpExchange.getResponseHeaders();
responseHeaders.set('Content-Type', 'text/plain');
OutputStream responseBody = httpExchange.getResponseBody();
final String query = httpExchange.getRequestURI().getRawQuery();
if (query == null || !query.contains('string')) {
httpExchange.sendResponseHeaders(400, 0);
return;
}
final String[] param = query.split('=');
assert param.length == 2 && param[0].equals('string');
httpExchange.sendRespon