Использование POST для .php

EDIT. Я редактировал OP со всеми предложениями, которые я получил от людей, поэтому это последнее (и его все еще не работает).


У меня есть следующий код, который должен POST некоторые данные в .php файл, который у меня есть (а затем в базу данных, но это выходит за рамки этого вопроса).

В мой метод передаю массив, содержащий некоторые строки.

-(void)JSON:(NSArray *)arrayData {

    //parse out the json data
    NSError *error;

    //convert array object to data
    NSData* JSONData = [NSJSONSerialization dataWithJSONObject:arrayData 
                                                       options:NSJSONWritingPrettyPrinted 
                                                         error:&error];

    NSString *JSONString = [[NSString alloc] initWithData:JSONData 
                                                 encoding:NSUTF8StringEncoding];


    NSString *URLString = [NSString stringWithFormat:@"websitename"];

    NSURL *URL = [NSURL URLWithString:URLString];

    NSLog(@"URL: %@", URL);


    NSMutableURLRequest *URLRequest = [NSMutableURLRequest requestWithURL:URL 
                                                              cachePolicy:NSURLRequestUseProtocolCachePolicy 
                                                          timeoutInterval:60.0];

    NSData *requestData = [NSData dataWithBytes:[JSONString UTF8String] length:[JSONString length]];

    NSString *requestDataString = [[NSString alloc] initWithData:requestData 
                                                        encoding:NSUTF8StringEncoding];
    NSLog(@"requestData: %@", requestDataString);

    [URLRequest setHTTPMethod:@"POST"];
    NSLog(@"method: %@", URLRequest.HTTPMethod);
    [URLRequest setValue:@"application/json" forHTTPHeaderField:@"Accept"];
    [URLRequest setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    [URLRequest setValue:[NSString stringWithFormat:@"%d", [requestData length]] forHTTPHeaderField:@"Content-Length"];
    [URLRequest setHTTPBody: requestData];

    NSURLConnection *connection = [[NSURLConnection alloc]initWithRequest:URLRequest delegate:self];

    if (connection) {
        NSMutableData *receivedData = [[NSMutableData data] retain];
        NSString *receivedDataString = [[NSString alloc] initWithData:receivedData 
                                                             encoding:NSUTF8StringEncoding];
        NSLog(@"receivedData: %@", receivedDataString);
    }

    //potential response
    NSData *response = [NSURLConnection sendSynchronousRequest:URLRequest returningResponse:nil error:nil];

    //convert response so that it can be LOG'd
    NSString *returnString = [[NSString alloc] initWithData:response encoding:NSASCIIStringEncoding];

    NSLog(@"RETURN STRING: %@", returnString);
}

ПРИМЕЧАНИЕ. У меня есть фактический URL моего сайта в коде, чтобы каждый мог проверить, хотят ли они.


Тогда есть сторона .php вещей, где все, что я пытаюсь сделать, это искать любой вход вообще (но я ничего не получаю).

<html>
        <body>
        <?php

        echo "Connection from iOS app to MySQL database<BR>";

        echo '<pre>'.print_r($GLOBALS,true).'</pre>';



        ?>
        </body>
</html>

Все, что я действительно пытаюсь сделать прямо сейчас, - это подтверждение того, что данные проходят через, повторяя его на странице, а затем просматривая страницу из моего приложения (пока данные не показываются).


Выходной файл .php:

 <html>
        <body>
        Connection from iOS app to MySQL database<BR>'Array
(
)
'<pre>Array
(
    [_GET] => Array
        (
        )

    [_POST] => Array
        (
        )

    [_COOKIE] => Array
        (
        )

    [_FILES] => Array
        (
        )

    [GLOBALS] => Array
 *RECURSION*
)
</pre>        </body>
</html>

Ответ 1

Я понятия не имею о Objective-C, при условии, что вы пытаетесь отправить следующие данные JSON (т.е. JSONString является следующим):

{
    "firstName": "John",
    "lastName": "Smith",
    "age": 25,
    "address": {
        "streetAddress": "21 2nd Street",
        "city": "New York",
        "state": "NY",
        "postalCode": "10021"
    },
    "phoneNumber": [
        {
            "type": "home",
            "number": "212 555-1234"
        },
        {
            "type": "fax",
            "number": "646 555-4567"
        }
    ]
}

тогда ваш запрос должен выглядеть примерно так:

POST /yourwebsite.php HTTP/1.1
Host: cs.dal.ca
User-Agent: USER-AGENT
Accept: text/html,application/json,*/*
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 624

data=%7B%0A++++%22firstName%22%3A+%22John%22%2C%0A++++%22lastName%22%3A+%22Smith%22%2C%0A++++%22age%22%3A+25%2C%0A++++%22address%22%3A+%7B%0A++++++++%22streetAddress%22%3A+%2221+2nd+Street%22%2C%0A++++++++%22city%22%3A+%22New+York%22%2C%0A++++++++%22state%22%3A+%22NY%22%2C%0A++++++++%22postalCode%22%3A+%2210021%22%0A++++%7D%2C%0A++++%22phoneNumber%22%3A+%5B%0A++++++++%7B%0A++++++++++++%22type%22%3A+%22home%22%2C%0A++++++++++++%22number%22%3A+%22212+555-1234%22%0A++++++++%7D%2C%0A++++++++%7B%0A++++++++++++%22type%22%3A+%22fax%22%2C%0A++++++++++++%22number%22%3A+%22646+555-4567%22%0A++++++++%7D%0A++++%5D%0A%7D%0A%0A%0A

обратите внимание, что Content-Type: application/json НЕ способ публикации данных, как вы уже использовали, и обратите внимание, что данные были ур-кодированы, это не должно быть сложно, я нашел эту ссылку о том, чтобы делать поэтому в Objective-C: URLEncoding строка с Objective-C

Отправляя запрос выше, я получил следующее:

php code:

<?php
$raw_json_data = $_POST['data'];
$json_data = json_decode($raw_json_data);
print_r($json_data);

результат:

stdClass Object
(
    [firstName] => John
    [lastName] => Smith
    [age] => 25
    [address] => stdClass Object
        (
            [streetAddress] => 21 2nd Street
            [city] => New York
            [state] => NY
            [postalCode] => 10021
        )

    [phoneNumber] => Array
        (
            [0] => stdClass Object
                (
                    [type] => home
                    [number] => 212 555-1234
                )

            [1] => stdClass Object
                (
                    [type] => fax
                    [number] => 646 555-4567
                )

        )

)

что вам нужно!

ПРИМЕЧАНИЕ. Я должен упомянуть, что ваш script в http://yourwebsite.php работает неправильно, я не мог даже представить нормальную форму! Возможно, возникла проблема с неправильной конфигурацией сервера или чем-то подобным, но с использованием Apache 2.2 и PHP 5.4.4 и кодов, упомянутых выше, я получил его работу!

Ответ 2

Вы используете POSTING JSON вместо application/x-www-form-urlencoded.

PHP $_POST заполняется только для application/x-www-form-urlencoded -requests. Если вы отправляете json прямо так, то вам следует:

<?php
$posted_json = json_decode(file_get_contents("php://input"));
print_r($posted_json);

Обратите внимание, что если json недействителен, это не сработает. Вы всегда можете отлаживать тело запроса с помощью:

<?php
echo file_get_contents("php://input");

Здесь общее описание $_POST и $_GET http://www.php.net/manual/en/language.variables.external.php:

Они предназначены для использования с нормальными форматами html, хотя вы можете легко эмулировать такие запросы с соответствующим заголовком кодировки и заголовком содержимого. Но они не будут работать с JSON, так как не работают нормальные html-формы.

Ответ 3

Вы принимаете поле HTTP-заголовка, установленное на application/json. так что это тип содержимого. Возможно, вам захочется проверить, действительно ли данные, переданные между браузером и сервером, являются json. Вы также можете изменить его на text/plain и проверить..