Quand j'utilise curl
via POST
et set, CURLOPT_POSTFIELD
dois-je utiliser urlencode
un format spécial?
par exemple: Si je veux publier 2 champs, premier et dernier:
first=John&last=Smith
quel est le code / format exact à utiliser avec curl?
$ch=curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
$reply=curl_exec($ch);
curl_close($ch);
http_build_query($data)
puisque&
est le séparateur par défaut.EDIT : À partir de php5, l'utilisation de
http_build_query
est recommandée:Exemple simple du manuel:
avant php5:
À partir du manuel :
Donc, quelque chose comme ça devrait fonctionner parfaitement (avec des paramètres passés dans un tableau associatif):
la source
Ne passez pas du tout une corde!
Vous pouvez passer un tableau et laisser php / curl faire le sale boulot d'encodage, etc.
la source
http_build_query()
ce même tableau)Selon le manuel PHP, les données passées à cURL sous forme de chaîne doivent être encodées en URL. Consultez la page curl_setopt () et recherchez
CURLOPT_POSTFIELDS
.la source
Pour
CURLOPT_POSTFIELDS
, les paramètres peuvent être passés sous forme de chaîne codée par URL commepara1=val1¶2=val2&..
ou sous forme de tableau avec le nom du champ comme clé et les données de champ comme valeurEssayez le format suivant:
la source
json_encode()
vous donnera quelque chose de vraiment différent d'une chaîne de paramètres valide commefirst=John&last=Smith
.json_encode()
produira:{"first":"John","last":"Smith"}
qui deviendra alors le corps brut de votre requête POST.json_encode(...)
dohttp_build_query(...)
. Cela créera la "chaîne encodée par URL" attendue contenant les paramètres séparés par "&".Une autre différence majeure qui n'est pas encore mentionnée ici est qu'elle
CURLOPT_POSTFIELDS
ne peut pas gérer les tableaux imbriqués.Si nous prenons le tableau imbriqué,
['a' => 1, 'b' => [2, 3, 4]]
cela devrait être paramétré commea=1&b[]=2&b[]=3&b[]=4
(le[
et]
sera / devrait être encodé en URL). Cela sera reconverti automatiquement en un tableau imbriqué à l'autre extrémité (en supposant ici que l'autre extrémité est également PHP).Cela fonctionnera:
Cela ne fonctionnera pas:
Cela vous donnera un avis. L'exécution du code se poursuivra et votre point de terminaison recevra le paramètre
b
sous forme de chaîne"Array"
:la source
Cela dépend du
content-type
url-encoded ou multipart / form-data
Pour envoyer des données de manière standard, comme le ferait un navigateur avec un formulaire, il suffit de passer un tableau associatif . Comme indiqué dans le manuel de PHP:
Encodage JSON
Néanmoins, lors de la communication avec les API JSON, le contenu doit être encodé en JSON pour que l'API comprenne nos données POST.
Dans de tels cas, le contenu doit être explicitement encodé en JSON:
Lors de la communication en JSON, nous définissons également généralement les en
accept
-content-type
têtes en conséquence:la source
pour les tableaux imbriqués, vous pouvez utiliser:
la source
Fait intéressant, la façon dont Postman effectue POST est une opération GET complète avec ces 2 options supplémentaires:
Juste une autre façon, et cela fonctionne très bien.
la source
Cette réponse m'a également pris une éternité à trouver. J'ai découvert que tout ce que vous avez à faire est de concaténer l'URL ('?' Après le nom et l'extension du fichier) avec la chaîne de requête encodée par URL. Il ne semble même pas que vous deviez définir les options POST cURL. Voir le faux exemple ci-dessous:
Vous pouvez également utiliser
file_get_contents()
:la source