如何在HTTP POST中将多个参数发送到PHP服务器

我发送base64string到PHP服务器,它的工作正常。 现在我想发送另一个参数作为一个string。 任何人都可以告诉我什么代码需要添加在下面的代码。

下面的代码对单个参数有效。 我们如何修改它的多个参数?

NSData *data = [UIImageJPEGRepresentation(imgeview.image,90) base64Encoding]; // Create your request string with parameter name as defined in PHP file NSString *myRequestString = [NSString stringWithFormat:@"question_image=%@",data]; myRequestString = [myRequestString stringByReplacingOccurrencesOfString: @"+" withString:@"%2B"]; // Create Data from request NSData *myRequestData = [NSData dataWithBytes:[myRequestString UTF8String] length:[myRequestString length]]; request = [[NSMutableURLRequest alloc] initWithURL: [NSURL URLWithString:@"http://192.168.0.101/Mobile_tutor/webservice/question_details.php"]]; // set Request Type [request setHTTPMethod:@"POST"]; // Set content-type [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"content-type"]; // Set Request Body [request setHTTPBody:myRequestData]; // Now send a request and get Response NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error: nil]; // Log Response NSString *response = [[NSString alloc] initWithBytes:[returnData bytes] length:[returnData length] encoding:NSUTF8StringEncoding]; NSLog(@"-------------%@",response); // here you get reasponse string 

对于networking操作来说,这些更好地支持像AFNetworking那样的API,可以使asynchronous和更好的处理

AFNetworking的教程

从这里开始

 NSArray *keys = @[@"UserID", ]; NSArray *objects = @[@(userId)]; NSDictionary *parameter = [NSDictionary dictionaryWithObjects:objects forKeys:keys]; AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL: [NSURL URLWithString:BaseURLString]]; [httpClient setParameterEncoding:AFJSONParameterEncoding]; [httpClient registerHTTPOperationClass:[AFJSONRequestOperation class]]; NSMutableURLRequest *request = [httpClient requestWithMethod:@"POST" path:@"services/UserService.svc/GetUserInfo" parameters:parameter]; AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request]; [httpClient registerHTTPOperationClass:[AFHTTPRequestOperation class]]; [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { NSError* error = nil; id jsonObject = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingAllowFragments error:&error]; if ([jsonObject isKindOfClass:[NSDictionary class]]) { // do what ever } } failure:^(AFHTTPRequestOperation *operation, NSError *error) { }]; 

给定一个NSDictionary “参数”,其键和值是string,并且每个条目代表一个参数(名称/值),您可以定义一个助手类别:

 @interface NSDictionary (FormURLEncoded) -(NSData*) dataFormURLEncoded; @end 

dataFormURLEncoded返回字典中给定参数的正确编码的字符序列。

编码algorithm由w3c指定: URL编码表单数据/ application / x-www-form-urlencoded编码algorithm

它可以执行如下:

首先,一个辅助函数,它分别编码一个参数名称,一个参数值:

 static NSString* x_www_form_urlencoded_HTML5(NSString* s) { // http://www.w3.org/html/wg/drafts/html/CR/forms.html#application/x-www-form-urlencoded-encoding-algorithm , Editor's Draft 24 October 2013 CFStringRef charactersToLeaveUnescaped = CFSTR(" "); CFStringRef legalURLCharactersToBeEscaped = CFSTR("!$&'()+,/:;=?@~"); NSString *result = CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes( kCFAllocatorDefault, (__bridge CFStringRef)s, charactersToLeaveUnescaped, legalURLCharactersToBeEscaped, kCFStringEncodingUTF8)); return [result stringByReplacingOccurrencesOfString:@" " withString:@"+"]; } 

最后, dataFormURLEncoded组成编码参数的字符序列。 一个“参数”将通过连接编码name =和编码value

 parameter := name "=" value 

然后,参数列表将通过用“&”分隔参数来连接参数:

 parameters := parameter ["&" parameter] 

它可以实现如下:

 @implementation NSDictionary (FormURLEncoded) -(NSData*) dataFormURLEncoded { NSMutableData* data = [[NSMutableData alloc] init]; BOOL first = YES; for (NSString* name in self) { @autoreleasepool { if (!first) { [data appendBytes:"&" length:1]; } NSString* value = self[name]; NSData* encodedName = [x_www_form_urlencoded_HTML5(name) dataUsingEncoding:NSUTF8StringEncoding]; NSData* encodedValue = [x_www_form_urlencoded_HTML5(value) dataUsingEncoding:NSUTF8StringEncoding]; [data appendData:encodedName]; [data appendBytes:"=" length:1]; [data appendData:encodedValue]; first = NO; } } return [data copy]; } @end 

注意:字符序列使用Unicode UTF-8编码string。

例:

给你的参数:

 NSDictionary* params = @{@"a": @"aa", @"b": @"b+b", @"c": @"ü ö"}; NSData* encodedParamData = [params dataFormURLEncoded]; 

现在, encodedParamData将被添加到您的内容types为application/x-www-form-urlencoded主体中。

编码的参数string变为:

A = A + a和b = B%2BB&C =%C3%BC +%C3%B6