2017-07-12 2 views
0

Essayer d'aider quelqu'un qui essaie d'accéder et API en utilisant PHP. Mon code utilisant ColdFusion fonctionne bien sur l'API, mais nous ne pouvons pas faire fonctionner le PHP. Dans CF le code utilise urlParams pour envoyer les données:cURL publiez-vous des données dans la portée de l'URL et non dans la portée du formulaire?

<cfhttp url="https://example.com/_api/proxyApi.cfc" method="post" result="httpResult" charset="UTF-8"> 
    <cfhttpparam type="url" name="method" value="apiauth"/> 
    <cfhttpparam type="url" name="argumentCollection" value="#jsData#"/> 
</cfhttp> 

Une décharge de l'appel résultant de l'API montre les variables dans l'URL comme ceci: enter image description here

method = apiauth est la principale fonction d'autorisation , puis la chaîne json dans argumentCollection est passée à la fonction de correction dans l'API par apiauth. De PHP, son curl est affiché sous forme de données de formulaire, pas d'URL et l'API se plaint que les informations requises sont manquantes, car il est dans la mauvaise portée. J'ai essayé de comprendre comment faire champ URL CURL à la place:

$curl = curl_init(); 
curl_setopt_array($curl, array(
    CURLOPT_RETURNTRANSFER => true, 
    CURLOPT_URL => $target_url, 
    CURLOPT_POST => 1, 
    CURLOPT_FOLLOWLOCATION => true, 
    CURLOPT_MAXREDIRS  => 2, 
    CURLOPT_AUTOREFERER => true, 
    CURLOPT_POSTFIELDS => array(
     'method' => 'apiauth', 
     'argumentCollection' => $json 
    ) 
)); 

La même décharge de l'API montre les mêmes données, mais dans le mauvais champ:

enter image description here

Il semble que si nous pouvons obtenir les données dans la bonne portée, nous progresserons, mais mes connaissances en PHP sont dangereusement limitées.

Répondre

1

Vous envoyez un POST vide dans votre exemple CF.

<cfhttpparam type="url" est traité en tant que paramètre de chaîne de requête, comme dans:

https://example.com/_api/proxyApi.cfc?method=apiauth&argumentCollection=...

Ainsi votre décharge du champ d'URL (la chaîne de requête valeur-clé associé) affiche les données.

Pour mettre ces paramètres dans votre corps POST, vous utilisez:

<cfhttpparam type="formfield"

Et puis vous remplissez le formulaire portée montrerait les données. Votre cURL PHP fait ce dernier: il ajoute vos paramètres au corps du POST.

Si vous voulez que le cURL pour travailler comme un exemple de code CF, faire à la place:

// add the parameters to the URL's query string 
// start with & instead of ?, if the URL already contains a query string, see comment below snippet 
$target_url .= '?'.'method=apiauth'.'&'.'argumentCollection='.urlencode($json); 

$curl = curl_init(); 
curl_setopt_array($curl, array(
    CURLOPT_RETURNTRANSFER => true, 
    CURLOPT_URL => $target_url, 
    CURLOPT_FOLLOWLOCATION => true, 
    CURLOPT_MAXREDIRS  => 2, 
    CURLOPT_AUTOREFERER => true 
)); 

aucune chaîne de requête dans $target_url:

$target_url = 'https://example.com/_api/proxyApi.cfc'; 
$target_url .= '?'.'method=apiauth'.'&'.'argumentCollection='.urlencode($json); 

chaîne de requête dans $target_url:

$target_url = 'https://example.com/_api/proxyApi.cfc?p='; 
$target_url .= '&'.'method=apiauth'.'&'.'argumentCollection='.urlencode($json); 

Sur une note de côté: Vous ne voulez probablement pas envoyer JSON via la chaîne de requête car la chaîne de requête a une limite d'environ 2000 caractères (dépend du navigateur et du serveur web). Si votre JSON est complexe, votre chaîne de requête sera tronquée et tout gâcher. Utilisez le corps POST pour cela à la place.