如何在symfony 控制器里面创建soap web service

通过一些工具将一个控制器设置成一个soap服务将会非常简单。首先,你必须安装了php soap扩展。由于php soap扩展现在不能生成wsdl,你要么自己从头开始创建要模使用第三方生成器。

php中有一些可以使用的soap服务接口。Zend SOAP 和 NuSOAP就是其中两个。尽管php soap扩展在这些例子中被使用,通用的思想还是可以被用在其他应用接口。

SOAP 的工作是通过暴露PHP对象给外部实体的(使用soap服务的人)。首先,创建一个Helloservice类-表示你将在你的soap服务中暴露的功能。在下面这个例子中,soap服务允许客户端调用一个hello方法来发送邮件:

// src/Acme/SoapBundle/Services/HelloService.php
namespace Acme\SoapBundle\Services;

class HelloService
{
    private $mailer;

    public function __construct(\Swift_Mailer $mailer)
    {
        $this->mailer = $mailer;
    }

    public function hello($name)
    {

        $message = \Swift_Message::newInstance()
                                ->setTo(‘[email protected]‘)
                                ->setSubject(‘Hello Service‘)
                                ->setBody($name . ‘ says hi!‘);

        $this->mailer->send($message);

        return ‘Hello, ‘.$name;
    }
}

接下来,你可以配置symfony来创建该类的实例。由于该类是用来发送邮件,他需要接收一个swift_mailer实例参数。使用服务容器,你可以很好的配置一个symfony helloservice对象:

# app/config/services.yml
services:
    hello_service:
        class: Acme\SoapBundle\Services\HelloService
        arguments: [‘@mailer‘]

下面是一个调用soap请求的例子。假如indexAction()能通过路由成功访问到,那么wsdl文档就能被返回。

namespace Acme\SoapBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Response;

class HelloServiceController extends Controller
{
    public function indexAction()
    {
        $server = new \SoapServer(‘/path/to/hello.wsdl‘);
        $server->setObject($this->get(‘hello_service‘));

        $response = new Response();
        $response->headers->set(‘Content-Type‘, ‘text/xml; charset=ISO-8859-1‘);

        ob_start();
        $server->handle();
        $response->setContent(ob_get_clean());

        return $response;
    }
}

记下ob_start()ob_get_clean()这两个方法。这些方法可以控制$server->handle()输出。这是很有必要的,因为symfony希望你的控制器返回的对象是它期望的内容。Content-Type也必须设置为"text/xml",因为这是请求端希望的返回类型。因此,你使用ob_start()缓存输出内容,使用ob_get_clean()打印出要返回的内容并清空缓存,最后返回response。

下面的例子是调用nusoap客户端的服务,假设indexAction是可以通过路由成功访问到的。

$client = new \Soapclient(‘http://example.com/app.php/soap?wsdl‘);

$result = $client->call(‘hello‘, array(‘name‘ => ‘Scott‘));

wsdl例子如下

<?xml version="1.0" encoding="ISO-8859-1"?>
<definitions xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
    xmlns:tns="urn:arnleadservicewsdl"
    xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
    xmlns="http://schemas.xmlsoap.org/wsdl/"
    targetNamespace="urn:helloservicewsdl">

    <types>
        <xsd:schema targetNamespace="urn:hellowsdl">
            <xsd:import namespace="http://schemas.xmlsoap.org/soap/encoding/" />
            <xsd:import namespace="http://schemas.xmlsoap.org/wsdl/" />
        </xsd:schema>
    </types>

    <message name="helloRequest">
        <part name="name" type="xsd:string" />
    </message>

    <message name="helloResponse">
        <part name="return" type="xsd:string" />
    </message>

    <portType name="hellowsdlPortType">
        <operation name="hello">
            <documentation>Hello World</documentation>
            <input message="tns:helloRequest"/>
            <output message="tns:helloResponse"/>
        </operation>
    </portType>

    <binding name="hellowsdlBinding" type="tns:hellowsdlPortType">
        <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
        <operation name="hello">
            <soap:operation soapAction="urn:arnleadservicewsdl#hello" style="rpc"/>

            <input>
                <soap:body use="encoded" namespace="urn:hellowsdl"
                    encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
            </input>

            <output>
                <soap:body use="encoded" namespace="urn:hellowsdl"
                    encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
            </output>
        </operation>
    </binding>

    <service name="hellowsdl">
        <port name="hellowsdlPort" binding="tns:hellowsdlBinding">
            <soap:address location="http://example.com/app.php/soap" />
        </port>
    </service>
</definitions>
时间: 2024-10-09 03:47:44

如何在symfony 控制器里面创建soap web service的相关文章

REST和SOAP Web Service的区别比较

本文转载自他人的博客,ArcGIS Server 推出了 对 SOAP 和 REST两种接口(用接口类型也许并不准确)类型的支持,本文非常清晰的比较了SOAP和Rest的区别联系! ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////REST似乎在一夜间兴起了,这可能引起一些争议,反对者可以说REST是

怎样创建.NET Web Service http://blog.csdn.net/xiaoxiaohai123/article/details/1546941

为什么需要Web Service 在通过internet网购买商品后,你可能对配送方式感到迷惑不解.经常的情况是因配送问题找配送公司而消耗你的大量时间,对于配送公司而言这也不是一项增值服务. 为了解决这种问题,配送公司需要在不降低安全级别的情况下了解更多的递送信息,然而安全公司设计的安全系统却非常复杂.那么我们能不能只使用80端口(web服务器端口)并且只通过web服务器提供信息呢?所以,我们建立了一个全新的web应用程序以便从核心商业应用程序中获得数据.配送公司将为些东西付money,所有的公

使用Java创建RESTful Web Service(转)

REST是REpresentational State Transfer的缩写(一般中文翻译为表述性状态转移).2000年Roy Fielding博士在他的博士论文“Architectural Styles and the Design of Network-based Software Architectures”<体系结构与基于网络的软件架构设计>中提出了REST. REST是一种体系结构.而HTTP是一种包含了REST架构属性的协议. REST基础概念 在REST中所有东西都被看作资源.

翻译-使用Spring调用SOAP Web Service

原文链接: http://spring.io/guides/gs/consuming-web-service/ 调用SOAP web service 本指南将指导你使用Spring调用一个基于SOAP的web service的整个过程. 指南内容 你将构建一个客户端,使用SOAP用来从远端的基于WSDL的web service获取天气数据.请访问http://wiki.cdyne.com/index.php/CDYNE_Weather进一步获取该天气服务的信息. 该服务根据邮编返回天气预测.你可

翻译-使用Spring WebService生成SOAP Web Service

原文链接:http://spring.io/guides/gs/producing-web-service/ 生成SOAP web service 该指南将带领你使用Spring创建一个基于SOAP的web service的整个过程. 指南内容 你将创建一个服务,该服务通过一个基于WSDL的SOAP web service向外暴露欧洲国家的数据. 注意:为了简化该示例,你将使用硬编码方式嵌入英国,西班牙及波兰. 准备事项 15分钟 喜爱的编辑器或IDE JDK1.6或更高版本 Gradle 1.

SOAP/Web Service/WSDL关系

转载----------------------------------------------- 最近看了xml schema,xpah,和xslt的相关内容,感觉wsdl就是一个soap的schema,一个soap就是一个wsdl的实例,实际上wsdl就是整个webservice的schema. 从这个角度看,要学好soap,不如从xml schema开始,然后转到wsdl的学习,这样webservice就没有其他理论上的东西可学了.就剩下类库内的函数如何使用的问题了. 对SOAP/Web

SOAP web service用AFNetWorking实现请求

问: This is my current call to (asmx) SOAP web service: NSString *soapMessage = [NSString stringWithFormat: @"<?xml version=\"1.0\" encoding=\"utf-8\"?>" "<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XM

(转)白痴理解的SOAP/Web Service/WSDL关系

以前也曾经写过简单的WebService,但是并没有深入的研究,这两天看了园子里的一些文章,又请教了身边的高人,把SOAP.Web Service和WSDL的关系大概搞明白了,举例说明如下: X局有两个副局长A和B,A副局长分管财务,B副局长分管计划生育,但是A副局长是上海人,B副局长是 广东人,两个人又都只会说自己家乡的方言,不会说普通话,这让下面的工作人员在请示汇报的时候非常困难,为了解决这个问题,局里的科员小c发明了一个表 格,表格列出了需要向局长请示的问题以及说明这个问题所需要的数据等等

Spring Boot调用SOAP Web Service

Spring Boot项目中,调用遗留的SOAP Web Service,方法很简单,仅需引入spring-boot-starter-web-services. <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web-services</artifactId> </dependency> WebServic