V2 SOAP WSDLによって返される誤ったロケーションURL


7

このURLを介してV2 WSDLをフェッチする場合:

www.example.com/shop/api/v2_soap?wsdl=1

リクエストに対して間違ったURLを定義しています:

<service name="MagentoService">
  <port name="Mage_Api_Model_Server_V2_HandlerPort" binding="typens:Mage_Api_Model_Server_V2_HandlerBinding">
    <soap:address location="http://example.com/shop/index.php/?type=v2_soap"/>
  </port>
</service>

上記を見るとわかるように、次のURLを返しています。

www.example.com/shop/index.php/?type=v2_soap

それははずですが:

www.example.com/shop/index.php/api/v2_soap/index/

私は多くのMagentoコアコードを調べてみましたが、53行目あたりの値は/app/code/core/Mage/Api/Model/Wsdl/Config/Base.phpに設定されていると思います。

    // set up default WSDL template variables
    $this->_wsdlVariables = new Varien_Object(
        array(
            'name' => 'Magento',
            'url'  => htmlspecialchars(Mage::getUrl('*/*/*', array('_query' => $queryParams)))
        )
    );

この部分が失敗しているようです:

Mage::getUrl('*/*/*' ...

それを次のように変更した場合:

Mage::getUrl('api/v2_soap/index' ...

正しいURLが返されます。

この質問はまったく同じ問題を説明しているようですが、答えはありませんでした。

助けてくれてありがとう!

更新

この問題の解決策はまだ見つかっていませんが、少し調べてみると一時的な解決策が見つかりました。基本的に、SoapClientクラスを拡張し、リクエストをインターセプトしてリクエストが送信される前にロケーションURLを微調整する手段として__doRequestメソッドをオーバーライドします。

class SoapClientLocation extends \SoapClient
{
    public function __doRequest( $req, $location, $action, $version = SOAP_1_1, $one_way = NULL )
    {
        $location = str_replace( '?type=v2_soap', 'api/v2_soap/index/', $location, $one_way );
        return parent::__doRequest( $req, $location, $action, $version );
    }
}

 $this->client = new SoapClientLocation( $this->config['api']['url'] );

システム->設定->ウェブ-> URLオプション->ベースURLへの自動リダイレクト。これを「いいえ」に設定します
B00MER

何度か試してみましたが、効果がないようです。
forgueam 2015

回答:


2

2つの問題が考えられます。

  1. www.example.com/shop/index.php/api/v2_soap/?wsdl代わりに 使用www.example.com/shop/api/v2_soap?wsdl=1(追加されたに注意 index.php
  2. error_reporting/ を無効にしたことを確認してdisplay_errorsくださいindex.php

最後のポイントについての長いメモ:SoapClientはブラウザではないためCookieを送信しません。MagentoはCookieを好み、Magentoは通知をスローします(error_reportingが有効になっている場合)、通知はXMLを無効にします/しませんロードします。(SOAP-ERROR: Parsing WSDL: Couldn't find <definitions>


index.php /をURLに追加しようとしましたが、役に立たないようでした。エラー報告を調べてみましょう。先端をありがとう!
forgueam 2015

0

問題は

Mage_Api_Controller_Action::preDispatch()

現在のストアを「admin」に設定します(詳細はAlanのブログ投稿http://alanstorm.com/magento_api_adapater_xml_rpc

「ベースURLへの自動リダイレクト」が設定されている場合、APIにアクセスできません。

私の解決策は聞いた

controller_front_init_before

URIに「api」が含まれている場合は、その構成ノードをゼロにします。すなわち

public function controllerFrontInitBefore($observer) {
    if (stristr(Mage::app()->getRequest()->getRequestUri(), 'api')) {
        Mage::getConfig()->setNode('stores/' . Mage::app()->getStore()->getCode() . '/web/url/redirect_to_base', 0);
    }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.