在 CocoaHTTPServer 的基础上添加了一个受到 Sinatra 启发的路由 API。
支持 iOS 4+ 和 OS X 10.7+
http = [[RoutingHTTPServer alloc] init];
[http setPort:8000];
[http setDefaultHeader:@"Server" value:@"YourAwesomeApp/1.0"];
[http handleMethod:@"GET" withPath:@"/hello" block:^(RouteRequest *request, RouteResponse *response) {
[response setHeader:@"Content-Type" value:@"text/plain"];
[response respondWithString:@"Hello!"];
}];
提供了针对 GET/POST/PUT/DELETE 的便捷方法
[http get:@"/hello/:name" withBlock:^(RouteRequest *request, RouteResponse *response) {
[response setHeader:@"Content-Type" value:@"text/plain"];
[response respondWithString:[NSString stringWithFormat:@"Hello %@!", [request param:@"name"]]];
}];
请注意,在本示例中,路径为 /hello/:name
,这将匹配 /hello/world
,/hello/you
等。路径中的命名参数将添加到请求对象的 params 字典中。查询参数也包括在这个字典中。
路径可以使用通配符
[http get:@"/files/*.*" withBlock:^(RouteRequest *request, RouteResponse *response) {
// The "wildcards" parameter is an NSArray of wildcard matches
}];
或者您可以使用大括号将字符串括起来来自定义正则表达式
[http get:@"{^/page/(\\d+)}" withBlock:^(RouteRequest *request, RouteResponse *response) {
// The "captures" parameter is an NSArray of capture groups
}];
可以使用选择器来处理路由
- (void)setupRoutes {
[http handleMethod:@"GET" withPath:@"/hello" target:self selector:@selector(handleHelloRequest:withResponse:)];
}
- (void)handleHelloRequest:(RouteRequest *)request withResponse:(RouteResponse *)response {
[response respondWithString:@"Hello!"];
}
RouteResponses 可以响应一个 NSString 或 NSData 对象、一个文件的路径或现有的 HTTPResponse 类。响应也可以是空的,只要设置了状态码或自定义头即可。例如,执行重定向:
[http get:@"/old" withBlock:^(RouteRequest *request, RouteResponse *response) {
[response setStatusCode:302]; // or 301
[response setHeader:@"Location" value:[self.baseURL stringByAppendingString:@"/new"]];
}];
服务器对象还进行了一些增强
可以通过 setDefaultHeader:value:
设置默认头,或将字典传递给 setDefaultHeaders
。这允许您添加诸如 Server 标头之类的内容。
每个响应都添加了 Connection 头。如果您想强制关闭保持连接,可以显式在响应对象中设置它。
可以更改处理路由的 dispatch queue。默认情况下,路由会在 CocoaHTTPServer 的连接队列上处理,将此更改为 dispatch_get_main_queue()
将会在主线程上处理所有路由。连接处理仍在后台进行,只有路由处理受到影响。