4

Magento Enterprise 1.11 用のカスタム API を作成しました。Soap v1 を介して API を呼び出すと、ローカルの開発環境では問題なく動作しますが、ローカル環境からリモート環境への呼び出しを行うことができません。

localdev で PHP インタラクティブ シェルを使用する:

php > $client = new SoapClient(WSDL_URI,array('trace'=>1));
php > $client->login(API_USER,API_KEY);
php > var_dump($client->__getLastResponse());
string(538) "<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="urn:Magento" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><SOAP-ENV:Body><ns1:loginResponse><loginReturn xsi:type="xsd:string">f0eec73e49665aaf9cc4a6644fba5dc6</loginReturn></ns1:loginResponse></SOAP-ENV:Body></SOAP-ENV:Envelope>

これは、ローカルホストからだけでなく、開発マシンで実行されている 2 つのローカル VM 間でも正常に実行できました。カスタム API のメソッドにも問題なくアクセスできます。

ただし、リモート テスト環境に対して SOAP クライアントを作成しようとすると、クライアントを作成できますが、$client->login() への呼び出し、または後続の呼び出しの結果は次のようになります。

php > $client = new SoapClient(REMOTE_WSDL_URI,array('trace'=>1));
php > $client->login(API_USER,API_KEY);
PHP Warning:  Uncaught SoapFault exception: [WSDL] SOAP-ERROR: Parsing WSDL: Couldn't load from 'http://REMOTE_HOST/index.php/api/index/index/wsdl/1/' : failed to load external entity "http://REMOTE_HOST/index.php/api/index/index/wsdl/1/" in php shell code:1
Stack trace:
#0 php shell code(1): SoapClient->__call('login', Array)
#1 php shell code(1): SoapClient->login(API_USER, API_KEY)
#2 {main}
php > var_dump($client->__getLastRequestHeaders());
string(255) "POST /index.php/api/index/index/ HTTP/1.1
Host: REMOTE_HOST
Connection: Keep-Alive
User-Agent: PHP-SOAP/5.3.18-1~dotdeb.0
Content-Type: text/xml; charset=utf-8
SOAPAction: "urn:Mage_Api_Model_Server_HandlerAction"
Content-Length: 550

php > var_dump($client->__getLastResponseHeaders());
string(840) "HTTP/1.1 500 Internal Service Error
Date: Mon, 11 Feb 2013 19:06:56 GMT
Server: Apache/2.2.16 (Debian)
X-Powered-By: PHP/5.3.19-1~dotdeb.0
Set-Cookie: PHPSESSID=7uqrcmiv96hroubnb1uu7c7cm6; expires=Wed, 13-Feb-2013 01:06:56 GMT; path=/; domain=.REMOTE_HOST; HttpOnly
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Set-Cookie: CUSTOMER=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; path=/; domain=.REMOTE_HOST; httponly
Set-Cookie: CUSTOMER_INFO=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; path=/; domain=.REMOTE_HOST; httponly
Set-Cookie: CUSTOMER_AUTH=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; path=/; domain=.REMOTE_HOST; httponly
Content-Length: 468
Vary: Accept-Encoding
Connection: close
Content-Type: text/xml; charset=utf-8

php > var_dump($client->__getLastResponse());
string(468) "<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Body><SOAP-ENV:Fault><faultcode>WSDL</faultcode><faultstring>SOAP-ERROR: Parsing WSDL: Couldn't load from 'http://REMOTE_HOST/index.php/api/index/index/wsdl/1/' : failed to load external entity "http://REMOTE_HOST/index.php/api/index/index/wsdl/1/"
</faultstring></SOAP-ENV:Fault></SOAP-ENV:Body></SOAP-ENV:Envelope>

//REMOTE_HOST/index.php/api/?wsdl を押すと、標準の Magento WSDL が取得されます。

2 つの環境は 99.99% 同一です。

  • サーバーのバージョン: Apache/2.2.16 (Debian) (ローカル開発とリモートの両方)
  • PHP 5.3.18 (ローカル dev) 5.3.19 (リモート ホスト)
  • Apache/PHP の構成は同じです。
  • コードベースは同一

次のような手がかりを得るためにインターウェブを精査しました。

sedond-to-last リンクに記載されている「Content-Length」ヘッダーの修正を試しましたが、他に考えられるすべてのことを試しました...困惑しました。

4

2 に答える 2

14

コンピュータからWSDL URL ( http://REMOTE_HOST/index.php/api/index/index/wsdl/1/) を読み込むことはできますが、リモート サーバーはREMOTE_HOST.

PHP の SoapServer オブジェクト (Magento の実装で使用) は、どのメソッドが公開されているかを知るために WSDL に接続する必要があります。

理由はわかりませんが、サーバーが独自の DNS エントリにアクセスできないのは、一般的なネットワーク構成です。SSH経由でサーバーに接続し、次を実行してみてください

curl http://REMOTE_HOST/index.php/api/index/index/wsdl/1/

REMOTE_HOST私の推測では、ネットワーク タイムアウトまたは不明なエラーが発生するでしょう。サーバーが自分自身にアクセスできるように構成を修正すると、すべてが機能し始めるはずです。

于 2013-02-12T01:01:56.940 に答える