2015-01-16 3 views
0

Parse API에서 일부 데이터를 쿼리해야합니다. 아래의 코드는 구문 분석에서 CURL의 예입니다 : 다음Objective-C를 사용하여 HTTP GET 요청 보내기

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 

이 그를 달성하기 위해 내 코드입니다 :

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.)"} 
: 실행 한 후에, 나는 몇 가지 오류가있어
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]; 

지난 CURL 코드를 달성하기위한 Objective-C의 동등한 점은 무엇입니까? 아니면 무엇을 제안합니까?

미리 감사드립니다.

답변

1

NSURLErrorDomain error -1002 URL이 지원되지 않는 것을 의미합니다. 내 생각 엔 where 인수로 json을 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 그 시도가 : 어쩌면이 당신의 URL을 변경?

+0

답장을 보내 주셔서 감사합니다. 이제 새로운 오류가 발생했습니다 : '오류 도메인 = NSURLErrorDomain 코드 = -1005 "작업을 완료 할 수 없습니다. (NSURLErrorDomain 오류 -1005)."UserInfo = 0x7aaa2160 {NSErrorFailingURLStringKey = https : //api.parse.com/1/class/ClassName? 여기서 % = 7B % 22key1 % 22 : % 22value1 % 22, % 22key2 % 22 : % 22value2 % 22 % 7D, _kCFStreamErrorCodeKey = 57, NSErrorFailingURLKey = https : //api.parse.com/1/class/ClassName?22 = 22 % 22 % 22 % 22 % 22 % 22 % 22 % 7D, _kCFStreamErrorDomainKey = 1, NSUnderlyingError = 0x7ae494b0 "작업을 완료 할 수 없습니다 (kCFErrorDomainCFNetwork 오류 -1005)." } ' – Arbalest

+0

내 IOS 시뮬레이터를 다시 시작한 후이 [스레드] (http://stackoverflow.com/questions/25797339/nsurlconnection-get-request-returns-1005-the-network-connection-was-lost) 사라 :) – Arbalest

1

PFQuery을 사용해야합니다. 이에 대한 정보는 Parse's iOS/OS X Documentation에서 찾을 수 있습니다.

위에서 시도한 내용을위한 몇 가지 샘플 코드가 있습니다.

- (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>"]; 

} 
+1

OP에서 Parse SDK를 사용하지 않는 것 같습니다. 질문은 'cURL'에서 완료 한 URL 요청을 작성하는 것에 관한 것입니다. – Chris

+0

그는 우리가 무엇을 권하고 싶습니다. 그가 iOS에 글을 쓰는 경우 (질문에 'Objective-C'라는 플래그가 붙어 있기 때문에), 플랫폼 관련 SDK로 ** 수행하는 것이 좋습니다 **. 나는 그들도 그렇게 생각한다. 또한'cURL' 요청을 직접 코딩하는 것보다 훨씬 간단하고 오류가 발생하기 쉽지 않습니다. – mbm29414

+0

유효한 포인트. 나는 대체 제안을 요청하는 질문의 일부를 간과했다. 그렇기 때문에 Parse와의 의사 소통을위한 더 나은 접근 방법이 될 수 있습니다. 이미 효율적인 방법으로 래퍼를 작성해야 할 이유가 없습니다. – Chris