Я разрабатываю клиентскую часть веб-приложения в iOS / Swift и сейчас тестирую часть, которая взаимодействует с сервером. Я настроил основной сайт на localhost по адресу:
http://localhost/~username/ConnectivityTest/login
(что соответствует /Users/username/Sites/ConnectivityTest/login
в файловой системе моего Mac).
Скрипт серверной части (index.php
в каталоге выше) есть:
<?PHP
$userId = $_POST["userId"];
$password = $_POST["password"];
if (empty($userId) || empty($password)){
echo "Error: empty post variables";
}
else{
// Process credentials...
Я использую NSURLSession
API на iOS, но я заметил, что независимо от того, как я настраиваю свои запросы, даже если соединение успешно (т.е. возвращает http-код 200 и тело ответа в качестве данных), POST
переменные недоступны (пустые) на стороне сервера.
Поэтому я решил попробовать отправить запрос вручную с помощью Postman в браузере (чтобы исключить любые ошибки в моем коде iOS / Swift), но я не знаю, как мне его настроить (я не разбираюсь в HTTP, это меня все еще немного смущает)
Должен ли я установить Content-Type
заголовок к application/json
, application/x-www-form-urlencoded
, или что?
Должен ли я отправить данные тела как form-data
, x-www-form-urlencoded
или же raw
?
В Почтальоне я устанавливаю данные тела (необработанные) следующим образом:
{
"userId":"my-user-name",
"password":"123456"}
Альтернативлей, а form-data
, это:
userId my-user-name [Text]
password 12345 [Text]
Как x-www-form-urlencoded
, это:
userId my-user-name
password 12345
Все, что я пытаюсь, дает мне ответ "Error: empty post variables"
что я установил в пути ошибки моего кода (т.е. $_POST['userId']
или же $_POST['password']
пусты).
Если вместо этого я передаю переменные как параметры URL:
http://localhost/~username/ConnectivityTest/login/index.php?userId=my-user-name&password=12345
…и получить к ним доступ в сценарии как &_GET['userId']
а также $_GET['password']
работает нормально.
что мне не хватает?
ОБНОВИТЬ: Я создал файл HTML в том же каталоге, что и файл php:
<html>
<body>
<form action="index.php" method="post">
User name: <input type="text" name="userId"><br>
Password: <input type="text" name="password"><br>
<input type="submit" value="Submit">
</form>
</body>
</html>
Если я загружу вышеуказанную страницу в браузер, заполните поля и отправьте форму, $_POST
переменные в моем PHP-скрипте получают правильные значения. Так что код php правильный, и я неправильно настраиваю свой запрос в Postman (до сих пор не знаю почему).
ОБНОВЛЕНИЕ 2: На случай, если возникла проблема с localhost, я переместил скрипт в общий хостинг wb, которым я управляю, но результат тот же.
ОБНОВЛЕНИЕ 3: Должно быть, я как-то пропустил это раньше, но есть ОДНА установка, с которой я начал работать:
Заголовки: Content-Type application/x-www-form-urlencoded
Кузов («сырой»): userId=my-user-name&password=123456
Однако это ограничивает меня плоскими списками ключ / значение; Если я хочу отправлять на сервер более структурированные (то есть вложенные) данные, мне нужна поддержка JSON …
После поиска здесь и там, я обнаружил, что данные тела сообщения попадают в $_POST
переменные только тогда, когда вы отправляете их в виде -i.e., application/x-www-form-urlencoded
— (Я думаю, это то, что $_POST
означает, а не метод, используемый для запроса). Поправь меня, если я говорю что-то не то.
При использовании Content-Type application/json
код, подобный следующему, добивается цели:
$data = json_decode(file_get_contents('php://input'), true);
$userId = $data["userId"];
$password = $data["password"];
Я думаю, что это очень простой материал, но опять же, мои знания HTTP очень ограничены …
Ошибка, которую я допустил при первом использовании Postman, заключалась в установке параметров при использовании метода POST, который не удался. Я попробовал ваше обновление 3, которое сработало, и затем я понял, что на вкладке «Тело» есть пары ключ-значение.
Удаление параметров, установка для тела значения «x-www-form-urlencoded» и добавление переменных, которые будут опубликованы здесь, работает, как и ожидалось.
Я упустил из виду, что я решил, что будет один раздел для ввода значений, и метод определит, как их передавать, что имеет смысл в случае, если вы хотите отправить некоторые параметры в URL с POST
Комментарий от @Первый спас меня. Я добавил косую черту в URL, и это решило проблему. Таким образом, мой php-скрипт может определять запрос как POST даже без установки заголовка в
Приложение Content-Type / x-www-form-
urlencoded
Я также проверил мой код без заголовка, и он отлично работает. Я тестировал с Content-type: application / json тоже, и он отлично работает.
if ($ _ SERVER [‘REQUEST_METHOD] =’ POST ‘) {echo’ Запрос отправлен ‘; }
Мой сценарий возвратил «Запрос опубликован» с помощью RESTEasy — Rest клиент в Chrome.
Спасибо, во-первых.