Barista 0.0.3

Barista 0.0.3

测试已测试
语言语言 Obj-CObjective C
许可证 MIT
发布最后发布2014年12月

未命名 维护。



 
依赖关系
CocoaAsyncSocket~> 7.0
JLRoutes~> 1.4
 

Barista 0.0.3

  • 作者:
  • Steve Streza

Barista是一个用Objective-C编写的模块化网络服务器。它的目的是允许将网络服务器嵌入到另一个应用程序或开发者工具中。Barista从node.js和ExpressJS网络服务器中汲取灵感,将其系统分解成更小的部分,这些部分可以连接在一起。

状态

Barista现在正处于早期开发阶段。它可能还不应该用于与服务最终用户交云的应用程序。但很可能足够用于内部工具或构建开发工具。

API是不稳定的,可能会因为任何原因而破坏。

使用/中间件

在最基本的层面上,Barista服务器只是一个运行在任何端口上的HTTP服务器。默认情况下它什么也不做。为了真正处理请求,您需要向服务器添加组件。Barista包括几个你可能(或可能不)想要添加到你的堆栈的组件。这些包括

  • URL路由器
  • cookies和会话
  • 对压缩响应的支持
  • 解析请求和响应体(目前仅支持JSON)
  • 从目录中提供静态文件,具有自动ETag/If-None-Match支持
  • 渲染模板(目前仅支持Mustache

要添加这些组件,Barista使用中间件的概念来为每个请求构建一个处理流程。Barista暴露了一个允许你在请求前后(或两者)拦截请求的 BaristaMiddleware 协议。您添加中间件的顺序决定了它们的运行顺序。它们通常应在 BARRouter 中终止。一旦根据 JLRoutes 添加了基于 BARRouter,您就可以用几行代码处理任意多类型的URL。

    [self addRoute:@"/foo/:bar" forHTTPMethod:@"GET" handler:^BOOL(BARConnection *connection, BARRequest *request, NSDictionary *parameters) {
        NSString *responseMessage = [NSString stringWithFormat:@"Hello, %@", parameters[@"bar"]]; // parameters[@"bar"] maps to the key/value set in the URL, e.g. @"42" /foo/42

        BARResponse *response = [[BARResponse alloc] init];
        response.statusCode = 200;
        response.body = [responseMessage dataUsingEncoding:NSUTF8StringEncoding];
        [connection sendResponse:response];
        return YES;
    }];

中间件本质上是可链接的。如果您在 BARRouter 之前添加了 BARCookieParserBARSessionStore,一个请求流程将如下所示

  • 一个传入的请求到来
  • BARCookieParser 解析请求中的cookie(如果有),并将该数据添加到请求中
  • BARSessionStore 检查附加到请求的cookie对象(如果有),如果存在,则将相应的会话添加到请求中
  • 您的路由方法现在可以访问cookie和会话,处理请求,并根据需要返回响应
  • BARSessionStore 将cookie对象添加到响应中
  • BARCookieParser 将cookie对象序列化为头部并附加到响应中
  • 响应被序列化并返回给客户端

您会注意到中间件可以扩展请求和响应对象,添加自己的方法和数据。在上述示例的请求中,BARCookieParser 将头部转换为 NSHTTPCookie 对象,并将这些对象附加到请求中。 BARSessionStore 查找 NSHTTPCookie 对象,并使用它们来查找或创建 BARSession 对象,这些对象被附加到请求中。然后,您的路由器就有能力查找 NSHTTPCookie 对象或 BARSession 对象,并根据需要进行处理。类似地,在响应中,BARSessionStoreBARSession 的cookie添加到响应中,而BARCookieParser 将响应中的cookie转换为HTTP头部。

中间件还可以拦截请求并在适当的情况下自动处理,这样可以防止实际的路由方法被调用。例如,如果您想防止未登录用户访问资源,这很有用。如果您实现了一个充当授权网关的中间件并将其添加到上述中间件链中,它的工作方式如下

  • 如果用户已登录:
    • 一个传入的请求到来
    • BARCookieParser 解析请求中的cookie(如果有),并将该数据添加到请求中
    • BARSessionStore 检查附加到请求的cookie对象(如果有),如果存在,则将相应的会话添加到请求中
    • 您的授权网关会检测到他们已授权,并会继续,也许会将用户元数据添加到会话中
    • 您的路由方法现在可以访问cookie和会话,处理请求,并根据需要返回响应
    • 您的授权网关不需要对响应进行任何操作,因此它会自动继续
    • BARSessionStore 将cookie对象添加到响应中
    • BARCookieParser 将cookie对象序列化为头部并附加到响应中
    • 响应被序列化并返回给客户端
  • 如果用户未登录:
    • 一个传入的请求到来
    • BARCookieParser 解析请求中的cookie(如果有),并将该数据添加到请求中
    • BARSessionStore 检查附加到请求的cookie对象(如果有),如果存在,则将相应的会话添加到请求中
    • 您的授权网关会检测到他们未授权,并发送 403 禁止访问401 未授权 响应
    • 您的授权网关不需要对响应进行任何操作,因此它会自动继续
    • BARSessionStore 将cookie对象添加到响应中
    • BARCookieParser 将cookie对象序列化为头部并附加到响应中
    • 响应被序列化并返回给客户端

在第二种情况下,请注意,路由方法永远不会被调用。这是因为中间件具有拦截请求、发送自己的响应并阻止它们继续到链中下一步的能力。这使得将应用程序逻辑与基本处理分离变得非常简单和灵活。

模板化

Barista支持模板引擎的中间件,特别是支持Mustache,通过GRMustache。如果您正在渲染网页,这意味着您可以将这些数据从Objective-C代码中提取出来,并将它们移动到在运行时渲染的文件中。模板还可以传递一个包含要包含的值的对象。为此,请将 BARMustacheTemplateRenderer 中间件添加到您的链中,并指向包含模板文件的目录。以下是在Barista中如何进行模板化的示例

在Objective-C中:

    [self addRoute:@"/hello" forHTTPMethod:@"GET" handler:^BOOL(BARConnection *connection, BARRequest *request, NSDictionary *parameters) {
        BARResponse *response = [[BARResponse alloc] init];
        response.statusCode = 200;
        [response setViewToRender:@"hello" withObject:@{@"title": @"Hello world!"}];
        [connection sendResponse:response];
        return YES;
    }];

hello.mustache 中:

<!DOCTYPE html>
<html>
<head>
    <title>{{title}}</title>
</head>
<body>
    <div>{{title}}</div>
</body>
</html>

生成的HTML:

<!DOCTYPE html>
<html>
<head>
    <title>Hello world!</title>
</head>
<body>
    <div>Hello world!</div>
</body>
</html>

您可以将其与 BARStaticFileServer 结合使用,包括图片、JavaScript、CSS等,以构建丰富的网页和Web应用程序。

愿望清单

  • 更好的错误处理
  • 单元测试
  • 在路由器中为单独的路由添加中间件支持
  • 自动资源映射到Core Data
  • SCSS/SASS/LESS/CoffeeScript等编译
  • 授权中间件(基本认证、摘要认证、OAuth 1.0、OAuth 2等)
  • 持久会话存储
  • 在Mac上支持XPC

如果您希望贡献中间件或其他更改,请提交拉取请求。如果您正在添加新的中间件,请将子规格条目添加到相应的位置中的podspec中。同时,在以下贡献者名单中添加您的姓名,并添加对开源代码的致谢。

贡献者

致谢

许可证

请参阅 LICENSE.md 文件。