PHP SoapClient如何为所有请求添加X-Api-Key等自定义HTTP头
问题描述
我在使用SoapClient时,尝试在stream_context中添加自定义头(X-Api-Key),代码如下:
$stream = array('stream_context' => stream_context_create(array( 'http' => array( 'header' => 'Content-Type: application/soap+xml; charset=utf-8; X-Api-Key: XXXXX' ), ))); $soapOptions = array( 'trace' => 1, 'exceptions' => 1, 'login' => $this->AUTH_BASIC_USER, 'password' => $this->AUTH_BASIC_PASS, 'soap_version' => SOAP_1_2, 'use' => SOAP_LITERAL, ); $client = new \SoapClient($this->SOAP_URL . 'customer?wsdl=single', $soapOptions + $stream);
上述配置运行正常,可正常获取可用方法,说明客户端实例可正常加载WSDL。但调用任意方法时,X-Api-Key头丢失,返回401错误。
查看实际发起的请求头可以发现X-Api-Key确实缺失:
POST /ws/soap/v1/customer HTTP/1.1\r\n Host: api-test.XXX.com\r\n Connection: Keep-Alive\r\n User-Agent: PHP-SOAP/8.0.3\r\n Content-Type: application/soap+xml; charset=utf-8; action="create"\r\n Content-Length: 605\r\n Authorization: Basic XXX=\r\n
请问如何为该客户端实例的所有请求添加自定义HTTP头?
原因说明
你将X-Api-Key参数拼接在了Content-Type的同一行定义中,PHP SoapClient处理实际SOAP调用时,会自动重写Content-Type头补充action参数,导致整行原Content-Type配置被覆盖,拼接在后面的X-Api-Key也随之丢失。
解决方案
将stream_context中的header配置改为数组格式,每个请求头单独定义,即可避免被覆盖:
$stream = array('stream_context' => stream_context_create(array( 'http' => array( 'header' => array( 'Content-Type: application/soap+xml; charset=utf-8', 'X-Api-Key: XXXXX' ) ), ))); // 原有soapOptions配置无需修改 $soapOptions = array( 'trace' => 1, 'exceptions' => 1, 'login' => $this->AUTH_BASIC_USER, 'password' => $this->AUTH_BASIC_PASS, 'soap_version' => SOAP_1_2, 'use' => SOAP_LITERAL, ); $client = new \SoapClient($this->SOAP_URL . 'customer?wsdl=single', $soapOptions + $stream);
修改后所有该实例发起的请求都会自动携带X-Api-Key头,你可以通过$client->__getLastRequestHeaders()方法验证请求头是否符合预期。
内容的提问来源于stack exchange,提问作者elniño
相关产品推荐
相关产品推荐

