将 cURL 请求转换为 NSMutableURLRequest
Translating cURL request to NSMutableURLRequest
我是一名新的 Objective-C 开发人员,我正在与 cURL 格式的 API 进行交互。我习惯于使用 URL 进行调用,因此我从互联网上找到的内容拼凑了一个请求。我仍然无法在我的应用程序中提取数据。
这是原始的 cURL 请求(当然带有虚拟键):
curl -v -H "app_id:12345" -H "app_key:abcdefg" -X POST "http://data.host.com/object" -d '{"Page":0,"Take":10}'
这是我的尝试:
//Request
NSURLSession *session = [NSURLSession sharedSession];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://data.host.com/object"]];
//Set method
request.HTTPMethod = @"POST";
//Set parameters
NSDictionary *parameters = @{
@"Page": @(0),
@"Take": @(10)
};
NSMutableString *parameterString = [NSMutableString string];
for (NSString *key in [parameters allKeys]) {
if ([parameterString length]) {
[parameterString appendString:@"&"];
}
[parameterString appendFormat:@"%@=%@", key, parameters[key]];
}
NSLog(@"PARAMETER STRING: %@",parameterString);
//Set headers
[request setValue:@"12345" forHTTPHeaderField:@"app_id"];
[request setValue:@"abcdefg" forHTTPHeaderField:@"app_key"];
[request setHTTPBody:[parameterString dataUsingEncoding:NSUTF8StringEncoding]];
NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if (!error) {
if ([data length]) {
NSDictionary *jsonResponse = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
NSLog(@"JSON RESPONSE: %@", jsonResponse);
}
} else {
NSLog(@"%@", error);
}
}];
[task resume];
NSLog(@"TASK: %@", task);
我没有收到错误,但 jsonResponse returns 为 NULL。有人知道我缺少什么吗?提前致谢!
如果比较 curl 版本和 obj-c 版本之间的 HTTP 消息交换,您会发现不同之处。 AFAICS 您在指定 body 编码的内容类型中缺少 header。发布时,您需要传递有关如何编码 body 的信息。
这是我的一个应用程序中的一些示例代码:
- (NSURLRequest *)createPostRequestWithURL:(NSURL *)url
parameters:(NSDictionary *)parameters {
NSLog(@"startGetTaskForUrl: %@, params %@", url, parameters);
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setHTTPMethod:@"POST"];
[request addValue:@"application/x-www-form-urlencoded"
forHTTPHeaderField:@"Content-Type"];
NSString * httpParams = [self createHttpParameters:parameters];
NSLog(@"HTTPClient: postRequestWithURL body: %@", httpParams);
[request setHTTPBody:[httpParams dataUsingEncoding:NSUTF8StringEncoding]];
return request;
}
- (NSString *)urlEncodedUTF8String: (NSString *) source {
return (id)CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(0, (CFStringRef)source, 0,
(CFStringRef)@";/?:@&=$+{}<>,", kCFStringEncodingUTF8));
}
- (NSString *) createHttpParameters: (NSDictionary *) parameters {
NSMutableString *body = [NSMutableString string];
for (NSString *key in parameters) {
NSString *val = [parameters objectForKey:key];
if ([body length])
[body appendString:@"&"];
[body appendFormat:@"%@=%@", [self urlEncodedUTF8String: [key description]],
[self urlEncodedUTF8String: [val description]]];
}
return body;
}
我是一名新的 Objective-C 开发人员,我正在与 cURL 格式的 API 进行交互。我习惯于使用 URL 进行调用,因此我从互联网上找到的内容拼凑了一个请求。我仍然无法在我的应用程序中提取数据。
这是原始的 cURL 请求(当然带有虚拟键):
curl -v -H "app_id:12345" -H "app_key:abcdefg" -X POST "http://data.host.com/object" -d '{"Page":0,"Take":10}'
这是我的尝试:
//Request
NSURLSession *session = [NSURLSession sharedSession];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://data.host.com/object"]];
//Set method
request.HTTPMethod = @"POST";
//Set parameters
NSDictionary *parameters = @{
@"Page": @(0),
@"Take": @(10)
};
NSMutableString *parameterString = [NSMutableString string];
for (NSString *key in [parameters allKeys]) {
if ([parameterString length]) {
[parameterString appendString:@"&"];
}
[parameterString appendFormat:@"%@=%@", key, parameters[key]];
}
NSLog(@"PARAMETER STRING: %@",parameterString);
//Set headers
[request setValue:@"12345" forHTTPHeaderField:@"app_id"];
[request setValue:@"abcdefg" forHTTPHeaderField:@"app_key"];
[request setHTTPBody:[parameterString dataUsingEncoding:NSUTF8StringEncoding]];
NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if (!error) {
if ([data length]) {
NSDictionary *jsonResponse = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
NSLog(@"JSON RESPONSE: %@", jsonResponse);
}
} else {
NSLog(@"%@", error);
}
}];
[task resume];
NSLog(@"TASK: %@", task);
我没有收到错误,但 jsonResponse returns 为 NULL。有人知道我缺少什么吗?提前致谢!
如果比较 curl 版本和 obj-c 版本之间的 HTTP 消息交换,您会发现不同之处。 AFAICS 您在指定 body 编码的内容类型中缺少 header。发布时,您需要传递有关如何编码 body 的信息。 这是我的一个应用程序中的一些示例代码:
- (NSURLRequest *)createPostRequestWithURL:(NSURL *)url
parameters:(NSDictionary *)parameters {
NSLog(@"startGetTaskForUrl: %@, params %@", url, parameters);
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setHTTPMethod:@"POST"];
[request addValue:@"application/x-www-form-urlencoded"
forHTTPHeaderField:@"Content-Type"];
NSString * httpParams = [self createHttpParameters:parameters];
NSLog(@"HTTPClient: postRequestWithURL body: %@", httpParams);
[request setHTTPBody:[httpParams dataUsingEncoding:NSUTF8StringEncoding]];
return request;
}
- (NSString *)urlEncodedUTF8String: (NSString *) source {
return (id)CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(0, (CFStringRef)source, 0,
(CFStringRef)@";/?:@&=$+{}<>,", kCFStringEncodingUTF8));
}
- (NSString *) createHttpParameters: (NSDictionary *) parameters {
NSMutableString *body = [NSMutableString string];
for (NSString *key in parameters) {
NSString *val = [parameters objectForKey:key];
if ([body length])
[body appendString:@"&"];
[body appendFormat:@"%@=%@", [self urlEncodedUTF8String: [key description]],
[self urlEncodedUTF8String: [val description]]];
}
return body;
}