2014-04-04 16 views
6

vorrei effettuare una chiamata POST che ha sia parametri URL e un corpo JSON:POST con parametri URL e il corpo JSON in AFNetworking

URL http://example.com/register?apikey=mykey 
JSON { "field" : "value"} 

Come posso usare due serializzatori differenti allo stesso tempo con AFNNetworking? Ecco il mio codice con i parametri URL mancanti:

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 
manager.responseSerializer = [AFJSONResponseSerializer serializer]; 
[manager POST:@"http://example.com/register" parameters:json success:^(AFHTTPRequestOperation *operation, id responseObject) { 

risposta

3

Faccio un metodo post

/** 
* Services gateway 
* Method get response from server 
* @parameter    -> object: request josn object ,apiName: api endpoint 
* @returm     -> void 
* @compilationHandler  -> success: status of api, response: respose from server, error: error handling 
*/ 
+ (void)getDataWithObject:(NSDictionary *)object onAPI:(NSString *)apiName withController:(UIViewController*)controller 
         :(void(^)(BOOL success,id response,NSError *error))compilationHandler { 


    controller = controller; 
    [UIApplication sharedApplication].networkActivityIndicatorVisible = YES; 

    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 

    // set request type to json 
    manager.requestSerializer = [AFJSONRequestSerializer serializer]; 
    manager.responseSerializer = [AFHTTPResponseSerializer serializer]; 


    // post request to server 
    [manager POST:apiName parameters:object success:^(AFHTTPRequestOperation *operation, id responseObject) { 

     // NSError *error; 
     NSData *jsonData = [NSJSONSerialization dataWithJSONObject:responseObject 
                  options:0 
                  error:&error]; 

     //NSString *JSONString = [[NSString alloc] initWithBytes:[jsonData bytes] length:[jsonData length] encoding:NSUTF8StringEncoding]; 
     //// 

     // check the status of API 
     NSDictionary *dict = responseObject; 
     NSString *statusOfApi = [[NSString alloc]initWithFormat:@"%@" 
           ,[dict objectForKey:@"OK"]]; 

     // IF Status is OK -> 1 so complete the handler 
     if ([statusOfApi isEqualToString:@"1"]) { 

      [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; 
      compilationHandler(TRUE,responseObject,nil); 

     } else { 

      [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; 

      NSArray *errorMessages = [responseObject objectForKey:@"messages"]; 
      NSString *message = [errorMessages objectAtIndex:0]; 

      [Utilities showAlertViewWithTitle:apiName message:message]; 

      compilationHandler(FALSE,responseObject,nil); 
     } 

    } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 

     NSString *message = [NSString stringWithFormat:@"%@",[error localizedDescription]]; 
     NSLog(@"Message is %@", message); 

     NSString *errorMessage = [NSString stringWithFormat:@"%@",[error localizedDescription]]; 
     if (!([message rangeOfString:@"The request timed out."].location == NSNotFound)) { 
      [Utilities showAlertViewWithTitle:apiName message:errorMessage]; 
     } 

     compilationHandler(FALSE,errorMessage,nil); 
    }]; 

    // For internet reachibility check if changes its state 
    [self checkInternetReachibility:manager]; 
} 

** per esempio quando chiamare il servizio **

// calling service gateway API 
NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithObjectsAndKeys: 
           "field",@"value", 
           nil]; 
     [self getDataWithObject:dict onAPI:KGet_Preferences withController:(UIViewController*)controller :^(BOOL success, id response, NSError *error) { 

      if(success) { 
       NSMutableDictionary *data = [[response valueForKey:@"data"] valueForKey:@"preferences"]; 
       compilationHandler(success,data,error); 
      } else { 
       compilationHandler(success,nil,error); 
      } 
     }]; 
+0

Forse Mi manca qualcosa, ma non vedo come risponde alla domanda. La domanda è su come postare i parametri parzialmente nel corpo della richiesta HTTP e parzialmente nell'URL. Se usiamo 'AFHTTPRequestOperationManager' e 'POST', per impostazione predefinita, tutti i parametri verranno inseriti nel corpo della richiesta da AFNetworking. –

+0

Non risponde alla domanda. Nel tuo metodo usi solo il corpo JSON e non usi i parametri URI. –

0

Credo non ci sia un modo automatico per farlo. Tuttavia, c'è un modo semplice per ottenere manualmente:

- (NSMutableURLRequest *)someRequestWithBaseURL:(NSString *)baseUrl 
              method:(NSString *)method 
              path:(NSString *)path 
             uriParameters:(NSDictionary *)uriParameters 
            bodyParameters:(NSDictionary *)bodyParameters 

NSURL *url = [NSURL URLWithString:path relativeToURL:[NSURL URLWithString:baseUrl]]; 

AFHTTPRequestSerializer *httpRequestSerializer = [AFJSONRequestSerializer serializerWithWritingOptions:0] 

NSMutableDictionary *parameters = [NSMutableDictionary dictionaryWithDictionary:bodyParameters]; 

if ([httpRequestSerializer.HTTPMethodsEncodingParametersInURI containsObject:method]) { 
    [parameters addEntriesFromDictionary:uriParameters]; 
} else { 
    NSURLComponents *urlComponents = [NSURLComponents componentsWithURL:url resolvingAgainstBaseURL:YES]; 
    // For urlEncodedString, check http://stackoverflow.com/a/718480/856549 
    urlComponents.percentEncodedQuery = [uriParameters urlEncodedString]; 
    url = [urlComponents URL]; 
} 

NSError *error; 
NSURLRequest *request = [httpRequestSerializer requestWithMethod:method 
                 URLString:[url absoluteString] 
                 parameters:parameters 
                  error:&error]; 
Problemi correlati