PHP 日本大会 2024

SoapClient

(PHP 5, PHP 7, PHP 8)

简介

SoapClient 类提供了一个客户端用于 » SOAP 1.1» SOAP 1.2 服务器。它可以在 WSDL 模式或非 WSDL 模式下使用。

类概要

class SoapClient {
/* 属性 */
private ?string $uri = null;
private ?int $style = null;
private ?int $use = null;
private ?string $location = null;
private bool $trace = false;
private ?int $compression = null;
private ?resource $sdl = null;
private ?resource $typemap = null;
private ?resource $httpsocket = null;
private ?resource $httpurl = null;
private ?string $_login = null;
private ?string $_password = null;
private bool $_use_digest = false;
private ?string $_digest = null;
private ?string $_proxy_host = null;
private ?int $_proxy_port = null;
private ?string $_proxy_login = null;
private ?string $_proxy_password = null;
private bool $_exceptions = true;
private ?string $_encoding = null;
private ?array $_classmap = null;
private ?int $_features = null;
private ?resource $_stream_context = null;
private ?string $_user_agent = null;
private bool $_keep_alive = true;
private ?int $_ssl_method = null;
private ?int $_use_proxy = null;
private array $_cookies = [];
private ?array $__default_headers = null;
private ?SoapFault $__soap_fault = null;
private ?string $__last_request = null;
private ?string $__last_response = null;
/* 方法 */
public __construct(?string $wsdl, array $options = [])
public __call(字符串 $name, 数组 $args): 混合类型
public __doRequest(
    字符串 $request ,
    字符串 $location ,
    字符串 $action ,
    整数 $version ,
    布尔值 $oneWay = false
): ?字符串
public __setCookie(字符串 $name, ?字符串 $value = null): void
public __soapCall(
    字符串 $name ,
    数组 $args ,
    ?数组 $options = null ,
    SoapHeader|数组|null $inputHeaders = null ,
    数组 &$outputHeaders = null
): 混合类型
}

属性

__default_headers

__last_request

__last_request_headers

__last_response

__last_response_headers

__soap_fault

_classmap

_connection_timeout

_cookies

_digest

_encoding

_exceptions

_features

_keep_alive

_login

_password

_proxy_host

_proxy_login

_proxy_password

_proxy_port

_soap_version

_ssl_method

_stream_context

_use_digest

_use_proxy

_user_agent

compression

httpsocket

httpurl

location

sdl

style

trace

typemap

uri

use

目录

添加笔记

用户贡献笔记 9 条笔记

hugues at zonereseau dot com
13 年前
当您需要连接到需要发送额外标头的服务时,请使用此方法。

以下是使用 PHP 和 SoapClient 的方法

<?php
class exampleChannelAdvisorAuth
{
public
$DeveloperKey;
public
$Password;

public function
__construct($key, $pass)
{
$this->DeveloperKey = $key;
$this->Password = $pass;
}
}

$devKey = "";
$password = "";
$accountId = "";

// 创建 SoapClient 实例
$url = "";
$client = new SoapClient($url, array("trace" => 1, "exception" => 0));

// 创建头部
$auth = new ChannelAdvisorAuth($devKey, $password);
$header = new SoapHeader("http://www.example.com/webservices/", "APICredentials", $auth, false);

// 调用wsdl函数
$result = $client->__soapCall("DeleteMarketplaceAd", array(
"DeleteMarketplaceAd" => array(
"accountID" => $accountId,
"marketplaceAdID" => "9938745" // 广告ID
)
),
NULL, $header);

// 输出结果
echo "<pre>".print_r($result, true)."</pre>";
if(
$result->DeleteMarketplaceAdResult->Status == "Success")
{
echo
"项目已删除!";
}
?>
spam at kacke dot de
2年前
如果SOAP响应返回带有属性xsi:nil="false"的节点,则当前php-soapclient不会处理它们。

这似乎是一个错误(不正确)。

解决方法

class mySoapClient extends SoapClient {
public function __doRequest($request, $location, $action, $version, $one_way = 0) {
$response = parent::__doRequest($request, $location, $action, $version, $one_way);
$response = str_replace('xsi:nil="false"',"",$response);
return $response;
}
}

花了我一天时间。希望它能有所帮助
Toppi
Stefan
10年前
一些版本的Xdebug存在已知的错误,这可能会导致SoapClient不抛出异常,而是导致致命错误。

使用xdebug_disable();和xdebug_enable();包围SoapClient调用来解决此问题。

参考

http://bugs.xdebug.org/view.php?id=249
https://bugs.php.net/bug.php?id=47584
info at nospam x valiton x com
9年前
警告
我尝试通过代理向安全URL发出fopen请求时遇到了很多麻烦。我不断从远程主机收到400错误请求。它接收代理URL作为SNI主机。为了解决这个问题,我不得不明确地将SNI主机设置为我试图访问的域。这显然是此错误中概述的问题

https://bugs.php.net/bug.php?id=63519

<?php
$domain
= parse_url($file, PHP_URL_HOST);
$proxy_string = "tcp://" . WP_PROXY_HOST . ":" . WP_PROXY_PORT;
$opts = array(
'http' => array( 'proxy' => $proxy_string ),
'ssl' => array( 'SNI_enabled' => true, 'SNI_server_name' => $domain));
$context = stream_context_create($opts);
$handle = fopen( $file, 'r', false, $context );
?>

来源
https://php.net/manual/en/context.http.php#114314
Ricardo Pedrassani
8年前
如果XML在不同级别具有相同名称的标识,则有一个解决方案。您不必提交原始XML(此PHP SOAP对象不允许发送原始XML),因此您必须始终将XML转换为数组,如下例所示

$originalXML = "
<xml>
<firstClient>
<name>someone</name>
<adress>R. 1001</adress>
</firstClient>
<secondClient>
<name>another one</name>
<adress></adress>
</secondClient>
</xml>"

// 将上面的XML转换为数组,就像PHP SOAP函数所需的那样
$myParams = array('firstClient' => array('name' => 'someone',
'adress' => 'R. 1001'),
'secondClient' => array('name' => 'another one',
'adress' => ''));

$webService = new SoapClient($someURL);
$result = $webService->someWebServiceFunction($myParams);
peter dot hansen at fastit dot net
15年前
当您遇到如下错误时
"致命错误:未捕获的SoapFault异常:[HTTP]获取http标头错误"
在几次(耗时的)SOAP调用后,检查您的Web服务器配置。

有时Web服务器的“KeepAlive”设置会导致此错误。对于SOAP环境,建议您禁用KeepAlive。

提示:为您的SOAP网关创建一个专用的虚拟主机并仅为此虚拟主机禁用keepalive可能会很棘手,因为对于普通网页,KeepAlive是一个不错的速度提升。
acopantepuy at gmail dot com
9年前
当他们想要将变量传递到HTTP标头时,这就是它的使用方法

<?php

$aHTTP
['http']['header'] = "User-Agent: PHP-SOAP/5.5.11\r\n";

$aHTTP['http']['header'].= "username: XXXXXXXXXXX\r\n"."password: XXXXX\r\n";

$context = stream_context_create($aHTTP);

$client=new SoapClient("https://ocppws-cert.extra.bcv.org.ve:443/AltoValor/BancoUniversal?WSDL",array('trace' => 1,"stream_context" => $context));

$result = $client->jornadaActiva();
var_dump($result);
?>
jjlopez
13 年前
如果您正在以WSDL模式进行SOAP调用,并且您的Web服务的地址包含与80不同的端口(例如http://my_ip_address:8080//service.asmx?wsdl),则WSDL文件会正确获取,但所有后续请求都在主机字段中没有任何端口的情况下进行。这会导致在尝试调用服务的任何方法时出现SoapFault异常。

您需要重新定义soapClient类并在每次调用中强制使用端口。

参见此示例

http://www.victorstanciu.ro/php-soapclient-port-bug-workaround/
mcinantyspam at fejm dot pl
8年前
请注意,如果您提供包含非法XML字符(ASCII码0-8、11-12、14-15 - 或十六进制中的x0-x8、xB-xC、xE-xF)的值,php的SoapClient将把它们发送到请求中,尽管此类请求是不正确的,因为它不符合XML 1.0的要求。
您必须始终在将数据提供给SoapClient之前替换或删除这些字符。
To Top