Autor Zpráva
suvel
Profil
Mám následující skript, který posílá dotaz skriptu api.php. Jestliže nepoužiju json (vyhodím řádek $data = json_encode($data); a z hlavičky 'Content-Type: application/json'), skript api.php krásně zjistí, co je v $_POST a podle toho vrátí odpověď. Ale když použiju skript se json, v $_POST není nic.

Už několik hodin zuřivě googluju, ale marně. Dělám chybu při dotazu, nebo neumím číst $_POST v api.php?

Prosím o pomoc, díky.

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "localhost/api.php");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, FALSE);
curl_setopt($ch, CURLOPT_HEADER, FALSE);
curl_setopt($ch, CURLOPT_POST, TRUE);
$data = array('promenna' => 'hodnota');
$data = json_encode($data);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(                                                                          
    'Content-Type: application/json')                                                                       
);   
$response = curl_exec($ch);
curl_close($ch);
nightfish
Profil
suvel:
Ale když použiju skript se json, v $_POST není nic.
Při nastavování CURLOPT_POSTFIELDS musíš funkci curl_setopt předat buď pole nebo řetězec ve tvaru pole1=hodnota1&pole2=hodnota2&...
Při použití funkce json_encode funkci předáš řetězec "{"promenna":"hodnota"}", kterému ona nerozumí...

Další možností by mohlo být posílání JSONu a na straně PHP následující zpracování (převzato ze StackOverflow):
$json = file_get_contents('php://input');
$obj = json_decode($json);
suvel
Profil
Děkuju za odpověď, ale asi by to mělo nějak jít, protože ten skript je zjednodušený dotaz toho, který má v dokumentaci jeden nejmenovaný server. A nějak to jejich skript přece musí přečíst. A nebo to je jinak - v tom příkladu mají totiž syntaktickou chybu:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "localhost/api.php");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, FALSE);
curl_setopt($ch, CURLOPT_HEADER, FALSE);
curl_setopt($ch, CURLOPT_POST, TRUE);
//$data = array('promenna' => 'hodnota');
//$data = json_encode($data);
curl_setopt($ch, CURLOPT_POSTFIELDS, {promenna: \"hodnota\"});
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));   
$response = curl_exec($ch);
curl_close($ch);

(vadí tam ty složené závorky). Tak jsem se to jen snažil přepsat do validního kódu...
nightfish
Profil
suvel:
A ten "jejich" skript k datům přistupuje přes $_POST nebo přes php://input nebo ještě jinak?
suvel
Profil
Já nevím. Jak by k datům měli přistupovat, když curl je zkrátka posílá v POST?

EDIT: Protože to nevím, založil jsem tohle téma :-)
Dan Charousek
Profil
Bez použití CURL a s povoleným allow_url_fopen můžeš zkusit:

        $data = array('promenna' => 'hodnota');

    $options = array(
        'http' => array(
            'header' => 'Content-Type: application/json\r\n',
            'method' => 'POST',
            'content' => json_encode($data)
        )
    );

    $context  = stream_context_create($options);
    $result = file_get_contents("localhost/api.php", false, $context);
suvel
Profil
Díky, to ano, to funguje, ale já potřebuju, aby to bylo odesláno curl...
Martin2
Profil *
suvel:
já potřebuju, aby to bylo odesláno curl.
Existuje pro to nějaký důvod?

cURL je už hodně low-level modul. V 99% případů ho není nutné používat, protože není nutné řídit celé spojení – především u obyčejného HTTP.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: