Запит POST із тілом JSON


76

Я хотів би додати допис у блог Blogger через PHP. Google подав приклад нижче. Як використовувати це з PHP?

Ви можете додати допис для блогу, надіславши запит POST до URI колекції дописів із тілом JSON допису:

POST https://www.googleapis.com/blogger/v3/blogs/8070105920543249955/posts/
Authorization: /* OAuth 2.0 token here */
Content-Type: application/json

{
  "kind": "blogger#post",
  "blog": {
    "id": "8070105920543249955"
  },
  "title": "A new post",
  "content": "With <b>exciting</b> content..."
}

1
можливий дублікат повідомлення Send json за допомогою php
freejosh

Я також рекомендую використовувати JSON для вашого вмісту, оскільки ви можете створити клас або функцію, яка поверне об'єкт, який ви можете серіалізувати за допомогою json_encode. Додаткову інформацію з цієї теми ви можете знайти тут: php.net/manual/de/ref.json.php - Це лише додаткова пропозиція до цієї теми :-)
Дастін Кляйн,

1
stream_context_create http contentПоле містить тіло HTTP для запиту. Додаючи цей коментар б / к, у відповіді явно не зазначено.
toddmo

Відповіді:


137

Вам потрібно використовувати бібліотеку cURL, щоб надіслати цей запит.

<?php
// Your ID and token
$blogID = '8070105920543249955';
$authToken = 'OAuth 2.0 token here';

// The data to send to the API
$postData = array(
    'kind' => 'blogger#post',
    'blog' => array('id' => $blogID),
    'title' => 'A new post',
    'content' => 'With <b>exciting</b> content...'
);

// Setup cURL
$ch = curl_init('https://www.googleapis.com/blogger/v3/blogs/'.$blogID.'/posts/');
curl_setopt_array($ch, array(
    CURLOPT_POST => TRUE,
    CURLOPT_RETURNTRANSFER => TRUE,
    CURLOPT_HTTPHEADER => array(
        'Authorization: '.$authToken,
        'Content-Type: application/json'
    ),
    CURLOPT_POSTFIELDS => json_encode($postData)
));

// Send the request
$response = curl_exec($ch);

// Check for errors
if($response === FALSE){
    die(curl_error($ch));
}

// Decode the response
$responseData = json_decode($response, TRUE);

// Print the date from the response
echo $responseData['published'];

Якщо з якихось причин ви не можете / не хочете використовувати cURL, ви можете зробити це:

<?php
// Your ID and token
$blogID = '8070105920543249955';
$authToken = 'OAuth 2.0 token here';

// The data to send to the API
$postData = array(
    'kind' => 'blogger#post',
    'blog' => array('id' => $blogID),
    'title' => 'A new post',
    'content' => 'With <b>exciting</b> content...'
);

// Create the context for the request
$context = stream_context_create(array(
    'http' => array(
        // http://www.php.net/manual/en/context.http.php
        'method' => 'POST',
        'header' => "Authorization: {$authToken}\r\n".
            "Content-Type: application/json\r\n",
        'content' => json_encode($postData)
    )
));

// Send the request
$response = file_get_contents('https://www.googleapis.com/blogger/v3/blogs/'.$blogID.'/posts/', FALSE, $context);

// Check for errors
if($response === FALSE){
    die('Error');
}

// Decode the response
$responseData = json_decode($response, TRUE);

// Print the date from the response
echo $responseData['published'];

5
Чудовий підручник! Навіть частина json включена :-)
Дастін Кляйн

Я отримую помилку, не вдалося відкрити потік: помилка запиту HTTP для "чистого" прикладу PHP у цьому рядку: // Send the request $response = file_get_contents('https://www.googleapis.com/blogger/v3/blogs/'.$blogID.'/posts/', FALSE, $context);Як це виправити?
Метт

@Matt: Чи працює приклад cURL (перший)? Можливо, ваш веб-хост / PHP-інсталяція блокує file_get_contents. Чи є помилка більше крім цього?
Rocket Hazmat

Приклад cURL працює без помилок, але не створює нового повідомлення в блозі Blogger. Повідомлень про помилки немає - просто пуста відповідь. Мій маркер дійсний, і я ще раз перевірив ідентифікатор блогу. Будь-які ідеї?
Метт

1
Я помітив , що заголовок авторизації повинна сконструйовані так: Authorization: OAuth {$authToken}.
SIFE

13

Я думаю, що cURL буде хорошим рішенням. Це не перевірено, але ви можете спробувати щось подібне:

$body = '{
  "kind": "blogger#post",
  "blog": {
    "id": "8070105920543249955"
  },
  "title": "A new post",
  "content": "With <b>exciting</b> content..."
}';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://www.googleapis.com/blogger/v3/blogs/8070105920543249955/posts/");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: application/json","Authorization: OAuth 2.0 token here"));
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $body);
$result = curl_exec($ch);

Не думаю, CURLOPT_USERPWDі CURLAUTH_BASICправильно відправлю маркер OAuth у Authorizationшапці.
Rocket Hazmat

Я не впевнений, як виглядає маркер. Формат CURLOPT_USERPWD IS username:password. Це те, що поміщено в Authorizationзаголовок, тому це має бути таким самим результатом, як додавання заголовка вручну Authorization: base64 of OAuth 2.0 token here.
MaX

Спробував код, і я отримую цю помилку: Warning: curl_setopt() expects parameter 1 to be resource, null givenмаркер виглядає так до речі: ya29.AHES6ZTIXVmG56O1SWM9IZpTUIQCUFQ9C2AQdp8AgHL6emMNЯкий параметр мені потрібно змінити?
Метт

На жаль, забув ініціалізувати curl. Я оновив сценарій за допомогою $ch = curl_init();.
MaX

Зараз це працює, але Blogger надсилає таку помилку: Error: 401 HTTP Basic Authentication is not supported for this APIце через curl_setopt($ch, CURLOPT_USERPWD,"[token]);"?
Метт

3

Якщо ви не хочете використовувати CURL, ви можете знайти кілька прикладів щодо stackoverflow, як і тут: Як надіслати запит POST із PHP? . Я б порекомендував вам переглянути кілька підручників про те, як використовувати методи GET і POST у PHP, або просто поглянути на посібник php.net тут: httprequest :: send . Ви можете знайти безліч підручників: HTTP POST від PHP, без curL і так далі ...


2

Я змусив API надсилати дані через форму на веб-сайті до компанії prospeperworks на основі коду @Rocket Hazmat, @dbau та @maraca. Сподіваюсь, це комусь допоможе:

<?php

if(isset($_POST['submit'])) {
    //form's fields name:
    $name = $_POST['nameField'];
    $email = $_POST['emailField'];

    //API url:
    $url = 'https://api.prosperworks.com/developer_api/v1/leads';

    //JSON data(not exact, but will be compiled to JSON) file:
    //add as many data as you need (according to prosperworks doc):
    $data = array(
                            'name' => $name,
                            'email' => array('email' => $email)
                        );

    //sending request (according to prosperworks documentation):
    // use key 'http' even if you send the request to https://...
    $options = array(
        'http' => array(
            'header'  => "Content-Type: application/json\r\n".
             "X-PW-AccessToken: YOUR_TOKEN_HERE\r\n".
             "X-PW-Application:developer_api\r\n".
             "X-PW-UserEmail: YOUR_EMAIL_HERE\r\n",
            'method'  => 'POST',
            'content' => json_encode($data)
        )
    );

    //engine:
    $context  = stream_context_create($options);
    $result = file_get_contents($url, false, $context);
    if ($result === FALSE) { /* Handle error */ }
    //compiling to JSON (as wrote above):
    $resultData = json_decode($result, TRUE);
    //display what was sent:
    echo '<h2>Sent: </h2>';
    echo $resultData['published'];
    //dump var:
    var_dump($result);

}
?>
<html>
    <head>
    </head>

    <body>

        <form action="" method="POST">
            <h1><?php echo $msg; ?></h1>
            Name: <input type="text" name="nameField"/>
            <br>
            Email: <input type="text" name="emailField"/>
            <input type="submit" name="submit" value="Send"/>
        </form>

    </body>
</html>

0
<?php
// Example API call
$data = array(array (
    "REGION" => "MUMBAI",
    "LOCATION" => "NA",
    "STORE" => "AMAZON"));
// json encode data
$authToken = "xxxxxxxxxx";
$data_string = json_encode($data); 
// set up the curl resource
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://domainyouhaveapi.com");   
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Content-Type:application/json',       
    'Content-Length: ' . strlen($data_string) ,
    'API-TOKEN-KEY:'.$authToken ));   // API-TOKEN-KEY is keyword so change according to ur key word. like authorization 
// execute the request
$output = curl_exec($ch);
//echo $output;
// Check for errors
if($output === FALSE){
    die(curl_error($ch));
}
echo($output) . PHP_EOL;
// close curl resource to free up system resources
curl_close($ch);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.