/ / NSURLRequest nemôže spracovať telo HTTP, keď metóda nie je POST? - iphone, kakao, nsurlrequest

NSURLRequest nemôže spracovať telo HTTP, keď metóda nie je POST? - iphone, kakao, nsurlrequest

Kedykoľvek som nastavil telo na meniteľnú žiadosť pomocoumetóda nastavená na čokoľvek iné ako POST, telo nie je zahrnuté v žiadosti a pri odpovedi servera sa mi zobrazí chyba 303 kCFErrorDomainCFNetwork (kCFErrorHTTPParseFailure). Všetko, čo potrebujete na vykonanie požiadavky, je zmena metódy na POST. Existuje nejaký spôsob, ako pripojiť telo k iným metódam, alebo sme pri všetkom uviaznutí v teste POST?

Toto je kód na odoslanie:

NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:assembleURL]];// cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData timeoutInterval:45.0];

#if (SERVER_TARGET_ARGS_ALLOWED==1)
[req setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[req setValue:@"application/json" forHTTPHeaderField:@"Accept"];

[req setHTTPMethod:ServerMessageMethods[operation]];    //value is @"POST" or other method name

#endif

//run the payload into a JSON
SBJsonWriter *json = [[SBJsonWriter alloc] init];
NSString *encodedPayload = [json stringWithObject:payload];
encodedPayload = [NSString stringWithFormat:@"%@", [encodedPayload stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
NSData *dataPayload = [encodedPayload dataUsingEncoding:NSUTF8StringEncoding];
[req setHTTPBody:dataPayload];

NSURLConnection *conn = [NSURLConnection connectionWithRequest:req delegate:self];

odpovede:

14 pre odpoveď č. 1

Snažil som sa nájsť o tom novšie informácie, ale bol tu starý príspevok o presnom probléme, o ktorom ste hovorili: http://lists.apple.com/archives/cocoa-dev/2004/May/msg01847.html

V zásade spomínajú, že ide o chybu v kóde. Bohužiaľ som si prial, aby som našiel niečo novšie, čo to potvrdzuje.

Kód, ktorý používam, je ASIHTTPRequest a určite dokáže PUT požiadavky, pretože na vytvorenie správ HTTP používajú sadu kódov na nižšej úrovni a nespoliehajú sa na NSMutableUrlRequest.

Našiel som tiež ďalší blogový príspevok, ktorý hovorí o probléme a o tom, čo musíte uviesť pre požiadavku PUT. http://iphonedevelopment.blogspot.com/2008/06/http-put-and-nsmutableurlrequest.html

príspevok v blogu:

Keď používate NSMutableURLRequest na vykonanie požiadavky HTTP PUT, pridajte nasledujúci riadok kódu (req je NSMutableURLRequest):

[req setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];

To je všetko. Ak pridáte tento riadok kódu, vaše požiadavky PUT budú fungovať dobre.


0 pre odpoveď č. 2

Pamätáte si, že ste nastavili Content-Length/Transfer-Encoding a Content-Type hlavičky? Nemyslím si to Content-Length sa automaticky vkladá za vás, čo znamená, že server bude predpokladať, že je "0".

Viac informácií: http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html


-1 pre odpoveď č. 3

tu je

+(NSString*)simpleCurl:(NSString*)urlStr withBody:(NSString*)post{

//    NSLog(urlStr);
NSURL *url = [NSURL URLWithString:[urlStr stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding]];
//    NSLog([url description]);
NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:url];
[req setHTTPMethod:@"POST"];
[req setValue:@"close" forHTTPHeaderField:@"Connection"];
[req setValue:@"utf-8;q=0.7,*;q=0.7" forHTTPHeaderField:@"Accept-Charset"];
[req setValue:@"gzip,deflate" forHTTPHeaderField:@"Accept-Encoding"];
[req setValue:@"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)" forHTTPHeaderField:@"User-Agent"];
[req setValue:@"Application/Json, text/html, application/xhtml+xml, */*" forHTTPHeaderField:@"Accept"];
[req setHTTPMethod:@"POST"];//  or PUT
NSString *postString = post;
[req setHTTPBody:[postString dataUsingEncoding:NSUTF8StringEncoding]];

NSData *res = [NSURLConnection  sendSynchronousRequest:req returningResponse:NULL error:NULL];
NSString* html=[[NSString alloc] initWithData:res encoding:NSUTF8StringEncoding];
return html;

}