POST отправки iPhone с NSURLConnection

У меня есть некоторые проблемы с передающими данными POST к Сценарию PHP с NSURLConnection. Это - мой код:

    const char *bytes = [[NSString stringWithFormat:@"<?xml version=\"1.0\"?>\n<mydata>%@</mydata>", data] UTF8String];

    NSURL *url = [NSURL URLWithString:@"http://myurl.com/script.php"];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

    [request setHTTPMethod:@"POST"];
    [request setHTTPBody:[NSData dataWithBytes:bytes length:strlen(bytes)]];

    NSURLResponse *response;
    NSError *err;
    NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&err];
    NSLog(@"responseData: %@", responseData);

И мой script.php так прост:

<?php
    echo $_POST['mydata'];
?>

Это работало на меня в прошлом, но по некоторым причинам вывод я добираюсь от NSLog(@"responseData: %@", responseData); теперь просто" <>" вместо "theData".

Вероятно, некоторый Ламе путает где-нибудь, но я, может казаться, не нахожу его? Какие-либо идеи?

21
задан per_pilot 15 January 2010 в 13:27
поделиться

2 ответа

Ваши данные неверны. Если вы ожидаете, что данные будут найдены в массиве PHP $ _Post из PHP, он должен выглядеть следующим образом:

const char *bytes = "mydata=Hello%20World";

Если вы хотите отправить данные XML, вам нужно установить другой тип содержимого HTTP. Например. Вы можете установить

application/xml; charset=utf-8

, если вы не установите тип содержимого HTTP, тип по умолчанию

application/x-www-form-urlencoded

будет использоваться. И этот тип ожидает, что данные поступлений имеют тот же формат, что и в получении запроса.

Однако, если вы устанавливаете другой тип содержимого HTTP, например приложение / XML, то эти данные не добавляются в массив $ _Post в PHP. Вам придется прочитать сырой от входного потока.

Попробуйте это:

NSString * str = [NSString stringWithFormat:@"<?xml version=\"1.0\"?>\n<mydata>%@</mydata>", data];
[request setHTTPMethod:@"POST"];
[request setValue:@"application/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
[request setHTTPBody:[str dataUsingEncoding:NSUTF8StringEncoding]];

и на сервере попробуйте следующий PHP:

$handle = fopen("php://input", "rb");
$http_raw_post_data = '';
while (!feof($handle)) {
    $http_raw_post_data .= fread($handle, 8192);
}
fclose($handle);

Обратите внимание, что это работает только, если заголовок HTTP работает не приложение / X-www-form-urlencoded. Если он является приложением / X-WWW-формой-орленкадированным, тогда PHP сам чтение всех данных, декодирует его (разделение его в пары клавиш / значение) и, наконец, добавляет его к массиву $ _Post.

39
ответ дан 29 November 2019 в 06:42
поделиться

Почтовые данные и данные XML не одинаковы. Вы можете отправить данные XML так, как вы сделали, но код PHP должен проанализировать XML из корпуса запроса. XML_PARSE ( http://php.net/manual/en/function.xml-parse.php ) может помочь вам сделать это.

В качестве альтернативы, если вы предпочитаете отправлять данные пост, установите тело запроса, как это:

Const Char * Bytes = [[NSString StringWithFormat: @ mydata =% @ ", data] utf8string];

2
ответ дан 29 November 2019 в 06:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: