2011-01-26 3 views
81

Je dois définir l'en-tête HTTP pour une demande. Dans la documentation de la classe NSURLRequest, je n'ai rien trouvé concernant l'en-tête HTTP. Comment puis-je définir l'en-tête HTTP pour contenir des données personnalisées?NSURLRequest définissant l'en-tête HTTP

Répondre

169

Vous devez utiliser un NSMutableURLRequest

NSMutableURLRequest* request = [[[NSMutableURLRequest alloc] initWithURL:url] 
           autorelease]; 

[request setValue:VALUE forHTTPHeaderField:@"Field You Want To Set"]; 

ou pour ajouter un en-tête:

[request addValue:VALUE forHTTPHeaderField:@"Field You Want To Set"]; 
+1

Juste ce que je cherchais !! Bravo à toi !! –

+1

Y a-t-il une API pour ajouter un dictionnaire d'en-têtes? –

+1

Excellente réponse! Je voulais souligner que RamS [réponse] (http://stackoverflow.com/a/20760445/1778488) a une belle documentation. – fskirschbaum

6
NSMutableURLRequest *request=[NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:60]; 

[request setHTTPMethod:@"POST"]; 
[request setValue:postLength forHTTPHeaderField:@"Content-Length"]; 
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; 
[request setValue:@"your value" forHTTPHeaderField:@"for key"];//change this according to your need. 
[request setHTTPBody:postData]; 
+2

Vous devriez probablement ajouter quelques explications pour le code que vous avez posté. – MasterAM

+0

Que signifie setValue: @ "application/x-www-form-urlencoded" signifie, est-ce sth custom? –

+0

En cas de prise en charge limitée de POST dans le logiciel client HTTP où les données pures ne peuvent pas être soumises dans le corps du message HTTP, RESTfm peut gérer les données codées dans l'une des applications/x-www-form-urlencoded ou multipart/form-data formats. Remarque: Les formats application/x-www-form-urlencoded et multipart/form-data s'appliquent uniquement à la méthode HTTP POST Remarque 2: ce format utilise le même schéma de "codage d'URL" que celui requis pour la chaîne de requête GET paramètres tels que décrits ici. Avantages Prise en charge d'une taille de données plus importante que ce qui est possible à l'aide d'une chaîne de requête GET. –

0

Vous pouvez ajouter de la valeur dans NSMutableURLRequest pour champ_en-tête:

NSMutableURLRequest* request = [[NSMutableURLRequest alloc] initWithURL:url]; 

[request setValue:VALUE forHTTPHeaderField:@"cookie"]; 

Cela fonctionne pour moi.

10

pour Swift

let url: NSURL = NSURL(string: APIBaseURL + "&login=1951&pass=1234")! 
var params = ["login":"1951", "pass":"1234"] 
request = NSMutableURLRequest(URL:url) 
request.HTTPMethod = "POST" 
var err: NSError? 
request.HTTPBody = NSJSONSerialization.dataWithJSONObject(params, options: nil, error: &err) 
request.addValue("application/json", forHTTPHeaderField: "Content-Type") 
request.addValue("application/json", forHTTPHeaderField: "Accept") 
+0

J'utilise le même type de code pour faire une demande, mais il retourne ** nil ** données. J'ai essayé de voir ce qui ne va pas et la seule chose que j'ai pu trouver était que la valeur de réponse revenant a une valeur différente pour "Content-Type" par opposition à ce que j'essaie d'ajouter au début du code. 'request.setValue (" Une certaine valeur ", forHTTPHeaderField:" Content-Type ")' est-ce que cela fonctionne pour vous? – Sashi

+0

essayez cet en-tête request.addValue ("text/html", forHTTPHeaderField: "Content-Type") –

+0

J'ai essayé cela aussi, mais cela n'a pas fonctionné. Enfin en utilisant myParameters.dataUsingEncoding travaillé pour moi, j'utilisais quelque chose d'autre c'est la raison pour laquelle je pense que ça ne fonctionnait pas. Merci pour l'aide. – Sashi

0

Exemple de code

- (void)reqUserBalance:(NSString*)reward_scheme_id id:(NSString*)user_id success:(void (^)(id responseObject))success failure:(void (^)(id responseObject))failure{ 

    NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@reward/%@/user/%@/balance",URL_SERVER,reward_scheme_id,user_id]]; 
    NSLog(@"%@",url); 
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url]; 

    [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; 
    [request setValue:@"true" forHTTPHeaderField:@"Bypass"]; 

    [NSURLConnection sendAsynchronousRequest:request 
             queue:[NSOperationQueue mainQueue] 
          completionHandler:^(NSURLResponse *response, 
               NSData *data, NSError *connectionError) 
    { 
         options:kNilOptions error:NULL]; 

     if (data.length > 0 && connectionError == nil) 
     { 
      NSDictionary * userPoints = [NSJSONSerialization JSONObjectWithData:data 
                     options:0 
                     error:NULL]; 

      NSString * points = [[userPoints objectForKey:@"points"] stringValue]; 
      NSLog(@"%@",points); 
      [SecuritySetting sharedInstance].usearAvailablePoints = points; 


     } 
    }]; 

} 
1

Je sais que tard, mais peut aider les autres, pour SWIFT 3,0

let url = NSURL(string: "http://www.yourwebsite.com") 
    let mutAbleRequest = NSMutableURLRequest(URL: url!) 
    mutAbleRequest.setValue("YOUR_HEADER_VALUE", forHTTPHeaderField:"YOUR_HEADER_NAME") 
    myWebView.loadRequest(mutAbleRequest)