我有一个我编写的通常直接的 Web 服务(将代码从相同服务的 Java 实现转换为 ZF,并尽可能保持相同的 wsdl 结构)。该服务加载一个 PHP 类,而不是单个函数。 PHP 类中包含三个不同的函数。
一切似乎都工作得很好,除了我似乎无法弄清楚如何指定一个给定的函数参数应该作为 SOAP header 传递。我没有在服务器上下文中看到任何关于 SOAP header 的提及,只看到如何将 header 参数与客户端传递到服务器。
除了将在 SOAP 正文中发送并在文档 block 中详细说明的函数标准参数外,我还想指定两个将在 SOAP header 中发送的参数(用户名和密码)。
我不得不假设这是可能的,但无法在网上找到任何东西,我也没有对 Zend 论坛上的类似帖子有任何回复。是否可以在 docblock 区域中添加一些内容以将参数指定为 header (可能与使用 WebParam 的方式类似?)?任何关于如何实现这一目标的建议/示例将不胜感激!
最佳答案
我自己也遇到了这个问题。我的 SOAP 请求的结构如下:
<SOAP-ENV:Envelope>
<SOAP-ENV:Header>
<Header>
<APIKey>$key</APIKey>
<SiteID>$id</SiteID>
</Header>
</SOAP-ENV:HEADER>
(body)
</SOAP-ENV:Envelope>
因为我的<SOAP-ENV:Header>的内容标签在 <Header> 中外壳,我在我的类中创建了一个公共(public)方法 SoapServer实例加载称为 Header如果 API key 和站点 ID 有效,则将私有(private)类变量设置为 true。我的类中处理请求主体的其他方法然后在继续之前检查该变量是否为真。丑陋,我知道,但正如你提到的,没有文档,这似乎是最简单的方法。它看起来像这样:
class MySoapRequestHandler
{
private $authenticated;
public function Header($data)
{
//your logic here
if($request_is_valid)
{
$this->authenticated = true;
}
else
{
$this->authenticated = false;
}
}
public function ProcessBody($data) //of course named whatever your body element is named
{
if($this->authenticated === true)
{
//process the request
}
else
{
//throw a soap fault?
}
}
}
如果您有更多问题,请告诉我;很乐意尽我所能提供帮助。
关于php - 为 Zend_Soap 服务指定 SOAP 头,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2028672/
我正在尝试使用ruby和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我
我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..
Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack
最近,当我启动我的Rails服务器时,我收到了一长串警告。虽然它不影响我的应用程序,但我想知道如何解决这些警告。我的估计是imagemagick以某种方式被调用了两次?当我在警告前后检查我的git日志时。我想知道如何解决这个问题。-bcrypt-ruby(3.1.2)-better_errors(1.0.1)+bcrypt(3.1.7)+bcrypt-ruby(3.1.5)-bcrypt(>=3.1.3)+better_errors(1.1.0)bcrypt和imagemagick有关系吗?/Users/rbchris/.rbenv/versions/2.0.0-p247/lib/ru
我正在尝试修改当前依赖于定义为activeresource的gem:s.add_dependency"activeresource","~>3.0"为了让gem与Rails4一起工作,我需要扩展依赖关系以与activeresource的版本3或4一起工作。我不想简单地添加以下内容,因为它可能会在以后引起问题:s.add_dependency"activeresource",">=3.0"有没有办法指定可接受版本的列表?~>3.0还是~>4.0? 最佳答案 根据thedocumentation,如果你想要3到4之间的所有版本,你可以这
在Rails4.0.2中,我使用s3_direct_upload和aws-sdkgems直接为s3存储桶上传文件。在开发环境中它工作正常,但在生产环境中它会抛出如下错误,ActionView::Template::Error(noimplicitconversionofnilintoString)在View中,create_cv_url,:id=>"s3_uploader",:key=>"cv_uploads/{unique_id}/${filename}",:key_starts_with=>"cv_uploads/",:callback_param=>"cv[direct_uplo
我有一个这样的哈希数组:[{:foo=>2,:date=>Sat,01Sep2014},{:foo2=>2,:date=>Sat,02Sep2014},{:foo3=>3,:date=>Sat,01Sep2014},{:foo4=>4,:date=>Sat,03Sep2014},{:foo5=>5,:date=>Sat,02Sep2014}]如果:date相同,我想合并哈希值。我对上面数组的期望是:[{:foo=>2,:foo3=>3,:date=>Sat,01Sep2014},{:foo2=>2,:foo5=>5:date=>Sat,02Sep2014},{:foo4=>4,:dat
我刚刚被困在这个问题上一段时间了。以这个基地为例:moduleTopclassTestendmoduleFooendend稍后,我可以通过这样做在Foo中定义扩展Test的类:moduleTopmoduleFooclassSomeTest但是,如果我尝试通过使用::指定模块来最小化缩进:moduleTop::FooclassFailure这失败了:NameError:uninitializedconstantTop::Foo::Test这是一个错误,还是仅仅是Ruby解析变量名的方式的逻辑结果? 最佳答案 Isthisabug,or
我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b
您如何在Rails中的实时服务器上进行有效调试,无论是在测试版/生产服务器上?我试过直接在服务器上修改文件,然后重启应用,但是修改好像没有生效,或者需要很长时间(缓存?)我也试过在本地做“脚本/服务器生产”,但是那很慢另一种选择是编码和部署,但效率很低。有人对他们如何有效地做到这一点有任何见解吗? 最佳答案 我会回答你的问题,即使我不同意这种热修补服务器代码的方式:)首先,你真的确定你已经重启了服务器吗?您可以通过跟踪日志文件来检查它。您更改的代码显示的View可能会被缓存。缓存页面位于tmp/cache文件夹下。您可以尝试手动删除