Я пытаюсь отправить некоторые данные, собранные из пользовательского ввода из формы javascript, в файл php для обработки. Я могу совершить подвиг, когда жестко кодирую значения php и просто отправляю без аргументов, как это …
xhr.open("post", "http://host/path/script.php", true);
xhr.send();
но как только я пытаюсь отправить массив с пользовательскими значениями ввода, как это …
xhr.open("post", "http://host/path/script.php", true);
xhr.send(data);
Я получаю «неопределенную ошибку», не слишком уверенную, почему. Переменная имеет тип «FormData», и я не думаю, что проблема связана с самой переменной, просто не уверен, почему она работает без аргументов, но не с аргументом данных.
Чтобы исключить те же проблемы политики происхождения, у меня есть эти заголовки в моем файле php …
header('Access-Control-Allow-Origin: *');
header("Access-Control-Allow-Credentials: true");
header('Access-Control-Allow-Methods: GET, PUT, POST, DELETE, OPTIONS');
header('Access-Control-Max-Age: 1000');
header('Access-Control-Allow-Headers: Content-Type, Content-Range, Content-Disposition, Content-Description, X-Request-With');
Хотя я довольно новичок в этом, поэтому я могу ошибаться.
РЕДАКТИРОВАТЬ: Консоль на самом деле дает мне эту ошибку …
XMLHttpRequest cannot load http://host/path/script.php. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://javascripthost/path' is therefore not allowed access.
Похоже, что есть проблема с контролем доступа … но я не знаю, как это исправить
РЕДАКТИРОВАТЬ 2: Добавление заголовков, если эта информация помогает …
Remote Address:127.0.0.1:80
Request URL:http://host/path/script.php
Request Method:OPTIONS
Status Code:200 OK
Request Headers
Accept:*/*
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-GB,en-US;q=0.8,en;q=0.6
Access-Control-Request-Headers:content-type
Access-Control-Request-Method:POST
Connection:keep-alive
Host:localhost
Origin:http://host2
Referer:http://host2/script
User-Agent:Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.124 Safari/537.36
Response Headers
Allow:OPTIONS, TRACE, GET, HEAD, POST
Content-Length:0
Date:Thu, 02 Oct 2014 14:08:24 GMT
Public:OPTIONS, TRACE, GET, HEAD, POST
Server:Microsoft-IIS/8.5
X-Powered-By:ASP.NET
Что решило мою проблему, так это добавление заголовка Access-Control-Allow-Origins к моему реальному сайту с помощью PHP-скрипта в IIS. Я думал, что смогу сделать это в файле PHP, но, видимо, нет. Надеюсь, что это поможет любому с подобной проблемой.
Как примечание, вы часто можете избежать необходимости выполнять предварительные запросы OPTION, если не используете индикатор выполнения. По какой-то причине кажется, что все (или все, с которыми я тестировал) браузеры обрабатывают запросы с индикатором выполнения, как предварительные запросы OPTION.
Скорее всего, вы не используете правильные атрибуты. При попытке отправить POST-данные обычно проверяйте правильность написания.
var data = "username="+username+"&country="+country;
xmlhttp.open('POST', 'inc/ajaxPostHandler.php', true);
xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xmlhttp.send(data);