2012-02-27 22 views
7

我想在iOS中使用NSURLConnection使http表單發佈。我在HTML表單中有兩個表單域和一個文件上傳選項。當我使用NSURLConnection做同樣的事情時,我沒有得到迴應。在iOS中使用NSURLConnection的表單數據請求

NSString *urlString = @"http://url/test.php"; 
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; 
[request setURL:[NSURL URLWithString:urlString]]; 
[request setHTTPMethod:@"POST"]; 

NSString *contentType = [NSString stringWithFormat:@"multipart/form-data"]; 
[request addValue:contentType forHTTPHeaderField: @"Content-Type"]; 

NSMutableData *body = [NSMutableData data]; 
[body appendData:[[NSString stringWithString:@"Content-Disposition: form-data; name=\"file\"; filename=\"myphoto.png\"rn"] dataUsingEncoding:NSUTF8StringEncoding]]; 
[body appendData:[[NSString stringWithString:@"Content-Type: application/octet-streamrnrn"] dataUsingEncoding:NSUTF8StringEncoding]]; 
[body appendData:filedata]; 
[body appendData:[[NSString stringWithFormat:@"&s=YL4e6ouKirNDgCk0xV2HKixt&hw=141246514ytdjadh"] dataUsingEncoding:NSUTF8StringEncoding]]; 
[request setHTTPBody:body]; 

NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; 
NSString *returnString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding]; 
NSLog(@"RETURNED:%@",returnString); 

但是當我使用ASIHTTPRequest,寫了下面的代碼它的工作,我得到響應。

ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:[NSURL URLWithString:@"http://url/test.php"]]; 
[request setPostValue:@"YL4e6ouKirNDgCk0xV2HKixt&hw" forKey:@"ssf"]; 
[request setPostValue:@"141246514ytdjadh" forKey:@"sds"]; 
[request setData:filedata withFileName:@"myphoto.png" andContentType:@"image/jpeg" forKey:@"file"]; 
[request startSynchronous]; 

NSError *error = [request error]; 
if (!error) { 
    NSString *response = [request responseString]; 
    NSLog(@"response:%@",response); 
} 

有誰能告訴我我做錯了NSURLConnection部分?

+0

@dbrajkovic你可以建議我,如果我做錯什麼 – NSCry 2012-02-27 10:14:02

回答

13

您並未複製該鏈接的示例。在該教程中,HTTPBody參數應該是NSData的一個實例,而不是NSString。

[request setHTTPMethod:@"POST"]; 
NSString *myString = [NSString stringWithFormat:@"value1=test3&value2=test"]; 
[request setHTTPBody:[myString dataUsingEncoding:NSUTF8StringEncoding]]; 
+0

其實我在堆棧寫作時已經做了錯誤,我編輯它 – NSCry 2012-02-27 06:50:06

+0

你看過服務器日誌嗎? – dbrajkovic 2012-02-27 06:51:24

+0

我沒有訪問該 – NSCry 2012-02-27 06:52:31

1

試試這個....

NSURL *url = [NSURL URLWithString:@"URL"]; 
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; 

[request setHTTPMethod:@"POST"]; 


NSString *myRequestString [email protected]"Request string"; 
NSLog(@"%@",myRequestString); 
NSData *myRequestData = [ NSData dataWithBytes: [ myRequestString UTF8String ] length: [ myRequestString length ] ]; 

[ request setHTTPBody: myRequestData ]; 

NSURLResponse *response; 
NSError *err; 
NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&err]; 
NSString *content = [NSString stringWithUTF8String:[responseData bytes]]; 
+0

我想我已經做了同樣的事情。可以告訴我代碼中的差異。 – NSCry 2012-02-27 11:35:05

8

我想這個代碼上傳的圖像和其工作。增加了邊界。

NSString *urlString = @"URL"; 

NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease]; 
[request setURL:[NSURL URLWithString:urlString]]; 
[request setHTTPMethod:@"POST"]; 

NSString *boundary = @"---------------------------14737809831466499882746641449"; 
NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary]; 
[request addValue:contentType forHTTPHeaderField:@"Content-Type"]; 

NSMutableData *body = [NSMutableData data]; 
[body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
[body appendData:[@"Content-Disposition: form-data; name=\"userfile\"; filename=\"Test.png\"\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 
[body appendData:[@"Content-Type: application/octet-stream\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 
[body appendData:[NSData dataWithData:imageData]]; 
[body appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
[request setHTTPBody:body]; 

NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; 
NSString *returnString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding]; 
2

這對我來說工作得很好。

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    NSMutableURLRequest *req=[[NSMutableURLRequest alloc]initWithURL:[NSURL URLWithString:@"http:///URL/iinsert.php"]]; 

    NSString *[email protected]"name=abhii&address=knrr"; 
    NSData *myreqdata=[NSData dataWithBytes:[myreqstr UTF8String] length:[myreqstr length]]; 
    [req setHTTPMethod:@"POST"]; 

    [ req setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"content-type"]; 
    [ req setHTTPBody: myreqdata ]; 

    //[req setValue:@"abhii" forHTTPHeaderField:@"name"]; 
    //[req setValue:@"kar" forHTTPHeaderField:@"address"]; 
    NSData *data=[NSURLConnection sendSynchronousRequest:req returningResponse:nil error:nil]; 
    NSLog(@"%@",data); 
    NSString *returnstring=[[NSString alloc]initWithData:data encoding:NSASCIIStringEncoding]; 
    NSLog(@"%@",returnstring); 




    // Do any additional setup after loading the view, typically from a nib. 
} 
0

您的字符串末尾幾個

rn 

。他們都應該是

\r\n 

更準確地說它應該是:

[body appendData:[[NSString stringWithString:@"Content-Disposition: form-data; name=\"file\"; filename=\"myphoto.png\"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; 
[body appendData:[[NSString stringWithString:@"Content-Type: application/octet-stream\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; 
相關問題