Envoyer une chaîne dans une requête PUT avec libcurl
Mon code ressemble à ceci:
curl = curl_easy_init();
if (curl) {
headers = curl_slist_append(headers, client_id_header);
headers = curl_slist_append(headers, "Content-Type: application/json");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(curl, CURLOPT_URL, "127.0.0.1/test.php");
curl_easy_setopt(curl, CURLOPT_PUT, 1L);
res = curl_easy_perform(curl);
res = curl_easy_send(curl, json_struct, strlen(json_struct), &io_len);
curl_slist_free_all(headers);
curl_easy_cleanup(curl);
}
Qui ne marche pas, le programme se bloque toujours.
Dans test.php ce sont les en-têtes de requête-je obtenir:
array(6) {
["Host"]=>
string(9) "127.0.0.1"
["Accept"]=>
string(3) "*/*"
["Transfer-Encoding"]=>
string(7) "chunked"
["X-ClientId"]=>
string(36) "php_..."
["Content-Type"]=>
string(16) "application/json"
["Expect"]=>
string(12) "100-continue"
}
Mais le corps est vide, les moyens, peu de données json est envoyé avec la demande.
Ce que je veux faire avec libcurl est en fait rien d'autre alors ces script de ligne de commande:
curl -X PUT -H "Content-Type: application/json" -d '... some json ...' 127.0.0.1/test.php
source d'informationauteur Max
Vous devez vous connecter pour publier un commentaire.
Eu 🙂
Ne pas utiliser
Faire une demande personnalisée et envoyer les données comme POSTFIELDS:
CURLOPT_PUT
est obsolète et a été pendant un certain temps. Vous devez utiliserCURLOPT_UPLOAD
.Inconnus quantités de données avec HTTP, vous devriez être en utilisant l'encodage de transfert en bloc. Le
CURLOPT_UPLOAD
docs disent:Celui-ci n'a pas fonctionné pour moi.
J'ai EU à utiliser TÉLÉCHARGER et METTRE à effectuer cette correctement.
La réponse qui a fonctionné pour moi est ici:
Comment puis-je envoyer de longs PLACER les données dans libcurl sans l'aide de pointeurs de fichiers?
Vous avez besoin de la fonction de rappel pour READFILE et ensuite l'utiliser pour copier vos données dans le pointeur curl offres dans ce rappel.
Finalement, ce qui a fonctionné pour moi a été de m'assurer de définir la taille de FICHIER en utilisant soit CURLOPT_INFILESIZE ou CURLOPT_INFILESIZE_LARGE en fonction de votre charge. Sinon vous obtenez le problème posté dans la trame de fond.
Résumé des épisodes précédents:
Je m'attendais à un JSON demande, mais en utilisant soit le METTRE CURL option ou cette demande personnalisée approche-je obtenir le même résultat que de faire cela via la console
D'autre part de faire la même demande sur la console et l'ajout d'un champ de données (d "" URL)me donne ce que je veux:
En résumé, il semble que j'ai besoin de comprendre le CURL options qui va faire l'équivalent de MIS -d "". Vous pouvez également voir la différence entre la réponse, dans un cas, le retour est le HTML et la connexion est fermée. Dans les autres cas, le Contenu est JSON et la connexion est maintenue en vie.
Fondée sur ce que j'ai trouvé sur d'erreur 411:
http://www.checkupdown.com/status/E411.html
Le problème est que la longueur du contenu doit être défini indépendamment de savoir si vous utilisez CURLOPT_UPLOAD avec CURLOPT_PUT ou l'option PERSONNALISÉE.
Donc, si vous avez un flux de données, il semble que vous AVEZ à utiliser le READDATA et READFUNCTION options pour déterminer la longueur de vos données.
Note de l'admin:
Garder à l'esprit rep 50 est NÉCESSAIRE pour poster des commentaires donc je n'AI PAS le CHOIX, mais de créer des postes dans le but de communiquer. Alors, pensez-y quand vous pensez à propos de la suppression de ces postes, comme cela a été fait dans le passé.