http — не может отправить переменные POST в php скрипт на localhost с помощью Postman

Я разрабатываю клиентскую часть веб-приложения в 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, это меня все еще немного смущает)

  1. Должен ли я установить Content-Type заголовок к application/json, application/x-www-form-urlencoded, или что?

  2. Должен ли я отправить данные тела как 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 …

5

Решение

После поиска здесь и там, я обнаружил, что данные тела сообщения попадают в $_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 очень ограничены …

14

Другие решения

Ошибка, которую я допустил при первом использовании Postman, заключалась в установке параметров при использовании метода POST, который не удался. Я попробовал ваше обновление 3, которое сработало, и затем я понял, что на вкладке «Тело» есть пары ключ-значение.

Удаление параметров, установка для тела значения «x-www-form-urlencoded» и добавление переменных, которые будут опубликованы здесь, работает, как и ожидалось.

Я упустил из виду, что я решил, что будет один раздел для ввода значений, и метод определит, как их передавать, что имеет смысл в случае, если вы хотите отправить некоторые параметры в URL с POST

Расширение Postman Chrome - Post Body

11

Комментарий от @Первый спас меня. Я добавил косую черту в URL, и это решило проблему. Таким образом, мой php-скрипт может определять запрос как POST даже без установки заголовка в

Приложение Content-Type / x-www-form-
urlencoded

Я также проверил мой код без заголовка, и он отлично работает. Я тестировал с Content-type: application / json тоже, и он отлично работает.

if ($ _ SERVER [‘REQUEST_METHOD] =’ POST ‘) {echo’ Запрос отправлен ‘; }

Мой сценарий возвратил «Запрос опубликован» с помощью RESTEasy — Rest клиент в Chrome.
Спасибо, во-первых.

0
По вопросам рекламы [email protected]