Yêu cầu ĐĂNG với nội dung JSON


76

Tôi muốn thêm một bài đăng vào blog Blogger thông qua PHP. Google đã cung cấp ví dụ bên dưới. Làm thế nào để sử dụng nó với PHP?

Bạn có thể thêm bài đăng cho blog bằng cách gửi yêu cầu ĐĂNG đến URI tuyển tập bài đăng với nội dung JSON bài đăng:

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
có thể trùng lặp của Gửi json bài đăng bằng php
freejosh

Tôi cũng khuyên bạn nên sử dụng JSON cho nội dung của mình, vì bạn có thể tạo một lớp hoặc hàm sẽ trả về một đối tượng mà bạn có thể tuần tự hóa bằng json_encode. Thông tin thêm về chủ đề đó bạn có thể tìm thấy ở đây: php.net/manual/de/ref.json.php - Đây chỉ là một gợi ý bổ sung cho chủ đề này :-)
Dustin Klein

1
Các stream_context_create http contenttrường chứa cơ thể http cho yêu cầu. Thêm nhận xét này b / c điều này không được nêu rõ ràng trong câu trả lời.
toddmo

Câu trả lời:


137

Bạn cần sử dụng thư viện cURL để gửi yêu cầu này.

<?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'];

Nếu vì lý do nào đó, bạn không thể / không muốn sử dụng cURL, bạn có thể làm như sau:

<?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
Hướng dẫn tuyệt vời! Ngay cả phần json cũng được bao gồm :-)
Dustin Klein

Tôi nhận được lỗi không mở được luồng: Yêu cầu HTTP không thành công đối với ví dụ PHP "thuần túy" tại dòng này: // Send the request $response = file_get_contents('https://www.googleapis.com/blogger/v3/blogs/'.$blogID.'/posts/', FALSE, $context);Cách khắc phục?
Matt

@Matt: Ví dụ cURL (ví dụ đầu tiên) có hoạt động không? Cài đặt webhost / PHP của bạn có thể bị chặn file_get_contents. Ngoài ra còn có lỗi nữa không?
Rocket Hazmat

Ví dụ cURL hoạt động mà không có lỗi nhưng không tạo bài đăng mới trên blog Blogger. Không có thông báo lỗi - chỉ là một phản hồi trống. Mã thông báo của tôi hợp lệ và tôi đã kiểm tra kỹ ID blog. Có ý kiến ​​gì không?
Matt

1
Tôi nhận thấy rằng tiêu đề uỷ quyền phải được xây dựng như thế này: Authorization: OAuth {$authToken}.
SIFE

13

Tôi nghĩ rằng cURL sẽ là một giải pháp tốt. Điều này không được kiểm tra, nhưng bạn có thể thử một cái gì đó như sau:

$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);

Tôi không nghĩ CURLOPT_USERPWDCURLAUTH_BASICsẽ gửi mã thông báo OAuth một cách chính xác trong Authorizationtiêu đề.
Rocket Hazmat

Tôi không chắc mã thông báo trông như thế nào. Định dạng cho CURLOPT_USERPWD username:password. Đây là những gì được đưa vào Authorizationtiêu đề, vì vậy nó sẽ có kết quả giống như thêm tiêu đề thủ công Authorization: base64 of OAuth 2.0 token here.
MaX

Đã thử mã và tôi gặp lỗi này: Warning: curl_setopt() expects parameter 1 to be resource, null givenMã thông báo trông giống như sau btw: ya29.AHES6ZTIXVmG56O1SWM9IZpTUIQCUFQ9C2AQdp8AgHL6emMNTôi cần thay đổi tham số nào?
Matt

Xin lỗi, quên khởi tạo curl. Tôi đã cập nhật tập lệnh với $ch = curl_init();.
MaX

Hiện nó đang hoạt động nhưng Blogger lại gửi lỗi này: Error: 401 HTTP Basic Authentication is not supported for this APICó phải do curl_setopt($ch, CURLOPT_USERPWD,"[token]);"không?
Matt

3

Nếu bạn không muốn sử dụng CURL, bạn có thể tìm thấy một số ví dụ về stackoverflow, giống như ví dụ này ở đây: Làm cách nào để gửi một yêu cầu POST với PHP? . Tôi khuyên bạn nên xem một vài hướng dẫn về cách sử dụng các phương thức GET và POST trong PHP hoặc chỉ cần xem hướng dẫn sử dụng php.net tại đây: httprequest :: send . Bạn có thể tìm thấy rất nhiều hướng dẫn: HTTP POST từ PHP, không có cURL , v.v.


2

Tôi đã thực hiện API gửi dữ liệu qua biểu mẫu trên trang web đến các công ty phát triển dựa trên mã @Rocket Hazmat, @dbau và @maraca. Tôi hy vọng, nó sẽ giúp ai đó:

<?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);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.