Tuesday, February 28, 2012

Form Data Request using NSURLConnection in IOS


I want to make http form post using NSURLConnection in IOS.I have two form field and one file upload option in html form.When I am doing same thing using NSURLConnection I am not getting response.










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);









But when I am using http://allseeing-i.com/ASIHTTPRequest/How-to-use and write the following code it's working and I am getting response.






ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:[NSURL URLWithString:@"http://url/test.php"]];
[request setPostValue:@"YL4e6ouKirNDgCk0xV2HKixt&hw" forKey:@"s"];
[request setPostValue:@"141246514ytdjadh" forKey:@"hw"];
[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);
}



Can anyone tell me in NSURLConnection part where I am doing wrong.

Thanks in advance

3 comments:

  1. You are not copying the example of that link. In that tutorial, the HTTPBody parameter is supposed to by an instance of NSData, not NSString.

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

    ReplyDelete
  2. Try this ....

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

    [request setHTTPMethod:@"POST"];


    NSString *myRequestString =@"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]];

    ReplyDelete
  3. I tried this code for uploading the image and its working. Added boundry.



    NSString *urlString = @"URL";

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

    NSString *boundary = [NSString stringWithString:@"---------------------------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:[[NSString stringWithString:@"Content-Disposition: form-data; name=\"userfile\"; filename=\"Test.png\"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[[NSString stringWithString:@"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];

    ReplyDelete