zoukankan      html  css  js  c++  java
  • PHP通过XML报文格式的POST请求方式,与第三方接口交互(发送xml,获取XML,并解析xml步骤)

    开发者端:发送请求,并接收结果

    复制代码
    <?php
    
    //  下面的demo,实现的功能如下:
    //   1-开发者需要判断一个用户是否存在,去请求第三方接口。
    //   2-与第三方接口的通信,是以xml格式传送数据。开发者把用户信息以xml格式发送给第三方接口
    //   3-第三方接口获取开发者的xml数据,通过数据的查询,把结果再以xml的格式发送给开发者。
    
    
    //首先检测是否支持curl
    if (!extension_loaded("curl")) {
        trigger_error("对不起,请开启curl功能模块!", E_USER_ERROR);
    }
    
    //构造xml
    $xmldata="<?xml version='1.0' encoding='UTF-8'?><group><name>张三</name><age>22</age></group>";
    
    //初始一个curl会话
    $curl = curl_init();
    
    //设置url
    curl_setopt($curl, CURLOPT_URL,"http://localhost/demo/dealxml.php");
    
    //设置发送方式:post
    curl_setopt($curl, CURLOPT_POST, true);
    
    //设置发送数据
    curl_setopt($curl, CURLOPT_POSTFIELDS, $xmldata);
    
    //TRUE 将curl_exec()获取的信息以字符串返回,而不是直接输出
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
    
    //执行cURL会话 ( 返回的数据为xml )
    $return_xml = curl_exec($curl);
    
    //关闭cURL资源,并且释放系统资源
    curl_close($curl);
    
    //echo $return_xml;
    //exit;
    
    //禁止引用外部xml实体
    libxml_disable_entity_loader(true);
    //先把xml转换为simplexml对象,再把simplexml对象转换成 json,再将 json 转换成数组。
    $value_array = json_decode(json_encode(simplexml_load_string($return_xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
    
    echo "<pre>";
    print_r($value_array);
    ?>
    复制代码

    第三方接口端:接收请求,并返回处理结果

    复制代码
    <?php
    
    //接收传送的数据
    $fileContent = file_get_contents("php://input"); 
    
    
    ### 把xml转换为数组
    //禁止引用外部xml实体
    libxml_disable_entity_loader(true);
    //先把xml转换为simplexml对象,再把simplexml对象转换成 json,再将 json 转换成数组。
    $value_array = json_decode(json_encode(simplexml_load_string($fileContent, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
    
    
    ### 获取值,进行业务处理
    $name = $value_array['name'];
    $age = $value_array['age'];
    // 通过查询,判断该用户是否存在
    
    
    ### 把查询结果添加到数组中
    $value_array['result'] = 1;
    
    
    ### 把数组转换为xml格式,返回
    $xml = "<?xml version='1.0' encoding='UTF-8'?><group>";
    foreach ($value_array as $key=>$val)
    {
        if (is_numeric($val)){
            $xml.="<".$key.">".$val."</".$key.">";
        }else{
            $xml.="<".$key."><![CDATA[".$val."]]></".$key.">";
        }
    }
    $xml.="</group>";
    
    
    
    
    
    // echo $xml;
    return $xml; ?>




    ///////////////////////

    postxml.php

     
    1. 1

      <?php

      //首先检测是否支持curl

      if (!extension_loaded("curl")) {   

      trigger_error("对不起,请开启curl功能模块!", E_USER_ERROR);

      }

      //构造xml

      $xmldata="<?xml version='1.0' encoding='UTF-8'?><group><name>张三</name><age>22</age></group>";

      //初始一个curl会话

      $curl = curl_init();

      //设置url

      curl_setopt($curl, CURLOPT_URL,"http://localhost/dealxml.php");

      //设置发送方式:

      postcurl_setopt($curl, CURLOPT_POST, true);

      //设置发送数据

      curl_setopt($curl, CURLOPT_POSTFIELDS, $xmldata);

      //抓取URL并把它传递给浏览器

      curl_exec($curl);

      //关闭cURL资源,并且释放系统资源

      curl_close($curl);

      ?>

      php用post发送xml数据,获取XML,并解析xml步骤
      END

    dealxml.php

     
    1. 1

      ‍<?php

      //接收传送的数据

      $fileContent = file_get_contents("php://input");

      //转换为simplexml对象

      $xmlResult = simplexml_load_string($fileContent);

      //foreach循环遍历

      foreach($xmlResult->children() as $childItem) {  

       //输出xml节点名称和值    

      echo $childItem->getName() . "->".$childItem."<br />";   

       //其他操作省略

      }

      ?>

      php用post发送xml数据,获取XML,并解析xml步骤
    2. 2

      //运行结果为:

      name->张三age->22

      php用post发送xml数据,获取XML,并解析xml步骤
    3. 3

      演示代码下载地址:

      百度网盘:http://pan.baidu.com/s/1o63F5qy

      /////////////////

      特地的写了一个程序测试下file_get_contents这个函数,汗,才发现原来它抓的是网页的源代码,不是网页的内容,以前一直以为抓的是内容。
       
              那么就可以说明一个问题了,它抓的是源代码,如果是HTML,那么echo之后就直接在浏览器里面输出了网页的容,但是由于现在抓的是XML的源代码,那么var_dump的话其实是不能输出XML的。因为浏览器不认识这个。
       
             那么怎么办呢?好办,先用file_get_contents远程抓取XML,再把抓取的结果用simplexml_load_string()处理就OK 啦。simplexml_load_string()读取的是XML,返回的是一个对象。那么下一个问题来了,如何获取对象里面的值呢?
    A buddhist programmer.
  • 相关阅读:
    HTTP协议抓包分析
    cmd 中使用 tracert
    Ubuntu 搭建zabbix
    kerberos+ldap
    运行程序显示丢失“MSVCR100D.dll”
    熊猫烧香病毒样本分析
    Masm32sdk安装指南
    16位汇编实现三大基本排序
    逆向工程初步160个crackme-------3
    一个入门级CTF的Reverse
  • 原文地址:https://www.cnblogs.com/wszz/p/7992020.html
Copyright © 2011-2022 走看看