Как отправить несколько параметров на сервер PHP в сообщении HTTP
Я посылаю строку base64 на сервер php, и она работает хорошо. Теперь я хочу отправить другой параметр в виде строки. Может кто-нибудь сказать мне, какой код нужно добавить в код ниже.
Ниже код работает хорошо для одного параметра. Как мы можем изменить его для нескольких параметров?
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
2 ответа
Для работы в сети они лучше поддерживают API, такие как 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
"params", чьи ключи и значения являются строками и где каждая запись представляет один параметр (имя / значение), вы можете определить категорию помощника:
@interface NSDictionary (FormURLEncoded)
-(NSData*) dataFormURLEncoded;
@end
dataFormURLEncoded
возвращает правильно закодированную последовательность символов из заданных параметров в словаре.
Алгоритм кодирования указывается в w3c: данные формы в кодировке URL / Приложение / алгоритм кодирования x-www-form-urlencoded
Это может быть реализовано следующим образом:
Сначала вспомогательная функция, которая кодирует имя параметра, соответственно значение параметра:
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.
Пример:
Учитывая ваши параметры:
NSDictionary* params = @{@"a": @"a a", @"b": @"b+b", @"c": @"ü ö"};
NSData* encodedParamData = [params dataFormURLEncoded];
Сейчас, encodedParamData
будет добавлено в ваше тело, чей тип контента application/x-www-form-urlencoded
,
Кодированная строка параметров становится:
а = а + а & B = B%2BB & с =%C3% ВС +%C3%B6