使用REST在PHP中生成对象

时间:2009-05-20 05:59:30

标签: php xml rest soap

我正在尝试决定是否应该为我正在制作的一些面向Web的函数使用REST服务或SOAP服务。这个决定是基于我是否可以在实现中轻松使用REST服务。我更喜欢使用REST,尽管我不想花几天时间在PHP中编写对象模型。

这些服务是在.NET中开发的,但主要由PHP使用。

基本上它已经归结为一点:易于整合。在PHP中使用SOAP我可以使用NuSOAP库,它将生成对象模型。

然而,使用REST,我似乎找不到轻松生成该模型的方法,如果可行,我会使用REST服务,因为它们更容易记录和扩展,并且还具有JSON功能。

我可以从XML文件/模式生成PHP中的对象模型,然后我可以使用REST服务进行序列化吗?

7 个答案:

答案 0 :(得分:6)

你甚至可能不必去班级路线。简单地使用simplexml摄取数据,然后将其遍历为对象。或者如果你有json,json_decode($data, TRUE)会做同样的事情(括号中没有属性)。

$ch = curl_init("http://example.com/some/rest/endpoint");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$data = curl_exec($ch);

$obj = simplexml_load_string($data);
print $obj->some->data->you['need'];

如果您的XML类似于

,则会打印here
<_>
 <some>
  <data>
   <you need="here" />
  </data>
 </some>
</_>

答案 1 :(得分:0)

我在让SOAP在不同语言之间工作时遇到了一些麻烦(PHP&lt;&gt; JAVA和PHP&lt;&gt; .NET)

如果您使用SOAP,可能需要查看WS-I (Web Services Interoperability)

答案 2 :(得分:0)

根据您描述的要求,您应该坚持使用SOAP世界。请记住,REST只是一种架构分布式接口的风格。它没有说明如何实现该接口的功能。当然不需要将模式映射到对象。

话虽如此,如果您查看WCF REST Starter工具包中的客户端工具,您会发现将XML粘贴为CLR类型的功能。这将在创建基于XML实例文档的可序列化类时做出最佳猜测。

此外,根据您的描述,ADO.NET数据服务将为您提供一种向PHP站点公开RESTful数据服务的快速方法。

...

这是给你的问题?如果.Net服务将由PHP站点使用,那么为什么要将.Net服务描述为“面向Web”。根据您的描述,这些服务听起来更像是您网站的私人实施细节。

答案 3 :(得分:0)

如果我是你,我会:

  • 调查是否可以在XSD上使用NuSOAP工具。在.NET世界中,您有svcutil(或在ASMX时代,wsdl.exe)来消化.wsdl文件以生成代理类。但是,如果您只有.xsd文件,则可以使用xsd.exe工具或“售后市场”XsdObjectGen,这就像增压的xsd.exe。 NuSOAP中是否有类似的工具可以做同样的事情?也许这很明显,你已经做到了。
  • 如果不能解决问题,请生成一个虚拟WSDL,并将您拥有的XSD填充到其中。然后,使用NuSOAP工具处理.wsdl文件。抓取生成的代码,删除soap信封和通信内容,但保留对象序列化内容。不确定这是否可行,NuSOAP工具生成PHP(或它是C?)代码的方式。在.NET中,很容易打破不同的部分。

答案 4 :(得分:0)

休息背后的整个想法是你不要像使用SOAP一样使用hackish“对象模型”。问题是你试图使用系统错误:)

如果您想要对象模型,请使用SOAP。

如果您想要网络友好的API,请使用REST。

答案 5 :(得分:0)

为了便于集成,我将使用REST API。由于存在如此强烈的约定,因此对于之前使用过REST的任何人来说,集成应该相对简单。

答案 6 :(得分:0)

所以我认为这可能是我正在寻找的东西。但我想知道它是否有某种自动化系统

http://devzone.zend.com/article/1713#Heading11

找到了它
  

扩展类

     

虽然上面的例子都是   可以使用PHP 4和domxml   扩展(只有API有点   有点不同),扩展的能力   使用您自己的代码的DOM类是   PHP 5的新功能   可以编写更易读的代码。   这是整个例子,   重写以使用DomDocument   类:

 class Articles extends DomDocument {
     function __construct() {
         //has to be called!
         parent::__construct();
     }

     function addArticle($title) {
         $item = $this->createElement("item");
         $titlespace = $this->createElement("title");
         $titletext = $this->createTextNode($title);
         $titlespace->appendChild($titletext);
         $item->appendChild($titlespace);
         $this->documentElement->appendChild($item);
     } } $dom = new Articles(); $dom->load("articles.xml");
 $dom->addArticle("XML in PHP5"); print
 $dom->save("newfile.xml");