测试已测试 | ✗ |
语言语言 | Obj-CObjective C |
许可证 | MIT |
发布最后发布 | 2014年12月 |
由 未命名 维护。
依赖关系 | |
CocoaAsyncSocket | ~> 7.0 |
JLRoutes | ~> 1.4 |
Barista是一个用Objective-C编写的模块化网络服务器。它的目的是允许将网络服务器嵌入到另一个应用程序或开发者工具中。Barista从node.js和ExpressJS网络服务器中汲取灵感,将其系统分解成更小的部分,这些部分可以连接在一起。
Barista现在正处于早期开发阶段。它可能还不应该用于与服务最终用户交云的应用程序。但很可能足够用于内部工具或构建开发工具。
API是不稳定的,可能会因为任何原因而破坏。
在最基本的层面上,Barista服务器只是一个运行在任何端口上的HTTP服务器。默认情况下它什么也不做。为了真正处理请求,您需要向服务器添加组件。Barista包括几个你可能(或可能不)想要添加到你的堆栈的组件。这些包括
要添加这些组件,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
之前添加了 BARCookieParser
和 BARSessionStore
,一个请求流程将如下所示
BARCookieParser
解析请求中的cookie(如果有),并将该数据添加到请求中BARSessionStore
检查附加到请求的cookie对象(如果有),如果存在,则将相应的会话添加到请求中BARSessionStore
将cookie对象添加到响应中BARCookieParser
将cookie对象序列化为头部并附加到响应中您会注意到中间件可以扩展请求和响应对象,添加自己的方法和数据。在上述示例的请求中,BARCookieParser
将头部转换为 NSHTTPCookie
对象,并将这些对象附加到请求中。 BARSessionStore
查找 NSHTTPCookie
对象,并使用它们来查找或创建 BARSession
对象,这些对象被附加到请求中。然后,您的路由器就有能力查找 NSHTTPCookie
对象或 BARSession
对象,并根据需要进行处理。类似地,在响应中,BARSessionStore
将 BARSession
的cookie添加到响应中,而BARCookieParser
将响应中的cookie转换为HTTP头部。
中间件还可以拦截请求并在适当的情况下自动处理,这样可以防止实际的路由方法被调用。例如,如果您想防止未登录用户访问资源,这很有用。如果您实现了一个充当授权网关的中间件并将其添加到上述中间件链中,它的工作方式如下
BARCookieParser
解析请求中的cookie(如果有),并将该数据添加到请求中BARSessionStore
检查附加到请求的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应用程序。
如果您希望贡献中间件或其他更改,请提交拉取请求。如果您正在添加新的中间件,请将子规格条目添加到相应的位置中的podspec中。同时,在以下贡献者名单中添加您的姓名,并添加对开源代码的致谢。
请参阅 LICENSE.md 文件。