2015-03-19 5 views
0

Я пытаюсь отправить запрос POST, содержащий аудиофайл и некоторые другие данные, используя следующий код. Сервер закодирован в PHP, и хотя запрос отправляется, и с сервером связывается, кажется, что нет доступных данных POST. Код ниже просто принимает звуковой файл, и 2 другие строки называются cubeid и request_type и отправляет их в качестве переменных POST .:iOS NSURLRequest 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)) на сервере он возвращает пустую строку.

+1

Проведена ли какая-либо отладка? Создается ли soundURL и загружаются данные? Использовал charles, чтобы узнать, что отправлено? – Wain

+0

Я прокомментировал код для файла, и сервер по-прежнему не получает никаких сообщений ... Не уверен, что вы подразумеваете под «используемым charles, чтобы увидеть, что отправлено?» хоть. –

+0

http://www.charlesproxy.com – Wain

ответ

0

Несколько наблюдений:

  1. Этот код посылает два запроса, один запрос XML (без тела XML, лол) и один многослойную запрос. И вы продолжаете мутировать исходный запрос, который будет использоваться во втором запросе. Это не похоже, что это может быть правильно.

    Предполагаю, что вы должны устранить Content-Type линии application/xml, а также начать соединение conn.

  2. Я бы посоветовал нести границу, которая сама имеет кучу ведущих дефисов. Это не проблема, но это просто очень сложно интерпретировать, если вы наблюдаете необработанный запрос в таком инструменте, как Charles, потому что сразу не видно, какие дефисы являются частью синтаксиса множественного разделителя и которые являются частью границы.

    Лично я бы использовал [[NSUUID UUID] UUIDString] для моей границы.

  3. Как предлагает Wain, я бы осмотрел его в Charles и посмотрел, выглядит ли запрос правильно.

+0

Вот и все! Огромное спасибо. Полностью упустила строку application/xml. Также внесено изменение в отношении границы. –

Смежные вопросы