2015-11-17 22 views
6

Używam AFNetworking do wykonania żądania internetowego w interfejsie API VolunteerMatch. Kiedy wykonuję żądanie, otrzymuję kod 200, jednak nie otrzymuję odpowiedzi. Oto jak typowy wniosek VolunteerMatch wygląda następująco:Volunteermatch API Objective C

GET /api/call?action=helloWorld&query=... HTTP/1.1 
Host: www.volunteermatch.org 
Accept-Charset: UTF-8 
Content-Type: application/json 
Authorization: WSSE profile="UsernameToken" 
X-WSSE: UsernameToken Username="acme", PasswordDigest="quR/EWLAV4xLf9Zqyw4pDmfV9OY=", 
Nonce="d36e316282959a9ed4c89851497a717f", Created="2003-12-15T14:43:07-0700" 

Here jest rozszerzona dokumentacja.

Tu jest mój kod, który używam do tworzenia moją prośbę:

// Create parameters 
    NSDictionary* param = @{ 
          @"action":@"helloWorld", 
          @"query":@"{\"name\":\"john\"}" 
          }; 

    // Create Manager 
    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 
    manager.responseSerializer = [AFJSONResponseSerializer serializer]; 
    manager.requestSerializer = [AFJSONRequestSerializer serializer]; 

    // Add Headers 
    [manager.requestSerializer setValue:@"WWSE profile=\"UsernameToken\"" forHTTPHeaderField:@"Authorization"]; 
    [manager.requestSerializer setValue:[CocoaWSSE headerWithUsername:@"XXXXX" password:@"XXXXXXXXXXX"] forHTTPHeaderField:@"X-WSSE"]; 

    // Perform Request 
    [manager GET:@"http://www.volunteermatch.org/api/call" parameters:param success:^(AFHTTPRequestOperation * _Nonnull operation, id _Nonnull responseObject) { 
     NSLog(@"HTTP Request URL: %@", [operation.request URL]); 
     NSLog(@"HTTP Response Status Code: %ld", [operation.response statusCode]); 
     NSLog(@"HTTP Response Body: %@", responseObject); 
    } failure:^(AFHTTPRequestOperation * _Nullable operation, NSError * _Nonnull error) { 
     NSLog(@"HTTP Request failed: %@", error); 
    }]; 

Oto odpowiedź otrzymuję:

2015-11-17 16:53:36.476 XXXXXX[85280:5969811] HTTP Response Status Code: 200 
2015-11-17 16:53:36.476 XXXXXX[85280:5969811] HTTP Response Body: (null) 
+0

Have próbowałeś wysłać identyczne żądanie poza aplikacją? Spróbuj użyć narzędzia zewnętrznego (np. Https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop?hl=en), aby sprawdzić, czy oczekiwany obiekt rzeczywiście znajduje się w odpowiedzi. – kajot

Odpowiedz

5

Postaraj się integrować AFNetworking najnowsza wersja 2.0, jak kierować here & nie zapomnij o dodaniu pliku AFSecurityPolicy.h, AFSecurityPolicy.m. Spowoduje to obsługę żądań https:.

4

Nie należy najpierw serializować żądania, a następnie dodawać nowe nagłówki. Nagłówki nie znajdą się w (serializacji) żądania w ten sposób. Prawdopodobnie dobrze, jeśli to odwrócisz.

+0

Zaktualizowałem kod do tego, co powiedziałeś, że dostarczyłem go w oryginalnym pytaniu, ale wciąż nie otrzymuję odpowiedzi – Prad

6

Używam jednej wspólnej metody dla AFNetworking WS Calling. Zastosowania:

połączeń WS:

NSDictionary* param = @{ 
         @"action":@"helloWorld", 
         @"query":@"{\"name\":\"john\"}" 
         }; 

[self requestWithUrlString:@"URL" parmeters:paramDictionary success:^(NSDictionary *response) { 
    //code For Success 
} failure:^(NSError *error) { 
    // code for WS Responce failure 
}]; 

dodać dwie metody: te dwie metody są powszechne, można wykorzystać te wspólne metody w całym projekcie przy użyciu klasę NSObject. również dodać // określić kod błędu jak ...

określić kDefaultErrorCode 12345

- (void)requestWithUrlString:(NSString *)stUrl parmeters:(NSDictionary *)parameters success:(void (^)(NSDictionary *response))success failure:(void (^)(NSError *error))failure { 

[self requestWithUrl:stUrl parmeters:parameters success:^(NSDictionary *response) { 
    if([[response objectForKey:@"success"] boolValue]) { 
     if(success) { 
      success(response); 

     } 
    } 
    else { 
     NSError *error = [NSError errorWithDomain:@"Error" code:kDefaultErrorCode userInfo:@{NSLocalizedDescriptionKey:[response objectForKey:@"message"]}]; 
     if(failure) { 
      failure(error); 
     } 
    } 
} failure:^(NSError *error) { 
    if(failure) { 
     failure(error); 
    } 
}];} 

i // ustaw Nagłówki w poniższej metodzie (jeśli jest wymagane inaczej usuń)

- (void)requestWithUrl:(NSString *)stUrl parmeters:(NSDictionary *)parameters success:(void (^)(NSDictionary *response))success failure:(void (^)(NSError *))failure { 

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 
[manager setResponseSerializer:[AFHTTPResponseSerializer serializer]]; 


[manager.requestSerializer setValue:@"WWSE profile=\"UsernameToken\"" forHTTPHeaderField:@"Authorization"]; 



[manager GET:stUrl parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) { 
    if([responseObject isKindOfClass:[NSDictionary class]]) { 
     if(success) { 
      success(responseObject); 
     } 
    } 
    else { 
     NSDictionary *response = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingAllowFragments error:nil]; 
     if(success) { 
      success(response); 
     } 
    } 
} failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
    NSLog(@"Error: %@", error); 
    if(failure) { 
     failure(error); 
    } 
}];} 

Dla wszelkie problemy i więcej szczegółów please visit AFNetworking


UPDATE
---------- migracji z AFNetworking 3,0 --------- migracji AFN-2.0 do 3.0 z niewielkimi zmianami zadowolić chaeck here AFN 3.0

+0

Kiedy wykonuję te żądania, to są błędy, które otrzymuję ten błąd. '' Przerwanie aplikacji z powodu niezamkniętego wyjątku 'NSInvalidArgumentException' , powód: "*** - [__ NSPlaceholderDictionary initWithObjects: forKeys: count:]: próba wstawienia obiektu zerowego z obiektów [0]" '' ' – Prad

+0

okej, spróbuj tego Ws w kliencie Plakat lub Odpoczynek. Odpowiedzialność jest właściwa lub nie. Odpowiadam, że zawierają elementy HTMl. proszę sprawdź i odpowiedz mi. – Vvk

+0

Testowałem, Nie ma żadnej odpowiedzi ustalonej od strony WW. proszę dodać Sukces i porażkę, takie jak {"sukces": 1} lub {"sukces": 0} – Vvk