代码之家  ›  专栏  ›  技术社区  ›  Alessandro Minoccheri

ajax POST上的错误XML

  •  1
  • Alessandro Minoccheri  · 技术社区  · 13 年前

    嗨,我有一个用codeigniter开发的stie,我想通过ajax调用发送一个xml。 xml来自另一个服务器。在我看来,这就是ajax

                xmlDoc.loadXML(xmlfromserver);
    
                $(function(){
                     $.ajax({
                      type: "POST",
                      url: "<?php echo site_url('/backend/provider/all_country_request'); ?>",
                      data: "xml"+xmlDoc.xml,
                      async: false,
                      contentType: "text/xml",
                      dataType: "text",
                      success: function(msg)
                      {
                        alert(msg);
                      },
                      error: function()
                      {
                        alert("error");
                      }
                    });
                });
    

    这是我的控制器:

    public function all_country_request(){
            if ($this->User_model->isLoggedIn()){
                $this->Travco_model->all_country_request();
            }
            else{
                redirect('/backend/user/home/');
            }
        }
    

    这是我的简单模型:

    function all_country_request(){
             $xml_str = $_POST['xml'];
             $xml = new SimpleXMLElement($xml_str);
             foreach ($xml->DATA as $entry){            
                $data = array(
                  'currency_code_travco'=>$entry->attributes()->CURRENCY_CODE,
                  'currency_name'=>$entry->CURRENCY_NAME,
                  'created'=>date('Y-m-d H:i:s'),
                  'modified'=>date('Y-m-d H:i:s'),
             );
             $this->db->insert('currency_travco',$data);
                echo '<br>';
             } 
             
        }
    

    这是我的XML:

    <?xml version="1.0" standalone="yes"?>
    <RETURNDATA lang="it-IT" type="COR" xsi:noNamespaceSchemaLocation="http://xmlv5test.travco.co.uk/trlink/schema/CountryRequestV6Rcv.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <MESSAGE>All Countries details and relevant city details</MESSAGE>
    <DATA COUNTRY_CODE="ABW" CURRENCY_CODE="EUR">
        <COUNTRY_NAME>Aruba</COUNTRY_NAME>
        <CURRENCY_NAME>euro</CURRENCY_NAME>
    </DATA>
    

    返回给我的错误在所附的图像中 enter image description here

    问题出在哪里?

    2 回复  |  直到 5 年前
        1
  •  1
  •   hakre    13 年前

    PHP脚本的任何类型的输入都需要在继续之前进行正确的验证。

    在您的情况下,一个更详细的变体 能够 看起来像这样:

    try {
        if (!isset($_POST['xml'])) {
            throw new Exception('Missing Parameter Attribute "xml"');
        }
        $mode = libxml_use_internal_errors(true);
        $xml = new SimpleXMLElement($_POST['xml']);
    } catch (Exception $e) {        
        $code   = 400;
        $phrase = 'Bad Request';
        header(sprintf('HTTP/ %d %s', $code, $phrase), true, $code);
    
        $response                 = new SimpleXMLElement('<?xml version="1.0" encoding="UTF-8"?><response/>');
        $response->status->phrase = $phrase;
        $response->status->code   = $code;
        $response->message = $e->getMessage();
        if ($errors = libxml_get_errors()) {
            $responseErrors = $response->addChild('errors');
            foreach($errors as $error) {
                $responseError = $responseErrors->addChild('error');
                foreach($error as $name => $value) {
                    $value && $responseError->$name = rtrim($value);
                }
            }
        }
        header('Content-Type: application/my-app-response-bucket+xml; charset=utf-8');
        $response->asXML('php://STDOUT');
        return;
    }
    
    
    foreach ($xml->DATA as $entry) {
        $data = array(
            'currency_code_travco' => $entry->attributes()->CURRENCY_CODE,
            'currency_name'        => $entry->CURRENCY_NAME,
            'created'              => date('Y-m-d H:i:s'),
            'modified'             => date('Y-m-d H:i:s'),
        );
        $this->db->insert('currency_travco', $data);
        echo '<br>';
    }
    
    ...
    

    对于为丢失或无效数据的请求提供服务的错误情况( 错误的请求 )则返回适当的响应。它甚至有一个由XML突出显示错误组成的响应体,例如缺少数据:

    <?xml version="1.0" encoding="UTF-8"?>
    <response>
      <status>
        <phrase>Bad Request</phrase>
        <code>400</code>
      </status>
      <message>Missing Parameter Attribute "xml"</message>
    </response>
    

    或者在XML格式不正确的情况下( <?xml ?><fa ke></fa>blurb )提供:

    <?xml version="1.0" encoding="UTF-8"?>
    <response>
      <status>
        <phrase>Bad Request</phrase>
        <code>400</code>
      </status>
      <message>String could not be parsed as XML</message>
      <errors>
        <error>
          <level>3</level>
          <code>96</code>
          <column>6</column>
          <message>Malformed declaration expecting version</message>
          <line>1</line>
        </error>
      </errors>
      <errors>
        <error>
          <level>3</level>
          <code>41</code>
          <column>13</column>
          <message>Specification mandate value for attribute ke</message>
          <line>1</line>
        </error>
      </errors>
      <errors>
        <error>
          <level>3</level>
          <code>5</code>
          <column>16</column>
          <message>Extra content at the end of the document</message>
          <line>1</line>
        </error>
      </errors>
    </response>
    
        2
  •  1
  •   Ahmed Atta    13 年前

    将xml文档作为数据发送到服务器。必须设置 处理数据 选项 虚假的 ,阻止了数据到字符串的自动转换。 例如:

    $.ajax({
      url: "page.php",
      processData: false,
      data: xmlDocument
    });
    

    祝你好运