2016-05-02 5 views
0

мне нужно сделать эту командуPHP как использовать CURL

[email protected]:~# curl -X PUT -d '{ "date": "2.5.", "order": 2, "prize": 45 }' '[URL]' 

в PHP (или Python). Но я понятия не имею, как это сделать. Я попытался это:

$data = '{ "date": "2.5.", "order": 2, "prize": 45 }'; 
$data = json_encode($data); 
echo $data; 
$ch = curl_init([URL]); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_PUT, true); 
curl_setopt($ch, CURLOPT_POSTFIELDS,http_build_query($data)); 
$response = curl_exec($ch); 
curl_close($ch); 
echo $response; 

Но это возвращает:

{ "error" : "Error: No data supplied." } 

Любая идея, как воспроизвести его в PHP/Python?

+0

Использовать [заявку] (http://docs.python-requests.org/en/latest/). –

+1

вы делаете json_encode на уже json string -> плохой синтаксис, а также удаляете http_build_query, если вы отправляете чистую строку json в качестве POST –

+0

. Я вносил изменения, но по-прежнему не исправил проблему:/ – Slouchy

ответ

2
$url = "[URL]"; 

$data = array(
"date" => "2.5.", 
"order" => "2", 
"prize" => 45 
); 

$json_data = json_encode($data); 

$ch = curl_init($url); 

curl_setopt($ch, CURLOPT_URL, $url); 

curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT"); 

curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); 

curl_setopt($ch, CURLOPT_POSTFIELDS, $json_data); 

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 

$content = curl_exec($ch); 

curl_close($ch); 
+0

Ничего себе это сработало, вы сохранили мои жизнь (и работа: D). Благодаря! – Slouchy

0

subprocess.call или subprocess.run будет делать то, что вам нужно для этого, хотя вывод будет выгружен в stdout, поэтому вам также потребуется перенаправить его, если вы хотите управлять возвращаемыми данными. Однако вы также можете использовать requests, как и некоторые другие комментаторы.

https://docs.python.org/3.5/library/subprocess.html

import subprocess 
import tempfile 

with tempfile.TemporaryFile() as tmp: 
    subprocess.call(["curl", "-X", "PUT", "-d", '{ "date": "2.5.", "order": 2, "prize": 45 }', '[URL]'], stdout=tmp) 
    tmp.seek(0) 
    data = tmp.read() 
0

Accoridng к PHP документации,

http://php.net/manual/en/function.http-build-query.php

http_build_query принимает массив или объект в качестве В параметре. Кроме того, json_encode возвращает строку:

http://php.net/manual/en/function.json-encode.php

Итак, вам нужно изменить так, как вы их используете.

Далее, используя http_build_query может быть предпочтительным, так как URL-кодирует данные Params:

When POSTing an associative array with cURL, do I need to urlencode the contents first?

Так что вам нужно, чтобы передать массив в функцию http_build_query, чтобы заставить его работать:

Пример (из выше ссылки):

$curl_parameters = array(
    'param1' => $param1, 
    'param2' => $param2 
); 

    $curl_options = array(
    CURLOPT_URL => "http://localhost/service", 
    CURLOPT_POST => true, 
    CURLOPT_POSTFIELDS => http_build_query($curl_parameters), 
    CURLOPT_HTTP_VERSION => 1.0, 
    CURLOPT_RETURNTRANSFER => true, 
    CURLOPT_HEADER => false 
); 

    $curl = curl_init(); 
    curl_setopt_array($curl, $curl_options); 
    $result = curl_exec($curl); 

    curl_close($curl); 
Смежные вопросы