Autor | Zpráva | ||
---|---|---|---|
suvel Profil |
#1 · Zasláno: 1. 9. 2015, 22:16:04
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 |
#2 · Zasláno: 1. 9. 2015, 22:38:38
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 |
#3 · Zasláno: 1. 9. 2015, 23:00:56
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 |
#4 · Zasláno: 1. 9. 2015, 23:59:57
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 |
#6 · Zasláno: 2. 9. 2015, 08:31:10
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 |
#7 · Zasláno: 2. 9. 2015, 08:32:48
Díky, to ano, to funguje, ale já potřebuju, aby to bylo odesláno curl...
|
||
Martin2 Profil * |
#8 · Zasláno: 3. 9. 2015, 00:52:09
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. |
||
Časová prodleva: 9 let
|
0