aujourd'hui, j'essaie de faire un appel curl à un site écoutant le port 8080. Toutefois, des appels comme celui-ci sont envoyés au port 80 et non au 8080:
$ch = curl_init();
curl_setopt($ch, CURLOPT_PORT, 8080);
curl_setopt($ch, CURLOPT_URL, 'http://somesite.tld:8080');
curl_setopt($ch, CURLOPT_POST, count($data));
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$target_response = curl_exec($ch);
curl_close($ch);
est-ce que j'ai râté quelque chose?
Juste une remarque, j'ai déjà eu ce problème parce que l'hôte Web que j'utilisais bloquait les ports sortants en plus des ports standard 80 et 443 (HTTPS). Donc, vous voudrez peut-être leur demander ou faire des tests généraux. En fait, certains hôtes bloquent souvent même le trafic sortant sur le port 80 pour des raisons de sécurité.
// Use PHP cURL to make a request to port 8080 on a server
$ch = curl_init();
curl_setopt($ch, CURLOPT_PORT, 8080);
curl_setopt($ch, CURLOPT_URL, 'http://somesite.tld:8080');
curl_setopt($ch, CURLOPT_POST, count($data));
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$target_response = curl_exec($ch);
curl_close($ch);
curl_setopt($ch, CURLOPT_URL, 'http://somesite.tld:8080');
PHP cURL sending to port 8080
$ch = curl_init();
curl_setopt($ch, CURLOPT_PORT, 8080);
curl_setopt($ch, CURLOPT_URL, 'http://somesite.tld:8080');
curl_setopt($ch, CURLOPT_POST, count($data));
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$target_response = curl_exec($ch);
curl_close($ch);
curl_setopt($ch, CURLOPT_URL, 'http://somesite.tld:8080');
Votre serveur Web est mal configuré. Le code que vous avez fourni fonctionne pour moi.
En outre, votre code peut être plus simple. Il suffit de mettre l'URI dans l'appel init et de supprimer les lignes CURLOPT_PORT
et CURLOPT_URL
:
$ch = curl_init('http://somesite.tld:8080');
Êtes-vous sûr que le serveur auquel vous souhaitez vous connecter n'est pas doté d'un pare-feu? Et que Selinux est désactivé?
Commencez par vérifier que vous êtes en mesure de vous connecter en utilisant quelque chose d'autre que l'horrible syntaxe PHP de Curl:
sinon, utilisez (pour les utilisateurs de linux)
Une fois que vous avez établi votre connexion, vous pouvez alors vous lancer dans l’horrible travail d’utiliser PHP Curl. Il y a des emballages, mais ce sont des feuillets que j'ai trouvés.
Curl, Wget ou similaire peuvent être très facilement configurés pour utiliser les méthodes GET et POST. Ce n'est pas conseillé, mais pour plus d'une opération compliquée avec Curl, j'ai tout simplement renoncé à essayer de configurer correctement la bibliothèque de PHP et je l'ai simplement passée en ligne de commande.
IL Y A DES INCIDENCES SUR LA SÉCURITÉ. Vous devez faire très attention à ce que tout ce que vous donnez, en particulier s'il provient d'un formulaire ou d'une source externe, soit correctement échappé.
<?
//Strip out any possible non-alpha-numeric character for security
$stringToSend = preg_replace('[^a-zA-Z]', '', $stringToSend);
$return = Shell_exec("curl -X POST -d $stringToSend http://example.com/path/to/resource");
Avez-vous essayé de SSH sur le serveur qui l'exécute et vérifiez les règles iptables, et/ou essayez de vous connecter via telnet au serveur cible?
sh telnet somesite.tld 8080
Si rien d'autre, cela vous aidera à résoudre votre problème et à éliminer les problèmes de réseau.
Requête CURL GET
simple: (Ajoute également json/en-têtes si nécessaire, pour vous faciliter la vie dans le besoin)
<?php
$chTest = curl_init();
curl_setopt($chTest, CURLOPT_URL, "http://example.com:8080/?query=Hello+World");
curl_setopt($chTest, CURLOPT_HTTPHEADER, array('Content-Type: application/json; charset=utf-8', 'Accept: application/json'));
curl_setopt($chTest, CURLOPT_HEADER, true);
curl_setopt($chTest, CURLOPT_RETURNTRANSFER, true);
$curl_res_test = curl_exec($chTest);
$json_res_test = explode("\r\n", $curl_res_test);
$codeTest = curl_getinfo($chTest, CURLINFO_HTTP_CODE);
curl_close($chTest);
?>
Exemple de requête POST
:
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://example.com:8080');
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json; charset=utf-8', 'Accept: application/json'));
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{"Hello" : "World", "Foo": "World"}');
// Set timeout to close connection. Just for not waiting long.
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
$curl_res = curl_exec($ch);
?>
Charset n'est pas un en-tête HTTP requis, pas plus que les autres. L'important est Content-Type .
Pour les exemples où j'ai utilisé le type JSON MIME, vous pouvez utiliser ce que vous voulez, regardez le lien: http://en.wikipedia.org/wiki/Internet_media_type
Assurez-vous que l'extension php_curl.dll
est activée sur votre php et que les ports sont ouverts sur le serveur cible.
J'espère que cela t'aides.
Maby vous pouvez utiliser --local-port [-num]
Définissez un nombre ou une plage de numéros de port locaux à utiliser pour la ou les connexions. Notez que les numéros de port sont par nature une ressource rare qui sera parfois occupée. Par conséquent, si vous définissez cette plage sur une valeur trop étroite, des échecs de configuration de connexion inutiles risquent de se produire. (Ajouté en 7.15.2)