79 votes

http_build_query() sans encodage d'url

Est-il possible d'utiliser http_build_query() sans que l'URL soit encodée selon une norme RFC ?

Pourquoi je ne veux pas tout encoder en URL : J'interroge l'API Ebay Ils insistent honnêtement sur le fait que les noms des paramètres ne sont pas encodés dans l'URL, jusqu'aux virgules entre parenthèses. Par exemple, DomainName(0) est un paramètre, et la requête échoue si ces parenthèses sont encodées.

163voto

UserJA Points 336

Vous pouvez utiliser urldecode() sur une chaîne de résultats que vous obtenez à partir de la fonction http_build_query()

7voto

Basil Musa Points 730

PHP 5.3.1 (comportement bogué) http_build_query DOES échappe le caractère esperluette '&' qui relie les paramètres. Exemple : user_id=1&setting_id=2 .

PHP 5.4+ http_build_query N'EST PAS échappe le caractère esperluette '&' qui relie les paramètres. Exemple : user_id=1&setting_id=2

Exemple :

$params = array(
    'user_id' => '1', 
    'setting_id' => '2'
);
echo http_build_query($params);

// Output for PHP 5.3.1:
user_id=1&setting_id=2   // NOTICE THAT: '&' character is escaped

// Output for PHP 5.4.0+:
user_id=1&setting_id=2       // NOTICE THAT: '&' character is NOT escaped

Solution pour cibler plusieurs versions

Option 1 : Écrire une fonction d'encapsulation :

/** 
 * This will work consistently and will never escape the '&' character
 */
function buildQuery($params) {
    return http_build_query($params, '', '&');
}

Option n° 2 : Abandonnez la fonction http_build_query et écrivez la vôtre.

6voto

alex Points 186293

Non, il semble toujours vouloir encoder (ce qui est normal, il est censé encoder l'URL lorsqu'il construit une liste de paramètres pour une URL).

Vous pouvez faire votre propre...

$params = array('a' => 'A', 'b' => 'B');

$paramsJoined = array();

foreach($params as $param => $value) {
   $paramsJoined[] = "$param=$value";
}

$query = implode('&', $paramsJoined);

CodePad .

4voto

onteria_ Points 18947

Vous pouvez essayer leur API JSON à la place. J'ai essayé d'obtenir un exemple fonctionnel, mais je n'ai pas de nom d'application et je ne peux donc pas vérifier le résultat. Voici le code :

<?php
$appName = "Your App Name Here";

$post_data = array(
  'jsonns.xsi' => 'http://www.w3.org/2001/XMLSchema-instance',
  'jsonns.xs' => 'http://www.w3.org/2001/XMLSchema',
  'jsonns.tns' => 'http://www.ebay.com/marketplace/search/v1/services',
  'tns.findItemsByKeywordsRequest' => array(
    'keywords' => 'harry potter pheonix'
  )
);

$headers = array(
  "X-EBAY-SOA-REQUEST-DATA-FORMAT: JSON", 
  "X-EBAY-SOA-RESPONSE-DATA-FORMAT: JSON",
  "X-EBAY-SOA-OPERATION-NAME: findItemsByKeywords",
  "X-EBAY-SOA-SECURITY-APPNAME: $appName"
);

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, 'http://svcs.ebay.com/services/search/FindingService/v1');
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($post_data));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

$result = curl_exec($ch);
if($result) {
  $response = json_decode($result);
}

curl_close($ch);
?>

Vous devez remplir $appName avec le nom de l'application. De même, le X-EBAY-SOA-OPERATION-NAME devra correspondre à l'appel réel, et le JSON devra être modifié si l'appel est différent.

4voto

barius Points 1484

Http_build_query() est INVALIDE sans urlencoding. Peut-être l'avez-vous codé deux fois par accident ? Par exemple, essayez de construire une requête http pour ce tableau :

$params = array('a' => 'a&b=b');

Sans encodage, vous obtiendriez

a=a&b=b

Une fois correctement encodé, vous obtiendrez

a=a%26b%3Db

ce qui est correct. Si vous sautez l'encodage, veillez à éviter les attaques par injection d'URL.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X