如何在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