文档章节

Clojure: Web开发初体验 - 基于 Ring

陈亦
 陈亦
发布于 2016/03/17 20:49
字数 716
阅读 1493
收藏 2

Ring 的目标是把 HTTP 的细节抽象为简单且模块化的 API,它与 Python 的 WSGI 和 Ruby 的 Rake 非常类似。可以用来构建类型广泛的应用。

新建基于 default 模板的项目:

$ lein new hello

修改 hello/project.clj 文件,添加依赖和入口配置,如下:

(defproject hello "0.1.0-SNAPSHOT"
  :description "FIXME: write description"
  :url "http://example.com/FIXME"
  :license {:name "Eclipse Public License"
            :url "http://www.eclipse.org/legal/epl-v10.html"}
  :dependencies [[org.clojure/clojure "1.8.0"]
                 [ring/ring-devel "1.4.0"]
                 [ring/ring-core "1.4.0"]
                 [http-kit "2.1.19"]]
  :main hello.core/-main)

执行 lein deps 下载依赖。

开发服务器采用 http-kit ,这是一个异步高性能 web 服务器,志在取缔 jetty。我们需要向 http-kit 注册一个 handler。当我们请求 http-kit 服务器时,http-kit 会调用事先注册好的 handler 。handler 必须返回一个 response map。格式如下:

{:status 200
   :header {"Content-Type" "text/html"}
   :body "hello world"}

其中 :status 为状态码,:header 为响应头部,:body 为响应数据。

http-kit 提供了极为简单易用的函数调用来启动一个服务:

(run-server handler & [request-map])

一个简单的例子:

(ns hello.core
  (:use [org.httpkit.server :only [run-server]]))

(defn handler [request]
  {:status 200
   :header {"Content-Type" "text/html"}
   :body "hello world\n"})

(defn -main [& args]
  (run-server handler {:port 5000})
  (println "Start Http-Kit Server On Port 5000..."))

在命令行执行:

$ lein run
Start Http-Kit Server On Port 5000...

访问:

$ curl http://localhost:5000
hello world

http-kit 的 run-server 方法接受2个参数。第一个参数是注册的 handler,并且这个 handler 必须是一元参数函数(参数为请求对象),第二个参数为选项,用于对 http-kit 进行设置。解释如下:

Options:
    :ip                 ; 指定监听的IP地址(默认为:0.0.0.0)
    :port               ; 指定监听的端口(默认为:8090)
    :thread             ; HTTP工作线程数量(默认为:4)
    :queue-size         ; 最大队列大小(默认为:20KB)
    :max-body           ; 最大HTTP包体大小(默认为:8MB)
    :max-ws             ; 最大websocket消息大小(默认为:4MB)
    :max-line           ; HTTP url的最大长度(默认为:4KB)
    :proxy-protocol     ; 禁用或启用代理协议(默认为::disable)
    :worker-name-prefix ; 工作线程名称前缀(默认为:worker-)

Ring 还自带了 reponse 来进行响应,避免我们手工构造 response map。修改 handler 代码,如下:

(ns hello.core
  (:use [org.httpkit.server :only [run-server]]
        [ring.util.response :only [response]]))

(defn handler [request]
  (response "hello world\n"))

(defn -main [& args]
  (run-server handler {:port 5000})
  (println "Start Http-Kit Server On Port 5000..."))

Ring 是基础构件,http-kit 自始至终只是调用 handler。我们来尝试几次请求:

$ curl http://localhost:5000
hello world
$ curl http://localhost:5000/a/b/c 
hello world

聪明的你一定想得到,如果在 handler 里进行路由分发会怎么样呢?compojure 就是来干这个事的。本文只是稍稍带大家领略 Clojure 的 web 开发之美,下次再给大家带来 Ring 中间件和 compojure 的路由处理,希望大家能喜欢!



© 著作权归作者所有

陈亦
粉丝 241
博文 23
码字总数 53194
作品 0
浦东
高级程序员
私信 提问
Clojure Web 开发 -- Ring 使用指南

在 Clojure 众多的 Web 框架中,Ring 以其简单统一的 HTTP 抽象模型脱颖而出。Ring 充分体现了函数式编程的思想——通过一系列函数的组合形成了一个易于理解、扩展的 HTTP 处理链。 本篇文章...

jiacai2050
2017/04/05
0
0
Clojure 的 Web 框架 - Ring

Ring 是一个 Clojure 的 Web 框架,它与 Python 的 WSGI 和 Ruby 的 Rake 非常类似。通过把 HTTP 的细节抽象为简单且模块化的 API,Ring 允许 Web 应用程序由模块化组件构成,这些组件可以在...

匿名
05/21
1K
14
Clojure: Ring 中间件原理剖析

Ring 提供了 web 开发所需的基础构件,比如处理请求参数,cookie, session 等等。通过向 http-kit 或 jetty 注册 handler 的方式来提供服务。handler 函数接收一个 request 参数,此参数由调...

陈亦
2016/03/18
673
0
Immutant 2.1.6 发布,Clojure 应用服务器

Immutant 2.1.6 发布了。Immutant 是一个 Clojure 的应用服务器,这是一个基于 JBoss AS 7 的集成平台,用于 Ring 处理、异步消息、缓存、任务调度、XA 事务、集群和守护进程等等。本次更新如...

局长
2017/01/16
773
1
xfeep/nginx-clojure

Nginx-Clojure Nginx-Clojure is a Nginx module for embedding Clojure or Java or Groovy programs, typically those Ring based handlers. Core Features The latest release is v0.4.5, ......

xfeep
2015/02/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

作为一个(IT)程序员!聊天没有话题?试试这十二种技巧

首先呢?我是一名程序员,经常性和同事没话题。 因为每天都会有自己的任务要做,程序员对于其他行业来说;是相对来说比较忙的。你会经常看到程序员在发呆、调试密密麻麻代码、红色报错发呆;...

小英子wep
今天
15
0
【SpringBoot】产生背景及简介

一、SpringBoot介绍 Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程,该框架使用了特定的方式来进行配置,从而使开发人员不再需要...

zw965
今天
5
0
简述并发编程分为三个核心问题:分工、同步、互斥。

总的来说,并发编程可以总结为三个核心问题:分工、同步、互斥。 所谓分工指的是如何高效地拆解任务并分配给线程,而同步指的是线程之间如何协作,互斥则是保证同一时刻只允许一个线程访问共...

dust8080
今天
6
0
OSChina 周四乱弹 —— 当你简历注水但还是找到了工作

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @花间小酌 :#今日歌曲推荐# 分享成龙的单曲《男儿当自强》。 《男儿当自强》- 成龙 手机党少年们想听歌,请使劲儿戳(这里) @hxg2016 :刚在...

小小编辑
今天
3.4K
22
靠写代码赚钱的一些门路

作者 @mezod 译者 @josephchang10 如今,通过自己的代码去赚钱变得越来越简单,不过对很多人来说依然还是很难,因为他们不知道有哪些门路。 今天给大家分享一个精彩的 GitHub 库,这个库整理...

高级农民工
昨天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部