2013-06-04 4 views
57

Я хотел бы добавить post to a Blogger blog через PHP. Google привел пример ниже. Как использовать это с PHP?Запрос POST с корпусом JSON

You can add a post for a blog by sending a POST request to the post collection URI with a post JSON body:

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

возможно дубликат [Отправить JSon почту с помощью PHP] (http://stackoverflow.com/questions/6213509/send-json-post-using-php) – freejosh

+0

I также рекомендовал бы использовать JSON для вашего контента, так как вы могли бы создать класс или функцию, которая вернет объект, который вы могли бы сериализовать с помощью json_encode. Дополнительную информацию по этой теме вы можете найти здесь: http://www.php.net/manual/de/ref.json.php - Это просто дополнительное предложение по этой теме :-) –

ответ

98

Для отправки этого запроса необходимо использовать cURL library.

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

Если по какой-то причине, вы не можете/не хотите использовать локон, вы можете сделать это:

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

Отличный учебник! Даже часть json включена :-) –

+0

@DustinKlein: Спасибо!Я старался изо всех сил :-) –

+0

Я получаю сообщение об ошибке ** не удалось открыть поток: HTTP-запрос не удался ** для «чистого» примера PHP в этой строке: '// Отправить запрос $ response = file_get_contents (' https://www.googleapis.com/blogger/v3/blogs/'.$blogID.'/posts/ ', FALSE, $ context); 'Как это исправить? – Matt

8

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); 
+0

Я не думаю, что 'CURLOPT_USERPWD 'и' CURLAUTH_BASIC' правильно отправит токен OAuth в заголовке 'Authorization'. –

+0

Я не уверен, как выглядит токен. Формат 'CURLOPT_USERPWD' - это 'имя пользователя: пароль'. Это то, что помещено в заголовок 'Authorization', поэтому это должен быть тот же результат, что и добавление ручного заголовка' Authorization: base64 маркера OAuth 2.0 здесь'. – MaX

+0

Пробовал код, и я получаю эту ошибку: 'Warning: curl_setopt() ожидает, что параметр 1 будет ресурсом, null задан' токен выглядит следующим образом: 'ya29.AHES6ZTIXVmG56O1SWM9IZpTUIQCUFQ9C2AQdp8AgHL6emMN' Какой параметр мне нужно изменить? – Matt

3

Если вы не хотите использовать CURL, вы можете найти некоторые примеры на StackOverflow, так как этот здесь: How do I send a POST request with PHP?. Я бы рекомендовал вам посмотреть несколько руководств о том, как использовать методы GET и POST в PHP, или просто взгляните на руководство php.net здесь: httprequest::send. Вы можете найти множество учебников: HTTP POST from PHP, without cURL и т. Д.

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

Я сделал API отправки данных через форму на сайте для процветания на основе кода @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> 
Смежные вопросы