Я не программист 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 … но из того, что я прочитал, это не имеет большого значения. Ребята, любая помощь, которую вы можете оказать, будет принята с благодарностью!
Попробуйте это так — вместо того, чтобы помещать 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")
);
Я не вижу заголовка «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";
Вам может понадобиться использовать 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>';
?>