web-dev-qa-db-ja.com

APIリクエスト中に予期しないHTTPエラーが発生しました

私はちょうどWordpressのクリーンインストールをしました。しかし、WordPress APIをインストールまたは使用するときに問題があります。だから私にサインを送る

API要求中に予期しないHTTPエラーが発生しました。

奇妙なことに、私は至る所で見たことがあります。そして解決策は私のお気に入りのWordpress 3.2.1ではうまくいかず、問題を解決する方法がわかりません。

2
AlejoNext

次の関数を使ってHTTP APIリクエストをデバッグすると、HTTP APIリクエストが失敗した実際の理由を知ることができます。

テーマのfunction.phpに次のコードを貼り付けます。

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

このスクリプトはあなたのサーバーにどんな種類のファイルシステムが許されているか/インストールされているかの大まかな概要をあなたに与えます。最初の3つの方法はWordPressが推奨する方法であり、WordPressはFS_METHODwp-config.phpを定義することによってそれらのうちの1つを使用することを強制することができます。

コードをファイルにコピーし、そのファイルをあなたのサーバーにアップロードし、どのファイルシステムメソッドが許可されているか、そしてインストールされているかチェックし、そしてそのファイルをできるだけ早く削除してください。

<?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>';

あなたのwp-config.phpでそれを定義することによってWordPressにファイルシステムメソッドを使わせることを試みることができます。 fopenの代わりにphp ftp拡張子を使うには:

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

ファイルシステムメソッドの使用に問題があり、別のものを使用したい場合、これは役に立ちます。

1
Ralf912

"WordPress API"はかなりあいまいです(WPは複数のAPIを取得しました)。しかし、あなたのエラーから、それはHTTP APIの問題のようです。考えられる障害は複数あります。

SSL証明書の問題

SSL証明書に問題がある場合 (サーバーがSSL証明書に記載されているサイトのサブドメインの場合に必要。 を使用/ wildcard certificate はこれを不要にします。

コメントで指摘されているように、問題はあなたのサーバが古くなっているか欠けている SSL CAルート証明書 かもしれません。

問題を要求する(WP HTTP APIが200/OKに応答しない)

あなたはあなたがcURLを手に入れることができず、fsocketopenフォールバックがうまくいかなかったと思いますか?

まず、あなたは応答がうまくいったかどうかをチェックしたいです。このタスクでは、2つのサービスを使用することができます(どちらも詳細が少し異なります)。

それから@HameedullahKhanが彼の答えで指摘したように、WP HTTP APIのためのデバッグフィルタがあります。このフィルタは、開発者に返す直前に、リクエストの絶対的な最後の時点で実行されます。

<?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();
}

上記の方法で何も洞察が得られない場合でも、cURLオブジェクトを構築した直後、起動される直前にデバッグすることができます。この方法はあまり知られていませんが、上記のプラグインと組み合わせると非常に大きな力を発揮します。それは、リクエストにcURL引数に関する問題があるか、後で失敗したかを示します。

<?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