| 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: 11 let
|
|||
0