使用Objective-C发送HTTP GET请求

使用Objective-C发送HTTP GET请求,objective-c,curl,parse-platform,http-get,Objective C,Curl,Parse Platform,Http Get,我需要从parseapi查询一些数据。下面的代码是Parse中的CURL示例: curl -X GET \ -H "X-Parse-Application-Id: XXXXX" \ -H "X-Parse-REST-API-Key: XXXXX" \ -G \ --data-urlencode 'where={"key1":"value1","key2":"value2"}' \ https://api.parse.com/1/classes/ClassName 然后,这是

我需要从parseapi查询一些数据。下面的代码是Parse中的CURL示例:

curl -X GET \
  -H "X-Parse-Application-Id: XXXXX" \
  -H "X-Parse-REST-API-Key: XXXXX" \
  -G \
  --data-urlencode 'where={"key1":"value1","key2":"value2"}' \
  https://api.parse.com/1/classes/ClassName
然后,这是我实现这一目标的代码:

NSDictionary *dictionary = @{@"key1": @"value1", @"key1": @"value2"};
NSError *error = nil;
NSString *jsonString = nil;
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dictionary options:kNilOptions error:&error];

if (!jsonData)
    NSLog(@"Got an error: %@", error);
else
    jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];

NSString *fullUrl = [NSString stringWithFormat:@"https://api.parse.com/1/classes/ClassName?where=%@", jsonString];

NSURL *url = [NSURL URLWithString:fullUrl];

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setHTTPMethod:@"GET"];
[request addValue:@"XXXXX" forHTTPHeaderField:@"X-Parse-Application-Id"];
[request addValue:@"XXXXX" forHTTPHeaderField:@"X-Parse-REST-API-Key"];

NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
    if (!error) {
        NSLog(@"Data: %@", data);
        NSLog(@"Response: %@", response);
    }else{
        NSLog(@"Error: %@", error);
    }
}];
[task resume];
执行后,我出现了一些错误:

2015-01-16 18:19:57.532 ParseTest[37964:1018046] 
Error: Error Domain=NSURLErrorDomain Code=-1002 
"The operation couldn’t be completed. (NSURLErrorDomain error -1002.)" 
UserInfo=0x7d17d320 {NSUnderlyingError=0x7d051f70 "The operation couldn’t be completed. (kCFErrorDomainCFNetwork error -1002.)"}
完成过去的CURL代码的Objective-C等价物是什么?或者你有什么建议


提前感谢。

您需要使用
PFQuery
。有关这方面的信息,请参见

下面是一些示例代码,用于执行上面尝试的操作。它应该是cURL代码的直接替代品:

- (void)runQuery {
    PFQuery *query = [PFQuery queryWithClassName:@"ClassName"];
    [query whereKey:@"key1" equalTo:value1];
    [query whereKey:@"key2" equalTo:value2];
    [query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
        if (error != nil) {
            // Do error handling here

        } else {
            // You have a valid query result

        }
    }
     ];
}
只是别忘了,在你打电话之前,你需要在你的应用程序中初始化你的解析连接。这样,您就不需要像在cURL代码中那样在每个请求中传递密钥。您可以在
AppDelegate
对象的
-didFinishLaunchingWithOptions:
方法中执行此操作,如下所示:

#import <Parse/Parse.h>
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Initialize Parse.
    [Parse
      setApplicationId:@"<App Id>"
      clientKey:@"<Client Key>"];

}
#导入
@实现AppDelegate
-(BOOL)应用程序:(UIApplication*)应用程序使用选项完成启动:(NSDictionary*)启动选项{
//初始化解析。
[解析]
setApplicationId:@“”
clientKey:@“];
}

nsurErrorDomain错误-1002
表示不支持该URL。我猜您需要对
where
参数的json进行URL编码。可能会将您的URL更改为:

if (!jsonData)
    NSLog(@"Got an error: %@", error);
else
    jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];

jsonString = [jsonString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

NSString *fullUrl = [NSString stringWithFormat:@"https://api.parse.com/1/classes/ClassName?where=%@", jsonString];

如果这不起作用,您是否尝试过记录
fullUrl
并尝试
cURL

看起来OP并没有使用Parse SDK。问题更多的是建立一个url请求来匹配在
cURL
中完成的请求,他问我们会推荐什么。如果他是用iOS写的(因为问题被标记为
Objective-C
),我建议用他们特定于平台的SDK来写。我想他们也会的。与手工编码每个
cURL
请求相比,它也更直接,更不容易出错。这一点很有道理。我忽略了问题中要求另一个建议的部分。既然如此,您完全正确地认为这是与Parse通信的更好方法。当包装器已经以更高效的方式完成时,没有理由编写它manner@Chris是的,我想他们知道优化和保护通信的最佳方法。另外,我没有时间重新发明轮子!;-)另外,我认为他的问题正好突出了我为什么更喜欢使用他们的SDK。我的代码比计算所有HTTP通信更容易理解,因为那不是我的背景。谢谢你的回答@mbm29414,无论如何,这是我学校关于如何发送HTTP get请求的任务。我选择parse.com作为我的云服务器。所以我不会使用parse sdk来解决我的任务,对不起。任何帮助都将不胜感激:)感谢您的回答,现在我正在强制执行新错误:
error Domain=nsurerrordomain code=-1005“操作无法完成。(nsurerrordomain error-1005)。”UserInfo=0x7aaa2160{NSErrorFailingURLStringKey=https://api.parse.com/1/class/ClassName?where=%7B%22key1%22:%22value1%22,%22key2%22:%22value2%22%7D,kCFStreamErrorCodeKey=57,nserrorfailingurkey=https://api.parse.com/1/class/ClassName?where=%7B%22key1%22:%22value1%22,%22key2%22:%22value2%22%7D,kCFStreamErrorDomainKey=1,NSUnderlyingError=0x7ae494b0“操作无法完成。(kCFErrorDomainCFNetwork错误-1005。)”}
LoL重新启动iOS模拟器后,错误消失:)