我正在尝试在另一个域上运行SOAP方法,该方法必须从列入白名单的IP地址接收,但WSDL似乎以某种方式认为请求来自客户端而不是服务器.该调用从表单中收集信息,使用AJAX发布到PHP函数,该函数将字段格式化为API友好格式,然后通过PHP SoapClient发送.
我认为最好的方法是调查使用SoapClient发送的标头,但标头不会列出任何IP地址(主机,连接,用户代理,内容类型,SOAPAction和内容长度).
首先,我阅读了SOAP端点的文档.它没有明确指定要传递的任何特定参数,这无论如何都没有意义,因为我只能伪造一个IP地址.然后,我阅读了PHP SoapClient的文档.有趣的是,我找不到IP地址设置的位置,但我确实找到了一个提及使用的评论'stream_context',但也没有运气.
我也记录了每个请求,包括$_SERVER['SERVER_ADDR']和$_SERVER['REMOTE_ADDR'],它们都按预期报告IP地址; 他们的技术支持告诉我他们正在收到'REMOTE_ADDR'价值请求.
我尝试发送一个简单的请求,并期望除IP地址之外得到一个不同的错误,但我不断收到IP地址问题.
有什么方法可以让我更确定我是否使用适当的(服务器)IP发送SOAP请求?
好吧,我想通了——至少对于我自己的情况来说是这样。您阅读的 PHP 手册中的注释是正确的(假设我们谈论的是同一注释),但是,我还需要在我的 IP 地址上包含端口。所以我最终使用的代码是:
$options = array('socket' => array('bindto' => 'xxx.xxx.xx.xxx:0'));
$context = stream_context_create($options);
$client = new SoapClient($url,
array('trace' => 1, 'exception' => 0, 'stream_context' => $context));
Run Code Online (Sandbox Code Playgroud)
看,之前我没有包含“:0”,我只包含了 IP 地址。所以不要忘记这一点!