gpt4 book ai didi

php - SoapServer() 调用无法访问 wsdl 文件

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:49:11 29 4
gpt4 key购买 nike

我有一个基于 symfony 的产品,我必须在其中公开一个 Soap API。我已经创建了 wsdl 文件,在输入用户名和密码进行基本的 http 身份验证检查后,可以从浏览器访问该文件。

当我使用 SoapClient 调用该 API 并通过 header 提供用户名和密码时,它能够访问 WSDL 并调用 SoapServer 端点。但是当 SoapServer() 调用那个 wsdl 链接时,它显示错误。

SoapClient():

$client = new \SoapClient('http://example.com/soaptest?wsdl', array(
"exceptions" => 0,
"trace" => 1,
'stream_context' => stream_context_create(array(
'http' => array(
'header' => "Authorization: Basic " . base64_encode("$username:$password")
),
)),
));

SoapServer():

ini_set("soap.wsdl_cache_enabled", "0");

$server = new SoapServer($wsdl); //Here SoapServer not able to access WSDl because of .htaccess

$server->setObject($this->get($class));
ob_start();
$server->handle();
$result = ob_get_clean();

return $result;

我也有一个 .htaccess 作为:

DirectoryIndex app.php



<IfModule mod_negotiation.c>
Options -MultiViews
</IfModule>

<IfModule mod_rewrite.c>
RewriteEngine On


RewriteCond %{REQUEST_URI}::$1 ^(/.+)/(.*)::\2$
RewriteRule ^(.*) - [E=BASE:%1]


RewriteCond %{HTTP:Authorization} .
RewriteRule ^ - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]


RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^app\.php(?:/(.*)|$) %{ENV:BASE}/$1 [R=301,L]


RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^ - [L]


RewriteRule ^ %{ENV:BASE}/app.php [L]
</IfModule>

<IfModule !mod_rewrite.c>
<IfModule mod_alias.c>

RedirectMatch 302 ^/$ /app.php/# RedirectTemp cannot be used instead
</IfModule>
</IfModule>
php_value date.timezone UTC

AuthType Basic
AuthName "Login"
AuthUserFile /etc/apache2/config/.htpasswd

Require expr %{REQUEST_URI} !~ m#^/(admin|login|soaptest)#
Require valid-user
#<RequireAll>
# Require ip 127.0.0.1
#</RequireAll>

所以这里控制转到 SoapServer() 调用,但是在尝试访问 SoapServer() 中的 wsdl 时它显示:-

Error {"500":"Error: SOAP-ERROR: Parsing WSDL: Couldn't load from 'http://example.com/soaptest?wsdl' : failed to load external entity "http://example.com/soaptest?wsdl""}

那么有没有办法在 SoapServer 调用中提供基本身份验证用户名和密码? 因为我认为 SoapServer 在查找 WSDl 文件时无法访问该链接。所有文件都在同一台服务器上。并且没有进行外部调用

我也从 SoapUI 尝试过,但发生了同样的错误。

.htaccess 中的最后 3 行在一定程度上帮助解决了这个问题,但是有没有更好的方法来解决这个问题?

.htaccess 是我的项目所必需的,因此无法删除。

最佳答案

您确定 SoapServer 能够将 URL 用作 WSDL 文件吗?它应该是本地文件,而不是远程文件。如果有效,可能是因为 PHP 可以使用 fopen 包装器加载 URL 资源,就像它们在本地机器上一样。请参阅此处的示例: http://php.net/manual/en/soapserver.soapserver.php

关于php - SoapServer() 调用无法访问 wsdl 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47551362/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com