J'ai un simple script PHP qui envoie une demande de post HTTP via Curl et attend une chaîne JSON en réponse (aurait adoré utiliser une bibliothèque existante comme pecl_http / httpequest pour cela, mais pas). L'appel échoue systématiquement avec un type de support d'erreur 415 non pris en charge. Je pense que je ne configure pas la courroie correctement, mais après de nombreuses recherches, je ne peux pas découvrir ce que je fais mal. Voici un code: ... et la réponse: p> Toutes idées ou idées? P> Merci À l'avance! P> P>
4 Réponses :
Je pense que le problème est que vous passez une matrice comme option à p> voir http_build_query Pour plus d'informations et cette réponse: ma demande de courbure confond certains serveurs? p> p> curlopt_postfields code>. En passant un tableau, cela force la requête
post code> d'utiliser
multipart / form-données code> lorsque le serveur s'attend probablement à
Application / X-www-Form-Urlencoded < /Code> Modification de la stratégie p>
Merci pour la suggestion - même réponse cependant. Je garderai cela à l'esprit avancer cependant. Vous faites un bon point.
Renifler La demande entière dans Wireshark peut être utile afin que vous puissiez voir la requête HTTP et la réponse. S'attendent-ils à poster des données JSON plutôt que de données d'urlencode?
Il s'attend à ce que Json, et par ma réponse au commentaire de Boris, je vais suivre votre conseil, mon appel avec l'appel envoyé de l'affiche et comparer les deux.
Dans ce cas, vous devrez peut-être définir curlopt_postfields code> sur
json_encode ($ ceci-> corps) code> et confirmez que l'en-tête de type contenu sortant n'est pas remplacé par le back autre chose que
application / json code>
Vérification de ce que WireShark a à dire sur la question - pensais que je l'avais, et a fait ce commentaire, puis devait le modifier pour éliminer les découvertes erronées ...
Pouvez-vous confirmer que le si ($ ceci-> méthode == 'post') code> bloc est entré? De plus, lorsque vous définissez l'en-tête CODE> Attendez-vous dans le bloc Post, vous effacez tous les en-têtes précédemment définis. Malgré tout, je ne pense pas que cela devait revenir à la demande d'y aller.
Problème résolu! Voici le problème:
L'envoi d'un réseau associatif d'en-tête ne fonctionne pas avec CURL. Plusieurs forums sont dispersés autour de cet émission d'exemples utilisant un tableau associatif pour les en-têtes. Ne le faites pas! P>
Le Correct em> (qui est également dispersé autour des internets, mais que je suis trop dense pour avoir remarqué) est de construire votre clé en-tête / Valiez des paires en tant que chaînes et passez une matrice standard de ces chaînes lors du réglage de l'option CurlopT_HTTPHEADER. P> donc en résumé, P> faux: strong> p> J'espère que cela est utile à une autre noble doofus sur la route avant Ils gaspillent autant de temps que je fais du débogage que moi. P> Si je devais deviner, je suppose que la même règle s'applique à la clé / paires de la valeur du corps post-corps, c'est pourquoi @ Drew010 À propos de l'utilisation de Merci à tout le monde pour vos commentaires très utiles, et pour votre temps et votre considération. En fin de compte, une comparaison côte à côte du trafic HTTP (capturé via Wireshark) a révélé le problème. P> Merci! p> p> http_build_query () code> ou
JSON_ENCODE () CODE> Pour limiter le corps de votre message est une bonne idée aussi. P>
Mince! J'essayais tout et j'ai littéralement trouvé des dizaines de pages différentes et de didacticiels montrant comment définir des en-têtes avec clé => la valeur et cela ne fonctionnait tout simplement pas! Merci, Ian!
Merci d'avoir sauvé des heures possibles / jours de frustration mate :)
J'ai eu le même problème et j'ai corrigé la modification de l'en-tête.
Mon code: P>
curl_setopt($session, CURLOPT_HTTPHEADER, array('Content-Type: application/json', $authorization));
Ceci a fonctionné pour moi
Vous pouvez essayer d'ajouter un
Accepter code> en-tête avec
Application / JSON CODE>
Merci, essayé, mais pas d'amour :( votre commentaire m'a rappelé que je voudrais souligner les en-têtes similaires spécifiquement dans l'exemple, alors merci :)
Le site Web vous essayez de demander une API publique ou privée? Vous pouvez manquer quelques paramètres cependant, l'erreur de réponse est très générique et nous ne pourrons peut-être pas aider s'il s'agit d'une API privée.
Privé, malheureusement. Je sais que cela limite considérablement la mesure auquel d'autres peuvent aider à résoudre ce problème, mais ils sont les pauses que j'ai peur. Surtout j'espère que quelqu'un de plus expérimenté avec PHP ou Curl repérera un piège commun que j'ai entré.
Avez-vous autre moyen de tester votre service Web? Avant de prendre beaucoup de temps, déboguer votre code qui a l'air assez simple et correct, assurez-vous que le service à distance n'est pas cassé.
Je pense que c'est comme ça que je fais le poste de curl. Je viens d'essayer de faire le post à l'aide de l'affiche (chrome plugin) et c'était un succès. Je pense que je vais me faufiler et voir si l'appel de l'affiche et mon appel correspondent. Quand je trouve l'erreur, je le posterai ici ici.
Pas besoin d'utiliser Wireshark, jetez simplement un coup d'œil à la demande d'en-tête dans votre extension Chrome et votre script PHP.
Il y a plusieurs choses mal à votre code (comme incorrectement l'encodage de la chaîne de requête, il devrait être
$ querystr. = URLenCode ($ clé). "=". UrlenCode ($ val). "&"; code> (ou même mieux:
$ querystr = http_build_query ($ ceci-> params); code>) et utiliser regex pour analyser le code de réponse au lieu d'utiliser curlinfo_response_code, il devrait simplement être
$ code = curl_getinfo ($ Demande, Curlinfo_Response_code); Code>), mais sans la documentation de l'API pour MyDomain.com/myrestCall, personne ici ne sait que votre demande est censée ressembler, nous avons besoin de la documentation pour votre point d'extrémité de l'API avant de pouvoir être de toute aide.