PHP HTTP post — 400 неправильных запросов

Я не программист PHP по профессии, но я должен написать PHP-скрипт, который будет отправлять HTTP-запрос POST в API. Этот пост также содержит некоторый контент в формате JSON (который, как я убедился, правильно отформатирован с использованием jsonlint.com). Я постоянно получаю «400 Bad Request», поэтому я предполагаю, что у меня что-то отформатировано неправильно.

$json = "<JSON markup goes here>";

$options = array(
'http' => array
(
'method'  => 'POST',
'content' => $json,
'header'  =>    "Content-Type: application/json\r\n" .
"Accept: application/json\r\n" .
"Api-User: <API USER GOES HERE>\r\n" .
"Api-Key: <API KEY GOES HERE>\r\n")
);

$url = "https://url/paths";

$context  = stream_context_create( $options );
$result   = file_get_contents( $url, false, $context );
$response = json_decode( $result );

Я искал этот сайт, и большинство примеров, кажется, совпадают с тем, что я делаю … поэтому я не знаю, в чем проблема. Единственное отличие, которое я заметил (по сравнению с примерами), заключается в том, что мое сообщение публикуется по URL-адресу HTTPS … но из того, что я прочитал, это не имеет большого значения. Ребята, любая помощь, которую вы можете оказать, будет принята с благодарностью!

1

Решение

Попробуйте это так — вместо того, чтобы помещать json как строку, используйте PHP:

$json = array("keys" => "values"); // You get the idea, right?

$options = array(
'http' => array
(
'method'  => 'POST',
'content' => json_encode($json),
'header'  =>    "Content-Type: application/json\r\n" .
"Accept: application/json\r\n" .
"Api-User: <API USER GOES HERE>\r\n" .
"Api-Key: <API KEY GOES HERE>\r\n")
);
1

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

Я не вижу заголовка «host». Отсутствие «хоста» может привести к неправильному запросу.

Например:

POST http://localhost:8080/api/myService HTTP/1.1
Host: http://localhost:8080
Content-Type: application/json

{
"id" : "value"}

Кроме того, все примеры в документе используют fopen вместо file_get_contents, Увидеть http://php.net/manual/en/function.stream-context-create.php

Редактировать: Вот пример …

$options = array(
'http' => array
(
'method'  => 'POST',
'content' => $json,
'header'  => "Host: http://localhost:8080\r\n" .
"Content-Type: application/json\r\n" .
"Accept: application/json\r\n" .
"Api-User: <API USER GOES HERE>\r\n" .
"Api-Key: <API KEY GOES HERE>\r\n")
);

$url = "http://localhost:8080/api/myService";
0

Вам может понадобиться использовать curl:

<?php

function getCurl($url, $post) {

$appName = 'My Application';
$apiUser = [Username Goes Here];
$apiKey = [API Key Goes Here];

$baseUrl = "https://url/";
$credentials = $apiUser:$apiKey;
$typeHeader = "Content-Type: application/json";
$helloHeader = "User-Agent: $appName ($appContact)";

$url = $baseUrl.$url;

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_USERPWD, $credentials);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_MAXREDIRS, 3);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
curl_setopt($ch, CURLOPT_HTTPHEADER, array($typeHeader, $helloHeader));
return $ch;
}

$options = array(
'http' => array
(
'method'  => 'POST',
'content' => $json,
'header'  =>    "Content-Type: application/json\r\n" .
"Accept: application/json\r\n" .
"Api-User: <API USER GOES HERE>\r\n" .
"Api-Key: <API KEY GOES HERE>\r\n")
);

$curl = getCurl("paths", $options);
echo curl_exec($curl).'</br>';
echo curl_errno($curl).'</br>';
echo curl_error($curl).'</br>';

?>
-1
По вопросам рекламы [email protected]