Groovy和HTTP服务器

本文最初发表在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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值