Unirest是一组轻量级的HTTP库,支持多种语言。
GET
、POST
、PUT
、PATCH
、DELETE
请求从GitHub(或克隆仓库)下载Objective-C Unirest库,并将其文件夹导入到项目中。您还可以使用CocoaPods安装Unirest-obj-c。
Unirest-Obj-C客户端库需要在您的Xcode项目中启用ARC(自动引用计数)。要启用ARC,请选择您的项目或目标,然后转到构建设置,在“Apple LLVM编译器3.0-语言”部分下,您将看到“Objective-C自动引用计数”选项。
对于现有项目,幸运的是,Xcode提供了一个工具将现有代码转换为ARC,这在“编辑”->“重构”->“转换为Objective-C ARC”中可用。
因此,你可能想知道如何使用Unirest使在Objective-C中创建请求变得更容易,让我们看一个工作的例子
NSDictionary* headers = @{@"accept": @"application/json"};
NSDictionary* parameters = @{@"parameter": @"value", @"foo": @"bar"};
UNIHTTPJsonResponse *response = [[UNIRest post:^(UNISimpleRequest *request) {
[request setUrl:@"http://httpbin.org/post"];
[request setHeaders:headers];
[request setParameters:parameters];
}] asJson];
与Unirest Java库类似,Objective-C库支持多种响应类型,这些类型作为最后一个参数给出。在上面的例子中,我们使用`asJson`获取JSON响应,类似地还有`asBinary`和`asString`用于其他类型的响应,例如文件数据和超媒体响应。
对于非阻塞请求,您将想要发送异步请求,以便在后台获取或更新数据时保持应用程序运行,使用unirest执行这一点非常简便,几乎不需要修改之前示例中的代码。
NSDictionary *headers = @{@"accept": @"application/json"};
NSDictionary *parameters = @{@"parameter": @"value", @"foo": @"bar"};
[[UNIRest post:^(UNISimpleRequest *request) {
[request setUrl:@"http://httpbin.org/post"];
[request setHeaders:headers];
[request setParameters:parameters];
}] asJsonAsync:^(UNIHTTPJsonResponse* response, NSError *error) {
// This is the asyncronous callback block
NSInteger code = response.code;
NSDictionary *responseHeaders = response.headers;
UNIJsonNode *body = response.body;
NSData *rawBody = response.rawBody;
}];
您可以通过在UNIUrlConnection
对象上调用cancel
方法来取消异步请求。
UNIUrlConnection *asyncConnection = [[UNIRest get:^(UNISimpleRequest *simpleRequest) {
[request setUrl:@"http://httpbin.org/get"];
}] asJsonAsync:^(UNIHTTPJsonResponse *response, NSError *error) {
// Do something
}];
[asyncConnection cancel]; // Cancel request
使用Objective-C中的unirest通过请求传输文件可以通过创建一个NSURL
对象,并以参数值的形式传递给UNISimpleRequest
来实现,具体如下
NSDictionary* headers = @{@"accept": @"application/json"};
NSURL* file = nil;
NSDictionary* parameters = @{@"parameter": @"value", @"file": file};
UNIHTTPJsonResponse *response = [[UNIRest post:^(UNISimpleRequest *request) {
[request setUrl:@"http://httpbin.org/post"];
[request setHeaders:headers];
[request setParameters:parameters];
}] asJson];
要发送自定义体(如JSON),只需使用NSJSONSerialization
进行数据序列化,并用BodyRequest
和[method]Entity
代替[method]
代码块
NSDictionary *headers = @{@"accept": @"application/json"};
NSDictionary *parameters = @{@"parameter": @"value", @"foo": @"bar"};
UNIHTTPJsonResponse *response = [[UNIRest postEntity:^(UNIBodyRequest *request) {
[request setUrl:@"http://httpbin.org/post"];
[request setHeaders:headers];
// Converting NSDictionary to JSON:
[request setBody:[NSJSONSerialization dataWithJSONObject:parameters options:0 error:nil]];
}] asJson];
可以通过在构建器中设置username
和password
属性,使用基本认证来认证请求
UNIHTTPJsonResponse *response = [[UNIRest get:^(UNISimpleRequest *request) {
[request setUrl:@"http://httpbin.org/get"];
[request setUsername:@"user"];
[request setPassword:@"password"];
}] asJson];
Objective-C unirest库使用类型为UNISimpleRequest和UNIBodyRequest的配置块来配置URL、头部以及请求的参数/体。
+(UNIHTTPRequest*) get:(void (^)(UNISimpleRequestBlock*)) config;
+(UNIHTTPRequestWithBody*) post:(void (^)(UNISimpleRequestBlock*)) config;
+(UNIHTTPRequestWithBody*) postEntity:(void (^)(UNIBodyRequestBlock*)) config;
+(UNIHTTPRequestWithBody*) put:(void (^)(UNISimpleRequestBlock*)) config;
+(UNIHTTPRequestWithBody*) putEntity:(void (^)(UNIBodyRequestBlock*)) config;
+(UNIHTTPRequestWithBody*) patch:(void (^)(UNISimpleRequestBlock*)) config;
+(UNIHTTPRequestWithBody*) patchEntity:(void (^)(UNIBodyRequestBlock*)) config;
+(UNIHTTPRequestWithBody*) delete:(void (^)(UNISimpleRequestBlock*)) config;
+(UNIHTTPRequestWithBody*) deleteEntity:(void (^)(UNIBodyRequestBlock*)) config;
UNIHTTPRequest
[UNIRest get:
(void (^)(UNISimpleRequestBlock*))] config;
发送与给定URL的请求类型等效的请求
UNIHTTPRequestWithBody
[UNIRest (post|postEntity):
(void (^)(UNISimpleRequestBlock|UNIBodyRequestBlock)(*))] config;
发送与给定URL的请求类型等效的请求
UNIHTTPRequestWithBody
[UNIRest (put|putEntity):
(void (^)(UNISimpleRequestBlock|UNIBodyRequestBlock)(*))] config;
发送与给定URL的请求类型等效的请求
UNIHTTPRequestWithBody
[UNIRest (patch|patchEntity):
(void (^)(UNISimpleRequestBlock|UNIBodyRequestBlock)(*))] config;
发送与给定URL的请求类型等效的请求
UNIHTTPRequestWithBody
[UNIRest (delete|deleteEntity):
(void (^)(UNISimpleRequestBlock|UNIBodyRequestBlock)(*))] config;
发送与给定URL的请求类型等效的请求
然后可以通过调用以下之一的来执行UNIHTTPRequest
和UNIHTTPRequestWithBody
-(UNIHTTPStringResponse*) asString;
-(UNIHTTPStringResponse*) asString:(NSError**) error;
-(UNIUrlConnection*) asStringAsync:(UNIHTTPStringResponseBlock) response;
-(UNIHTTPBinaryResponse*) asBinary;
-(UNIHTTPBinaryResponse*) asBinary:(NSError**) error;
-(UNIUrlConnection*) asBinaryAsync:(UNIHTTPBinaryResponseBlock) response;
-(UNIHTTPJsonResponse*) asJson;
-(UNIHTTPJsonResponse*) asJson:(NSError**) error;
-(UNIUrlConnection*) asJsonAsync:(UNIHTTPJsonResponseBlock) response;
-(UNIHTTPStringResponse*)
asString;
以字符串的形式返回响应的阻塞请求调用,适用于超媒体API或其他。
-(UNIHTTPStringResponse*) asString:(NSError**) error;
以字符串形式返回响应并处理错误的阻塞请求调用。
-(UNIUrlConnection*) asStringAsync:(UNIHTTPStringResponseBlock) response;
以字符串形式异步返回响应,适用于超媒体API或其他。
-(UNIHTTPBinaryResponse*)
asBinary;
以二进制输出的形式返回响应的阻塞请求调用,适用于文件和其他媒体。
-(UNIHTTPBinaryResponse*) asBinary:(NSError**) error;
以二进制输出形式返回响应并处理错误的阻塞请求调用。
-(UNIUrlConnection*) asBinaryAsync:(UNIHTTPBinaryResponseBlock) response;
以二进制输出形式异步返回响应,适用于文件和其他媒体。
-(UNIHTTPJsonResponse*)
asJson;
以JSON形式返回响应的阻塞请求调用。
-(UNIHTTPJsonResponse*) asString:(NSError**) error;
以JSON形式返回响应并处理错误的阻塞请求调用。
-(UNIUrlConnection*) asJsonAsync:(UNIHTTPJsonResponseBlock) response;
以JSON形式异步返回响应。
您可以为Unirest-Obj-C配置一些高级设置
您可以为自定义超时值(以秒
为单位)
[UNIRest timeout:2];
默认超时是60
您可以为每个请求设置默认的头部
[UNIRest defaultHeader:@"Header1" value:@"Value1"];
[UNIRest defaultHeader:@"Header2" value:@"Value2"];
您可以通过以下操作随时清除默认头部
[UNIRest clearDefaultHeaders];
由Mashape团队用❤️制作