【问题标题】:Send SimpleXmlElement via Curl using POST request使用 POST 请求通过 Curl 发送 SimpleXmlElement
【发布时间】:2011-08-20 15:25:52
【问题描述】:

我如何使用POST 请求类型通过Curl 发送SimpleXmlElement 对象并接收SimpleXmlElement 对象返回。

我在本地服务器上创建了两个文件并创建了对象。

网址:

  • http://someaddress/fileOne.php
  • http://someaddress/fileTwo.php

来自第一个文件的对象:

$Xml = new SimpleXMLElement( '<?xml version="1.0" encoding="UTF-8"?><SomeXml></SomeXml>' );
$Translation = $Xml->addChild( 'Translation' );
$Translation->addChild( 'Phrase', 'test' );

现在我想通过 curl 发送这个 $Xml 对象并在其他文件中解析并发送回

$Xml = new SimpleXMLElement( '<?xml version="1.0" encoding="UTF-8"?><SomeXml></SomeXml>' );
$Translation = $Xml->addChild( 'Translation' );
$Translation->addChild( 'Phrase', "Got your phrase: $phrase" );

如果您能提供代码示例,我将不胜感激。 谢谢大家的帮助。

【问题讨论】:

  • 好的,我们得到了你想要的。现在我们想知道,您尝试过什么? :)
  • 我有自己的书面 curl 课程,遗憾的是它是私有的。试图用它来发送这个对象,但据我所知,发送对象是不可能的。

标签: php post curl simplexml


【解决方案1】:

您不会发送 SimpleXMLElement 对象,而是发送 XML 数据。

从您的发送方,您会:

$xml = '<?xml version="1.0" encoding="UTF-8"?><SomeXml></SomeXml>';

// assuming you have a previously initialized $curl_handle
curl_setopt( $curl_handle, CURLOPT_POSTFIELDS, $xml);

然后从接收端获取请求并使用 SimpleXml 解析它。

【讨论】:

  • 所以换句话说发送对象是不可能的。只有一个字符串,然后转换为另一端的对象?那个字符串可以有多长?我可以序列化对象并发送它还是会更大?
  • 你可以序列化对象,但是php的序列化支持有其局限性。 XML 是为做你想做的事而设计的;传输数据。由于许多原因,发送序列化的 SimpleXML 对象并没有太大的技术意义。
  • 如果你正在使用 php5,我建议你看看 altumo 库的 curl 抽象类 (github.com/homer6/altumo/blob/master/source/php/Http/…) 它使使用 curl 变得更加容易。它还提供了一个 XmlElement 类来简化 Xml 操作 (github.com/homer6/altumo/blob/master/source/php/Xml/…)
  • 谢谢。做到了。为方便起见,我创建了SimpleXmlElement,将其与数据一起输入,然后序列化结果-&gt;asXml()。然后通过 curl 发送并再次转换为SimpleXmlElement。解析、生成XML 并将其发回。然后将结果显示为 XML。注意!!不知道SimpleXmlElement对象序列化是不可能的。
【解决方案2】:

唯一可以通过 cURL 传递的数据类型是字符串。您可以使用如下函数解析元素(参考:http://www.nicolaskuttler.com/post/php-innerhtml/

function innerHTML( $contentdiv ) {
            $r = '';
            $elements = $contentdiv->childNodes;
            foreach( $elements as $element ) { 
                    if ( $element->nodeType == XML_TEXT_NODE ) {
                            $text = $element->nodeValue;
                            // IIRC the next line was for working around a
                            // WordPress bug
                            //$text = str_replace( '<', '&lt;', $text );
                            $r .= $text;
                    }    
                    // FIXME we should return comments as well
                    elseif ( $element->nodeType == XML_COMMENT_NODE ) {
                            $r .= '';
                    }    
                    else {
                            $r .= '<';
                            $r .= $element->nodeName;
                            if ( $element->hasAttributes() ) { 
                                    $attributes = $element->attributes;
                                    foreach ( $attributes as $attribute )
                                            $r .= " {$attribute->nodeName}='{$attribute->nodeValue}'" ;
                            }    
                            $r .= '>';
                            $r .= $this->innerHTML( $element );
                            $r .= "</{$element->nodeName}>";
                    }    
            }    
            return $r;
    }

然后 urlencode( innerHTML ( $XML ) ) 并通过 curl。

警告 - 如果您正在使用大型 DOM 元素,上述功能可能会导致服务器紧张。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-28
    • 2011-10-24
    • 2018-06-21
    • 2017-04-23
    • 1970-01-01
    • 2018-06-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多