OCFWebServer是一个轻量级、现代的异步HTTP(版本1.1)服务器。它是从GCDWebServer分叉而来,并修改以满足Objective-Cloud.com的需求,希望也能满足其他人的需求。
OCFWebServer被OCFWeb使用,它是一个使用Objective-C开发Web应用程序的框架。OCFWeb和OCFWebServer都由Objective-Cloud.com使用。你在使用OCFWebServer吗?让我们知道,我们将在这里链接你的应用程序/项目。
OCFWebServer是为Objective-Cloud.com开发的。这并不意味着我们在开发过程中设定的目标与开发者的常规应用程序需求不兼容。这是我们工作于OCFWebServer时考虑的目标。
您可以简单地下载OCFWebServer的源代码,并将每个头文件和实现文件添加到自己的项目中。
注意:以下所有示例都是从GCDWebServer README文件中改编的,并略作修改,以反映OCFWebServer所做的更改。一些说明文本也被采纳。感谢:Pierre-Olivier Latour(非常感谢Pierre!)
设置OCFWebServer很容易
#import "OCFWebServer.h"
int main(int argc, const char* argv[]) {
@autoreleasepool {
OCFWebServer *server = [OCFWebServer new];
// Add a request handler for every possible GET request
[server addDefaultHandlerForMethod:@"GET"
requestClass:[OCFWebServerRequest class]
processBlock:^void(OCFWebServerRequest *request,
OCFWebServerResponseBlock respondWith) {
// Create your response and pass it to respondWith(...)
OCFWebServerResponse *response = [OCFWebServerDataResponse responseWithHTML:@"Hello World"];
[request respondWith:response];
}];
// Run the server on port 8080
[server runWithPort:8080];
}
return EXIT_SUCCESS;
以上示例假设您有一个基于控制台的应用程序。如果您有Cocoa或Cocoa Touch应用程序,则可能需要在其中一个控制器中有一个@property (nonatomic, strong) OCFWebServer *server
属性,并使用start
方法之一而不是runWithPort:
。如果您使用0
作为端口号,OCFWebServer将自动向操作系统请求一个空闲端口号并使用该端口号。
以下是一个示例处理程序,它使用'OCFWebServerResponse'的便利方法将/
重定向到/index.html
(它自动设置HTTP状态码和'Location'头)
[self addHandlerForMethod:@"GET"
path:@"/"
requestClass:[OCFWebServerRequest class]
processBlock:^void(OCFWebServerRequest* request) {
NSURL *toURL = [NSURL URLWithString:@"index.html" relativeToURL:request.URL];
respondWith([OCFWebServerResponse responseWithRedirect:toURL
permanent:NO]);
}];
要实现HTTP表单,您需要一对处理程序
OCFWebServerURLEncodedFormRequest
,它可以自动解析这样的主体。处理程序简单地将用户提交的表单的值回显回来。到此为止
[server addHandlerForMethod:@"GET"
path:@"/"
requestClass:[OCFWebServerRequest class]
processBlock:^void(OCFWebServerRequest* request) {
NSString* html = @"<html><body> \
<form name=\"input\" action=\"/\" \
method=\"post\" enctype=\"application/x-www-form-urlencoded\"> \
Value: <input type=\"text\" name=\"value\"> \
<input type=\"submit\" value=\"Submit\"> \
</form> \
</body></html>";
[request respondWith:[OCFWebServerDataResponse responseWithHTML:html]];
}];
[server addHandlerForMethod:@"POST"
path:@"/"
requestClass:[OCFWebServerURLEncodedFormRequest class]
processBlock:^void(OCFWebServerRequest* request) {
NSString *value = [(OCFWebServerURLEncodedFormRequest*)request arguments][@"value"];
NSString* html = [NSString stringWithFormat:@"<p>%@</p>", value];
[request respondWith:[OCFWebServerDataResponse responseWithHTML:html]];
}];
正如示例所示,您可以为OCFWebServer的一个实例添加多个处理程序。处理程序以后进先出的顺序排序和匹配。
OCFWebServer可在
上运行,并且没有第三方依赖关系。
OCFWebServer是GCDWebServer的一个分支。GCDWebServer的作者做了很棒的工作。这就是我们选择GCDWebServer作为OCFWebServer基础的原因。在构建Objective-Cloud.com的过程中,我们发现GCDWebServer以不兼容的方式进行,以便更好地工作。这就是我们为什么要分支GCDWebServer并改进它。OCFWebServer本身并不优于GCDWebServer。它是不同的。
如果您想了解更多关于OCFWebServer架构的信息,可以查看GCDWebServer的README。OCFWebServer几乎与GCDWebServer有相同的架构。
在OCFWebServer中,您的请求处理程序不需要立即返回任何内容。OCFWebServer会将请求传递给您的请求处理程序。请求为您提供了访问许多特定于HTTP请求属性的途径。现在轮到您来计算响应。一旦完成,您应该通过调用-respondWith:
(类:OCFRequest)并将响应传递给它,让请求对象了解到您的响应。以下是一个示例
[server addDefaultHandlerForMethod:@"GET"
requestClass:[OCFWebServerRequest class]
processBlock:^void(OCFWebServerRequest *request) {
dispatch_async(myQueue, ^() {
OCFWebServerDataResponse *response = [OCFWebServerDataResponse responseWithHTML:@"Hello World"];
[request respondWith:response];
});
}];
如您所见,您的请求处理程序可以执行它想要的任何事情。您不需要调用dispatch_async
,但如果您需要,您可以做。
顺便说一句:将您的GCDWebServer相关代码迁移到OCFWebServer非常简单:只需将return response;
替换为[request respondWith:response], return;
即可完成。
在撰写本文档时,GCDWebServer只能处理16个并发请求。您可以通过修改GCDWebServer源代码中的一个常量来增加并发数量,但在OCFWebServer中,默认最大并发请求数已自动设置为可能的最大值。如果您在运行OS X且未调整设置,这意味着OCFWebServer可以在任何时候处理多达128个并发请求。如果您调整了OS X的设置,则此值可以进一步提高,我们已经在开发更好的队列系统,这将进一步提高并发请求数量。
事实:这是一个实现细节,但值得一提。OCFWebServer使用ARC、派发对象(OS_OBJECT_USE_OBJC
)、现代运行时,并且GCDWebServer现有代码库已清理并增强了POSIX兼容性。
OCFWebServer仅支持OS X 10.8+和iOS 6+。如果您想在旧版本的OS X/iOS上使用它,则应使用GCDWebServer。
如果您对HTTP服务器相关需求有更多便利性,也应该看看OCFWeb。OCFWeb是一个让您可以用Objective-C编写Web应用的框架。OCFWeb在内部使用OCFWebServer,并添加了许多实用的功能,比如模板引擎、更简洁的处理程序语法等。
OCFWebServer的开发在GitHub上进行。如果您发现了一个错误、怀疑有错误或有问题,请随时开启一个问题。Pull requests非常受欢迎,并且将被尽快接受。
OCFWebServer在New BSD许可证下提供,就像GCDWebServer一样。
This file belongs to the OCFWebServer project.
OCFWebServer is a fork of GCDWebServer (originally developed by
Pierre-Olivier Latour).
We have forked GCDWebServer because we made extensive and
incompatible changes to it.
Copyright (c) 2013, Christian Kienle / [email protected]
All rights reserved.
Original Copyright Statement:
Copyright (c) 2012-2013, Pierre-Olivier Latour
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
* Neither the name of the <organization> nor the
names of its contributors may be used to endorse or promote products
derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.