web-dev-qa-db-fra.com

Une erreur HTTP inattendue s'est produite lors de la demande d'API

Je viens de faire une nouvelle installation de Wordpress. Mais j'ai un problème lorsque j'installe ou utilise l'API WordPress. Alors envoie moi un signe

Une erreur HTTP inattendue s'est produite lors de la demande d'API.

La chose étrange est que j'ai regardé partout. Et les solutions ne fonctionnent pas pour moi, principalement Wordpress 3.2.1 et ne savent pas comment résoudre le problème

2
AlejoNext

Utilisez la fonction suivante pour déboguer la demande d'API HTTP. Vous saurez ainsi pourquoi la demande d'API HTTP échoue.

Collez le code suivant dans le fichier function.php de votre thème.

function dump_http_response( $response, $type, $transport, $args, $url ) {
    if ( is_admin() && $type == "response" )  {
        echo '<span style="color: #f00;">';
        var_dump( $response );
        echo '</span>';
    }
}
add_action( 'http_api_debug', 'dump_http_response', 1, 5 );
3
Hameedullah Khan

Ce script vous donne un aperçu général du type de méthode de système de fichiers autorisé/installé sur votre serveur. Les trois premières méthodes sont les méthodes préférées de WordPress et WordPress peut être forcé d’en utiliser une en définissant FS_METHOD dans le wp-config.php.

Copiez le code dans un fichier, téléchargez le fichier sur votre serveur, vérifiez quelles méthodes de système de fichiers sont autorisées/installées et supprimez le fichier au plus vite.

<?php
$yes = '<span style="color:green; font-weight:bold">:)</span>';
$no  = '<span style="color:red; font-weight:bold">:(</span>';
$items = array();

$items['fopen'][0] = 'Opening urls via fopen (for FS_METHOD "direct")';
$items['fopen'][1] = ( TRUE == ini_get( 'allow_url_fopen' ) ) ?
    ' is allowed '.$yes : ' is not allowed '.$no;

$items['ssh2'][0] = 'SSH2 (for FS_METHOD "ssh")';
$items['ssh2'][1] = ( TRUE === extension_loaded( 'ssh2' ) ) ?
    ' is installed '.$yes : ' is not installed '.$no;

$items['ftp'][0] = 'FTP (for FS_METHOD "ftpext")';
$items['ftp'][1] = ( TRUE === extension_loaded( 'ftp' ) ) ?
    ' is installed '.$yes : ' is not installed '.$no;

$items['sockets'][0] = 'Sockets (for FS_METHOD "ftpsockets")';
$items['sockets'][1] = ( TRUE === extension_loaded( 'sockets' ) ) ?
    ' are installed '.$yes : ' are not installed '.$no;

$items['curl'][0] = 'Curl';
$items['curl'][1] = ( TRUE === extension_loaded( 'curl' ) ) ?
    ' is installed '.$yes : ' is not installed '.$no;

echo '<html>';
echo '<ol>';

foreach ( $items as $item ) {
    printf( '<li>%s%s</li>', $item[0], $item[1] );
}

echo '</ol>';
echo '</html>';

Vous pouvez essayer de forcer WordPress à utiliser une méthode de système de fichiers en le définissant dans votre wp-config.php, par exemple. utiliser l'extension ftp php au lieu de fopen:

if ( ! defined( 'FS_METHOD' )
  define( 'FS_METHOD', 'ftpext' );

Cela pourrait être utile si vous rencontrez des difficultés pour utiliser une méthode de système de fichiers et souhaitez en utiliser une autre.

1
Ralf912

L'API "WordPress" est assez vague (WP a plusieurs API). Mais d'après votre erreur, il semble que ce soit un problème d'API HTTP. Il y a plusieurs obstacles possibles:

Problèmes de certificat SSL

Si vous rencontrez un problème avec votre certificat SSL (nécessaire lorsque le serveur est un sous-domaine du site répertorié dans le certificat SSL; utilisez un certificat générique en évite le besoin).

Comme indiqué dans les commentaires, le problème pourrait également provenir du fait que votre serveur contient des certificats racine SSL obsolètes ou manquants .

Problèmes de demande (l'API HTTP WP ne répond pas 200/OK)

Vous pensez que vous n'avez pas cURL disponible et la solution de remplacement fsocketopen n'a pas fonctionné?

Tout d'abord, vous voulez vérifier si la réponse fonctionne. Pour cette tâche, vous pouvez utiliser deux services (les deux vous indiquant des détails légèrement différents):

Ensuite, comme l'a souligné @HameedullahKhan dans sa réponse, il existe un filtre de débogage pour l'API HTTP WP. Ce filtre s'exécute au dernier point absolu de toute demande, juste avant de le restituer au développeur.

<?php
/** Plugin Name: (#28871) Debug WP HTTP API response */
add_action( 'http_api_debug', 'wpse28871_debug_request', 999, 5 );
function wpse28871_debug_request( $response, $type, $class, $args, $url )
{
    printf( '<pre>ResponseData: %s', is_wp_error( $response ) 
        ? $response->get_error_code().' '.$response->get_error_message()
        : $response
    );
    printf( '<br />ResponseType: %s',      $type );
    printf( '<br />ResponseClass: %s',     $class );
    printf( '<br />ResponseArgs: %s',      $args );
    printf( '<br />ResponseURl: %s</pre>', $url );
    # @TODO Uncomment to exit when debugging AJAX requests
    # exit();
}

Si ce qui précède ne vous donne aucune idée, vous pouvez toujours essayer de déboguer l'objet cURL juste après sa construction et juste avant qu'il ne soit déclenché. Cette méthode est assez inconnue, mais elle possède d’énormes pouvoirs lorsque vous la combinez avec le plugin ci-dessus: elle vous indique si la requête a un problème avec les arguments de cURL ou si elle échoue plus tard, ce qui permet de réduire rapidement le nombre de problèmes possibles.

<?php
/* Plugin Name: (#28871) Debug WP HTTP API cURL arguments */
add_action( 'http_api_curl', 'wpse28871_curl_debug' );
function wpse28871_curl_debug( $handle )
{
    printf(
         '<pre>%s</pre>'
        ,var_export( curl_getinfo( $handle, CURLINFO_HEADER_OUT ), true ) )
    );
}
1
kaiser