将 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;
}