17
votes

My problem is very common. I read almost all topics on stackoverflow about this issue, but still can not do thing work. My code is :

ini_set("soap.wsdl_cache", "0");
ini_set("soap.wsdl_cache_enabled", "0");
$proxy = new SoapClient('http://Myhostname/api/soap?wsdl');

I had this error :

Error WSDL: SOAP-ERROR: Parsing WSDL: Couldn't load from 
'http://Myhostname/api/soap?wsdl' : failed to load external entity 
"http://Myhostname/api/soap?wsdl"

In the browser the URL

http://Myhostname/api/soap?wsdl

works great (returns an xml response)

I try this code to see if PHP can reach this URL :

if (file_get_contents('http://Myhostname/api/soap?wsdl') === false) {
    echo "ERROR: file_get_contents <br/>";
}

It displays me my error "ERROR: file_get_contents", so it does not work. On the forums I saw that to solve this problem I must add hostname into OS "hosts" file. So I did it. In my hosts file I added this line 127.0.0.1 Myhostname

But it still does not work. Then I changed URL in my code to

http://localhost/Myhostname/api/soap?wsdl

but it does not work either.

I tried another solution I found on the internet. For some people it worked. In my URL I changed '?' character to '.'. So my new URL became

http://localhost/Myhostname/api/soap.wsdl

but it does not work either.

I saw official SOAP doc! And tried to create SoapClient object in different way (with options like 'proxy_host' and 'proxy_port'). But this did not help me.

It's my second day I try to solve this problem, but I can not. I am doing my internship, I do not have a lot of experience, so maybe I did not try solutions I found correctly. Maybe someone can help. I would be very pleased.

4
I think that in some cases, you can't file_get_contents() to your hostname from the server itself behind that hostname. Have you tried running this code from a local environment? - kalenjordan
Have you tried http://127.0.0.1/Myhostname/api/soap?wsdl? - Francis Kim
Actually it was some kind of server configuration problem. My supervisor fixed it. Thank you anyway guys. - Kalitine
Did the supervisor tell you what the config problem was? Could come in handy for all others looking for it ;) - tvgemert
I am trying to solve the same problem for one whole day and still not able to solve it. Would you please share what the config problem was? - David

4 Answers

3
votes

Few steps to check

Have a ping to Myhostname. It would give the ip. Use ip instead and see

Check if the services are enabled S0AP, php_openssl, openssl, curl

Hope you would get it :)

2
votes

I have the similar problem, I solve it uncommenting -MultiViews from .htaccess file, and later from Apache configuration of local website.

My working Apache configuration is:

<Directory /var/www/>
        Options Indexes FollowSymLinks -MultiViews
        AllowOverride All
        Order allow,deny
        allow from all
</Directory>

You can try also url:

http://localhost/Myhostname/api.php?type=soap&wsdl

if you use community edition.

1
votes

instead of $proxy = new SoapClient('http://Myhostname/api/soap?wsdl');
try $proxy = new SoapClient(WSDLFILENAME);
where WSDLFILENAME is the OS name of the WSDL file. This has the additional benefit of making one client-server roundtrip less.

0
votes

I tried the SOAP Web Services on my local host and it was working fine. The reason why the Magento was not able to give a response to the request was because it was not able to verify SSL Certificates enabled on the site.

The way I resolved it was to allow self signed SSL verification:

$opts = [
    'http' =>
     [
         'header' => "Authorization: Bearer ".$token
        ],
'ssl' => [
    'allow_self_signed' => true , 
    'verify_peer' => false, 
    'verify_peer_name' => false]
];
$context = stream_context_create($opts);

I hope it helps. ;)