Я пытаюсь отправить POST-запрос, содержащий аудиофайл и некоторые другие данные, используя приведенный ниже код. Сервер закодирован на PHP, и, хотя запрос отправлен, и с сервером связываются, кажется, что нет доступных данных POST. Код ниже просто берет аудио файл и 2 другие строки cubeid
а также request_type
и отправляет их как переменные POST.
// Create the request.
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@smartcube.php",[SMCGlobal apiURL]]]];
[request setHTTPMethod:@"POST"];
[request setValue:@"application/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
// Create url connection and fire request
NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request delegate:self];NSMutableData *body = [NSMutableData data];NSString *boundary = @"---------------------------14737809831466499882746641449";
NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary];
[request addValue:contentType forHTTPHeaderField:@"Content-Type"];
// file
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *plistPath = [documentsDirectory stringByAppendingPathComponent:@"track.m4a"];
NSURL* soundURL = [NSURL URLWithString:plistPath];
NSData *soundData = [NSData dataWithContentsOfURL:soundURL];
[body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[@"Content-Disposition: form-data; name=\"file\"; filename=\"track.m4a\"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[@"Content-Type: audio/m4a\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[NSData dataWithData:soundData]];
[body appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
// Text parameter1
NSDictionary* dic = [SMCGlobal returnUser];
NSString *param1 = @"dhshahds";
[body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"cubeid\"\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithString:param1] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"request_type\"\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithString:@"sendSpeech"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];// close form
[body appendData:[[NSString stringWithFormat:@"--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
// set request body
[request setHTTPBody:body];
//return and test
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse* response, NSData* data, NSError *connectionError){
NSLog(@"hehe");
NSString* newStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
if(connectionError){
NSLog([connectionError localizedDescription]);
}else{
NSError *error;
NSDictionary* dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&error];
if(error){
NSLog([error localizedDescription]);
}
NSLog(@"haha");
}
}];
Когда я пытаюсь error_log(json_encode($_POST))
на сервере он возвращает пустую строку.
Пара наблюдений:
Этот код отправляет два запроса: один XML-запрос (без тела XML; lol) и один многокомпонентный запрос. И вы переходите к изменению исходного запроса, который будет использоваться во втором запросе. Это не похоже, что это может быть правильно.
Я полагаю, вы должны устранить Content-Type
из application/xml
линия, а также начало conn
подключение.
Я бы посоветовал против границы, которая сама по себе имеет несколько ведущих дефисов. Это не проблема, но просто очень трудно интерпретировать, если вы наблюдаете необработанный запрос в таком инструменте, как Чарльз потому что не сразу очевидно, какие дефисы являются частью синтаксиса составного разделителя, а какие — частью границы.
Лично я бы использовал [[NSUUID UUID] UUIDString]
для моей границы.
Как предполагает Уэйн, я бы проверил это в Чарльз и посмотрим, выглядит ли запрос там правильно.
Других решений пока нет …