3

マジェントのインストールをサードパーティの在庫管理アプリ(.net上に構築)に接続しようとしています。しかし、同期は機能していません。サードパーティから、SOAP API が空の応答を返しているとのことです。

PHPで何かを作るときはいつでもAPIがうまく動作するので、私は耳を傾けてきました。さらに、在庫の更新は正常に機能しますが、注文/請求書の情報を取得することはできません (実際には 1% の確率で機能します)。

断続的な性質のため、これはネットワークの問題であるに違いないと感じましたが、多くの検索と mage::log() をコア API ファイルに追加した後、接続が発生し、さらに応答オブジェクトが作成されていることがわかります。マジェント。

だから、SOAP APIで何かが正しくなかったという私の推論(私はバージョン2を使用しています)

soapUI をインストールして統合をセットアップしました。WSDL ファイルからメソッドを正しく受け取りますが、「ログイン」メソッドにアクセスしようとすると、間違ったログインの詳細を入力しても空の応答が返されます。

soapUI は次のエラーを出力します。

エラー: エラーが発生しました [Content-Length で区切られたメッセージ本文が途中で終了しました (予想: 267; 受信: 266]、詳細についてはエラー ログを参照してください)

そのため、http ヘッダーに問題があるように見えますが、一部の関数は応答を返すことができます (もちろん、ログイン ハッシュがなければ無効ですが、少なくとも応答です)。Java と .net に関する私の (非常に限られた) 理解からすると、これらは php よりもこれらの点ではるかに厳密であり、php 統合に問題がない理由を示しています。

このエラーが発生する理由と修正方法を教えてもらえますか?

4

3 に答える 3

3

これとまったく同じ問題が発生したため、WS-I 準拠の SOAP API v2 を使用していると仮定します。そうでない場合でも、これは適用される可能性があります。v2 API が WS-I に準拠していないと接続できませんでした。これが、このバグを発見した理由です。

ファイルを見るapp/code/core/Mage/Api/Model/Server/Wsi/Adapter/Soap.phpと、基本的に 2 つの部分 (WSDL 定義応答用と実際の SOAP 応答用) に分割されている public run 関数が表示されます。

SOAP 応答には、文字列の置換が行われている、置換<soap:operation soapAction=""></soap:operation>されて<soap:operation soapAction="" />いるなどがあります。これは明らかに content-length の計算で問題を引き起こしています。これは WSDL 定義の応答でも発生していますが、問題を引き起こしているようには見えません。

try 中かっこの間のコードを以下のコードに置き換えることで、SOAP API に正常に接続できました。基本的に、文字列の置換が行われた後、ヘッダーをクリアし、コンテンツの長さを再計算することになりました。

            $this->_instantiateServer();

            $content = preg_replace(
                        '/(\>\<)/i',
                        ">\n<",
                        str_replace(
                                '<soap:operation soapAction=""></soap:operation>',
                                "<soap:operation soapAction=\"\" />\n",
                                str_replace(
                                        '<soap:body use="literal"></soap:body>',
                                        "<soap:body use=\"literal\" />\n",
                                        preg_replace(
                                            '/<\?xml version="([^\"]+)"([^\>]+)>/i',
                                            '<?xml version="$1" encoding="'.$apiConfigCharset.'"?>',
                                            $this->_soap->handle()
                                        )
                                )
                        )
                    );

            $this->getController()->getResponse()
                      ->clearHeaders()
                      ->setHeader('Content-Type','text/xml; charset='.$apiConfigCharset)
                      ->setHeader('Content-Length',strlen($content))
                      ->setBody($content);

お役に立てれば

于 2012-10-09T04:26:29.310 に答える
2

変更が必要な V2 バージョンを使用している場合の参照用:

/app/core/Mage/Api/Model/Server/V2/Adapter/Soap.php

62 行目あたりの内容を次のように置き換えtry{}ます。

$this->_instantiateServer();
$content = preg_replace(
    '/<\?xml version="([^\"]+)"([^\>]+)>/i',
    '<?xml version="$1" encoding="'.$apiConfigCharset.'"?>',
    $this->_soap->handle()
);
$this->getController()->getResponse()
    ->clearHeaders()
    ->setHeader('Content-Type','text/xml; charset='.$apiConfigCharset)
    ->setHeader('Content-Length',strlen($content))
    ->setBody($content);

これですべてが解決したわけではありません。すべてを台無しにしていた不思議な空白のインスタンスがいくつかありました。1 つは終了タグの後のスペースで、もう 1 つは顧客が電話番号の末尾に 2 つのスペースを追加したときでした (?? )

とにかく、この2つをクリアするために私はしました...

これですべてが修正されたわけではありません。まだ空白の問題がいくつかありました。すばやく修正するために、いくつかの追加の preg_replace を追加しました。

$content = preg_replace('/\s+/', ' ', $content);
$content = preg_replace('/Envelope> /', 'Envelope>', $content);
于 2012-10-11T01:31:14.953 に答える
0

私にとってうまくいった唯一の解決策は、APIエンドポイントをindex.phpを使用しないように切り替えることでした

変更は次のとおりです。 domain.com/index.php/api/v2_soap/index/wsdl/1

に: domain.com/api/v2_soap/?wsdl=1

URL から index.php が削除されたことに注意してください。このようにして、リクエストは index.php ではなく api.php エントリポイントを通過します。副次的な効果として、api.php がより軽量になったため、API の動作が大幅に高速化されました。

手順:

  • nginx または .htaccess に正しいリダイレクト ルールが設定されていることを確認してください (以下を参照)。
  • マジェントのキャッシュをクリア
  • ブラウザで WSDL を開き (domain.com/api/v2_soap/?wsdl=1)、正しいかどうかを確認します。soap:address ノードに index.php 部分を含めないでください。

    <soap:address location="http://domain.com/api.php/?type=v2_soap"/>

  • クライアント スクリプトで domain.com/api/v2_soap/?wsdl=1 url を使用します。

Nginx の構成:

location /api {
    rewrite ^/api/rest /api.php?type=rest last;
    rewrite ^/api/v2_soap /api.php?type=v2_soap last;
    rewrite ^/api/soap /api.php?type=soap last;
}

アパッチ .htaccess:

行のコメントを外します:

RewriteRule ^api/([a-z][0-9a-z_]+)/?$ api.php?type=$1 [QSA,L]

うまくいかなかった他の解決策は私から:

  • V2/Adapter/Soap.php の編集
  • Wsi/Adapter/Soap.php の編集

私はMagento 1.9.2.4に取り組んでいます

于 2016-03-24T13:00:51.927 に答える