Данные Actionscript 3 Air iOS POST не отправляются с помощью URLLoader

У меня есть следующий код для отправки данных POST на мой сервер:

var headers:Array = [
    new URLRequestHeader("api_access_token", ACCESS_TOKEN),
    new URLRequestHeader("api_secret", SECRET),
    new URLRequestHeader("Content-type", "application/json")
];
var base_url = "http://example.com/";
var complete_func:Function;

function postRequest(url:String, params:Object, response_func:Function){
    complete_func = response_func;
    var request = new URLRequest(base_url+url);
    request.requestHeaders = headers;
    request.method = URLRequestMethod.POST;
    request.contentType = "application/json";
    request.data = JSON.stringify(params);

    //  Handlers
    var postLoader = new URLLoader();
    postLoader.addEventListener(Event.COMPLETE, parseResponse);
    postLoader.addEventListener(IOErrorEvent.IO_ERROR, function(e:IOErrorEvent){ trace(e); });
    postLoader.load(request);
}

function parseResponse(e:Event){
    var data = e.target.data;
    trace(data);
    var json_data = JSON.parse(data);
    complete_func(json_data);
}

Проблема в том, что на моем сервере, когда я использую var_dump($_POST), возвращается только пустой массив. Я не знаю, почему это так. Я сделал traces для параметров params и url, которые содержат соответствующие данные.

Параметры, которые я отправляю:

var customerDetails:Object = new Object();
    customerDetails.first_name = firstNameField.text;
    customerDetails.last_name = lastNameField.text;
    customerDetails.dob = dobField.text;
    customerDetails.email = emailField.text;

Заголовки, полученные PHP list_headers(), возвращают:

array(6) { [0]=> string(24) "X-Powered-By: PHP/5.4.30" [1]=> string(38) "Expires: Thu, 19 Nov 1981 08:52:00 GMT" [2]=> string(77) "Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0" [3]=> string(16) "Pragma: no-cache" [4]=> string(44) "api_secret: example_secret" [5]=> string(50) "api_access_token: example_access" }

Я использую Air 16.0 для iOS с ActionScript 3.

Любая помощь будет здорово. Я не знаю, является ли это проблемой междоменной политики.

P.S. Отлично работает с запросом GET.


person Stefan Dunn    schedule 08.06.2015    source источник


Ответы (2)


Используйте правильный dataFormat:

loader.dataFormat = URLLoaderDataFormat.VARIABLES
person Andre Lehnert    schedule 08.06.2015
comment
Когда я изменяю это, я получаю следующую ошибку: The String passed to URLVariables.decode() must be a URL-encoded query string containing name/value pairs.. Но я не звоню URLVariables.decode(). - person Stefan Dunn; 08.06.2015
comment
Просто для проверки: измените свой php на одну строку: echo $_POST и посмотрите, что входит в ваш loader.data. - person Andre Lehnert; 08.06.2015
comment
Ничего, ничего не приходит в $_POST или $_REQUEST. Он отлично работает, когда я использую request.method = URLRequestMethod.GET, но это $_GET, а это не то, чего я хочу добиться. - person Stefan Dunn; 09.06.2015
comment
Еще более странно, что в журнале доступа Apache есть запись POST: 92.40.248.198 - - [09/Jun/2015:11:10:59 +0100] "POST /customers/new/ HTTP/1.1" 200 1968 "app:/registration.swf" "Mozilla/5.0 (iOS; U; en) AppleWebKit/533.19.4 (KHTML, like Gecko) AdobeAIR/16.0" - person Stefan Dunn; 09.06.2015
comment
это означает, что пришел POST? Что с вашими заголовками? Просто для проверки, не прикрепляйте их. Обычно для тестирования я бы начал с простого простого запроса, чтобы выяснить, где возникает проблема. - person Andre Lehnert; 09.06.2015
comment
Заголовки работают для api_secret_token и api_acces_token, но, возможно, мне нужно установить тип контента в URLRequestHeader вместо URLRequest.contentType. Я попробую это сейчас. - person Stefan Dunn; 09.06.2015
comment
Заголовки, которые я получаю от PHP list_headers(): array(6) { [0]=> string(24) "X-Powered-By: PHP/5.4.30" [1]=> string(38) "Expires: Thu, 19 Nov 1981 08:52:00 GMT" [2]=> string(77) "Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0" [3]=> string(16) "Pragma: no-cache" [4]=> string(44) "api_secret: example_secret" [5]=> string(50) "api_access_token: example_access" }. Похоже, new URLRequestHeader("Content-type", "application/json") не работает. - person Stefan Dunn; 09.06.2015

Код As3 действителен. Вам нужно улучшить php-код на стороне сервера. Пожалуйста, попробуйте это..

<?php 

$body = @file_get_contents('php://input');
$jsn =  json_decode($body);
echo $jsn->first_name;
echo $jsn->last_name;
echo $jsn->dob;
echo $jsn->email;

?>
person Göksel TÜR    schedule 03.01.2016