这是一个在 Objective-C 应用程序中模拟 HTTP 服务器的简单方法。
O(N)
。您不应该将 Mocktail 与您的代码一起打包。它是一个开发工具。
是的,真的,它很酷,您仍然可以使用它!您可以在大约8分钟内阅读整个源代码,了解其工作原理。重要的 API 是一个方法
+ (instancetype)startWithContentsOfDirectoryAtURL:(NSURL *)url configuration:(NSURLSessionConfiguration *)configuration;
您只需将一些文件按特定格式(稍后会详细介绍)放入一个目录,并为该目录添加 .tail
文件扩展名,然后将该目录的 URL 传递给 Mocktail。就是这样。
该目录可以位于您的应用程序包内部(如果正在支持测试套件,例如),或者如果是在模拟器中运行,您可以将目录的 URL 设置为桌面上的文件夹。
我希望存在这样一个标准,但遗憾的是,并非如此。(参见 HAR,它认为它将承担这项任务,但它用于分析请求期间发生了什么,而不是返回的内容。)
所以我们自己创建了一个。它是换行符分隔的。
第1行 是一个正则表达式,匹配 HTTP 方法。例如 GET
或 GET|POST
或 .*
都可以工作。
第2行 是一个正则表达式,匹配 HTTP 请求的完整 URL。例如 http://yourserver.com:1234/very/specific/path\?param1=value1
或 maybe just /partial/path/to/something/.*
也很好。可能有一个以上的正则表达式匹配完整的 URL(例如,对于特定的路径使用 http://yourserver.com:1234/path,并通过 /.* 匹配所有其他内容)。如果发生这种情况,最长的正则表达式将匹配。
第3行 是响应的 HTTP 状态码。通常是 200
。
从第4行开始直到空白行是一组原始HTTP响应头。例如,要设置名为auth_token
的cookie,使用Set-Cookie: auth_token=42
,要指定内容的HTTP/MIME类型,使用Content-Type: application/json; charset=utf-8
或Content-Type: text/html
。如果你要发送二进制数据,最佳做法是在Content-Type头后面加上;base64
,然后对响应体进行Base64编码。每个头都应该单独一行,该部分以空白行结束。
响应头部分之后的所有内容(即第4行之后的空白行)将被作为响应体返回,无论是直接返回还是Base64解码,这取决于你放在响应头中的内容类型。除非你使用了占位符支持,但这将稍后讨论。只要文件以.tail
结尾,文件名是什么无关紧要。你只需在每个模拟响应“端点”中使用这些文件之一,Mocktail启动时会加载它们。
哦,你是想使你的模拟响应更智能?这可不是懒汉的风格。
那么这么做。
1. 跟踪你从调用startWithContentsOfDirectoryAtURL:
获得的对象。
2. 在你的模拟响应中添加一个模板标记。
{{ foo }}
3. 使用那个优雅的Objective-C键值设置语法来设置一些键和值。
Mocktail *mocktail = [Mocktail startWithContentsOfDirectoryAtURL:url];
mocktail[@"foo"] = @"bar";
4. 没有步骤7。
NSURLProtocol
自从诞生以来一直存在,除非你阅读过像@mattt关于该主题的出色NSHipster博客文章,否则它的用途并不明显。如果你没有阅读NSHipster,你是在错过一些东西。它太棒了。
欢迎你的pull请求,但请不要对此太认真。记住,Mocktail最伟大的功能之一就是它的简单性。我们的律师希望你也首先签署此表。