2017-02-08 19 views
12

Tôi đang cố gắng đăng XML lên dịch vụ web bằng jQuery. Tôi nhận được phản hồi mà tôi không mong đợi:Tên XML không thể bắt đầu bằng ký tự '%'

"Tên Không thể bắt đầu bằng ký tự '%', giá trị thập lục phân 0x25. Dòng 1, vị trí 65."

$(function() { 
    var xmlStr = '<?xml version="1.0" encoding="utf-8" ?><TransactionSetup xmlns="obsfucated"><Credentials><AccountID>1043155</AccountID><AccountToken>obsfucated</AccountToken><AcceptorID>obsfucated</AcceptorID></Credentials><Application><ApplicationID>obsfucated</ApplicationID><ApplicationVersion>1.0</ApplicationVersion><ApplicationName>Test</ApplicationName></Application><Terminal><TerminalID>01</TerminalID><CardholderPresentCode>2</CardholderPresentCode><CardInputCode>5</CardInputCode><TerminalCapabilityCode>3</TerminalCapabilityCode><TerminalEnvironmentCode>2</TerminalEnvironmentCode><CardPresentCode>2</CardPresentCode><MotoECICode>1</MotoECICode><CVVPresenceCode>1</CVVPresenceCode></Terminal><Transaction><TransactionAmount>SPI_CartTotalFinal</TransactionAmount></Transaction><TransactionSetup><TransactionSetupMethod>1</TransactionSetupMethod><Embedded>1</Embedded><AutoReturn>1</AutoReturn><ReturnURL>Obsfucated</ReturnURL><CustomCss>body{margin-left:50px;font-family:arial;font-size:large;border:none;}</CustomCss></TransactionSetup></TransactionSetup>', 
     guid; 
    $.ajax({ 
     type: 'POST', 
     url: 'webserviceurl', 
     contentType: "text/xml", 
     dataType: "xml", 
     data: { 
      Action: $('#Action').val(), 
      IsAjax: $('#IsAjax').val(), 
      xml: xmlStr, 
     }, 
     success: function(response) { 
      guid = response; 
      console.log('success' + guid); 
     }, 
     error: function (jqXHR, tranStatus, errorThrown) { 
     console.log(
      'Status: ' + jqXHR.status + ' ' + jqXHR.statusText + '. ' + 
      'Response: ' + jqXHR.responseText 
     ); 
    } 
    }); 

CẬP NHẬT - văn liệu

<TransactionSetup xmlns="https://www.obsfucated.com"%3E%20%3CCredentials%3E%20%3CAccountID%3E1223135%3C/AccountID%3E%20%3CAccountToken%3EA9A22221CBE222ED0E287D6F34B0222E0F928E4DDF6C37B945CE05F78054DF95966FC201%3C/AccountToken%3E%20%3CAcceptorID%322228907%3C/AcceptorID%3E%20%3C/Credentials%3E%20%3CApplication%3E%20%3CApplicationID%3E8003%3C/ApplicationID%3E%20%3CApplicationVersion%3E1.0%3C/ApplicationVersion%3E%20%3CApplicationName%3EHostedPayments.CSharp%3C/ApplicationName%3E%20%3C/Application%3E%20%3CTerminal%3E%20%3CTerminalID%3E01%3C/TerminalID%3E%20%3CCardholderPresentCode%3E2%3C/CardholderPresentCode%3E%20%3CCardInputCode%3E5%3C/CardInputCode%3E%20%3CTerminalCapabilityCode%3E3%3C/TerminalCapabilityCode%3E%20%3CTerminalEnvironmentCode%3E2%3C/TerminalEnvironmentCode%3E%20%3CCardPresentCode%3E2%3C/CardPresentCode%3E%20%3CMotoECICode%3E1%3C/MotoECICode%3E%20%3CCVVPresenceCode%3E1%3C/CVVPresenceCode%3E%20%3C/Terminal%3E%20%3CTransaction%3E%20%3CTransactionAmount%3E0.20%3C/TransactionAmount%3E%20%3C/Transaction%3E%20%3CTransactionSetup%3E%20%3CTransactionSetupMethod%3E1%3C/TransactionSetupMethod%3E%20%3CEmbedded%3E1%3C/Embedded%3E%20%3CAutoReturn%3E1%3C/AutoReturn%3E%20%3CReturnURL%3Ehttp://shop.masterssupply.net/webcattest/WebCatPageServer.exe%3C/ReturnURL%3E%20%3CCustomCss%3E%20.tdHeader%20{%20%20%20%20%20background-color:%20%23F8F8F8;%20%20%20%20%20padding:%205px;%20%20%20%20%20font-weight:%20bold;%20}%20.tdLabel%20{%20%20%20%20%20font-weight:%20bold;%20%20%20%20%20text-align:%20right;%20%20%20%20%20padding-right:%2010px;%20%20%20%20%20padding-left:%2010px;%20%20%20%20%20padding-top:%2010px;%20%20%20%20%20padding-bottom:%2010px;%20}%20.tdField%20{%20%20%20%20%20padding-right:%2010px;%20%20%20%20%20padding-left:%2010px;%20%20%20%20%20padding-top:%2010px;%20%20%20%20%20padding-bottom:%2010px;%20}%20.content%20{%20%20%20%20%20padding-left:%2010px;%20%20%20%20%20padding-top:%205px;%20%20%20%20%20padding-bottom:%205px;%20%20%20%20%20border-left-style:%20none;%20%20%20%20%20border-left-width:%20none;%20%20%20%20%20border-left-color:%20none;%20%20%20%20%20border-right-style:%20none;%20%20%20%20%20border-right-width:%20none;%20%20%20%20%20border-right-color:%20none;%20}%20.tdTransactionButtons%20{%20%20%20%20%20text-align:%20left;%20%20%20%20%20padding-top:%205px;%20%20%20%20%20height:%2035px;%20%20%20%20%20border-top-style:%20none;%20%20%20%20%20border-top-width:%20none;%20%20%20%20%20border-top-color:%20none;%20%20%20%20%20vertical-align:%20middle;%20}%20body%20{%20%20%20%20%20margin-left:%20none;%20%20%20%20%20font-family:%20arial;%20%20%20%20%20font-size:%2012px;%20%20%20%20%20border:%20none;%20}%20.buttonEmbedded:link%20{%20%20%20%20%20font-size:%2013px;%20%20%20%20%20font-weight:%20bold;%20%20%20%20%20padding-right:%2010px;%20%20%20%20%20padding-left:%2010px;%20%20%20%20%20padding-top:%204px;%20%20%20%20%20padding-bottom:%204px;%20%20%20%20%20border:%204px%20solid%20%23ce701a;%20%20%20%20%20color:%20%23ffffff;%20%20%20%20%20background-color:%20%23ce701a;%20%20%20%20%20text-decoration:%20none;%20%20%20%20%20border-top-style:%20solid;%20%20%20%20%20border-top-width:%201px;%20%20%20%20%20border-top-color:%20%23ce701a;%20%20%20%20%20border-right-color:%20%23ce701a;%20%20%20%20%20border-left-color:%20%23ce701a;%20%20%20%20%20border-bottom-color:%20%23ce701a;%20}%20.buttonCancel{%20%20%20%20%20border:%201px%20solid%20%23444;%20%20%20%20%20font-weight:%20bold;%20%20%20%20%20color:%20%23fff;%20%20%20%20%20border:%201px%20solid%20%23444;%20%20%20%20%20background-color:%20%237c7c7c;%20%20%20%20%20box-shadow:%20none;%20%20%20%20%20border-radius:%200px;%20%20%20%20%20padding:%206px%2012px;%20%20%20%20%20font-size:%2014px;%20%20%20%20%20line-height:%204.428571;%20%20%20%20%20text-decoration:%20none;%20%20%20%20%20padding-right:%2010px;%20%20%20%20%20padding-left:%2010px;%20%20%20%20%20padding-top:%204px;%20%20%20%20%20padding-bottom:%204px;%20%20%20%20%20border-top-style:%20solid;%20%20%20%20%20border-top-width:%201px;%20%20%20%20%20border-top-color:%20%23838383;%20%20%20%20%20border-right-color:%20%23838383;%20%20%20%20%20border-left-color:%20%23838383;%20%20%20%20%20border-bottom-color:%20%23838383;%20}%20.buttonCancel:link%20{%20%20%20%20%20color:%20%23fff;%20}%20.buttonCancel:visited%20{%20%20%20%20%20color:%20%23fff;%20}%20%3C/CustomCss%3E%20%3C/TransactionSetup%3E%20%3C/TransactionSetup%3E%20 

Như bạn có thể xem dữ liệu là url mã hóa. Tôi cho rằng đó là vấn đề, nhưng tôi không biết cách sửa nó. Mọi hướng dẫn sẽ hữu ích. Cảm ơn!

+0

này đôi khi có thể được gây ra khi trang web IIS của bạn không được cấu hình đúng cách. Hãy thử kiểm tra xem phiên bản .NET chính xác có được chỉ định cho trang web của bạn hay không. – Chris

+0

Cảm ơn. Tôi đã thử chuyển đổi phiên bản của .net trang web đang sử dụng, nhưng điều đó không có hiệu lực. Tôi đã cài đặt 2.0 và 4.0 và tôi đã thử cả hai. – dentalhero

Trả lời

2

Lỗi được tạo ra do không gian ngay trước khi kết thúc? biển báo như bên dưới

<?xml version="1.0" encoding="utf-8" ?> 

Bạn có thể kiểm tra chuỗi xml của bạn và gửi lại cho thêm một chút gọn gàng với cách cung cấp trong đoạn mã.

var xmlString ='<?xml version=\"1.0\" encoding=\"utf-8\" ?><TransactionSetup xmlns=\"obsfucated\"><Credentials><AccountID>1043155</AccountID><AccountToken>obsfucated</AccountToken><AcceptorID>obsfucated</AcceptorID></Credentials><Application><ApplicationID>obsfucated</ApplicationID><ApplicationVersion>1.0</ApplicationVersion><ApplicationName>Test</ApplicationName></Application><Terminal><TerminalID>01</TerminalID><CardholderPresentCode>2</CardholderPresentCode><CardInputCode>5</CardInputCode><TerminalCapabilityCode>3</TerminalCapabilityCode><TerminalEnvironmentCode>2</TerminalEnvironmentCode><CardPresentCode>2</CardPresentCode><MotoECICode>1</MotoECICode><CVVPresenceCode>1</CVVPresenceCode></Terminal><Transaction><TransactionAmount>SPI_CartTotalFinal</TransactionAmount></Transaction><TransactionSetup><TransactionSetupMethod>1</TransactionSetupMethod><Embedded>1</Embedded><AutoReturn>1</AutoReturn><ReturnURL>Obsfucated</ReturnURL><CustomCss>body{margin-left:50px;font-family:arial;font-size:large;border:none;}</CustomCss></TransactionSetup></TransactionSetup>'; 
 
var xmlDoc = $.parseXML(xmlString); 
 
var newxmlString = (new XMLSerializer()).serializeToString(xmlDoc); 
 
console.log([xmlString,newxmlString]);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

khác biệt trong chuỗi XML trước và sau khi

enter image description here

EDIT

Sau khi xem xét kỹ hơn các mã niêm yết, sau khi sửa chữa các thiếu }) phần tôi sẽ nói vấn đề của bạn là contentType được khai báo sai.

Để giải thích rõ hơn, bạn nên khai báo contentTypetext/plain vì tôi nghĩ nó rơi trở lại mặc định application/x-www-form-urlencoded. Có một cái nhìn tại contentType trong jquery ajax tài liệu nó được xác định rằng

Lưu ý: Nếu có yêu cầu cross-domain, thiết lập các kiểu nội dung để bất cứ điều gì khác hơn application/x-www-form-urlencoded, multipart/form-data, hoặc text/plain sẽ kích hoạt trình duyệt gửi một yêu cầu preflight OPTIONS yêu cầu đến máy chủ.

Ngoài ra:

Có một cái nhìn tại HTTP access control (CORS) về content-Type và cũng kiểm tra answer này trong SO.

Mã ban đầu

$(function() { 
    var xmlStr = '<?xml version="1.0" encoding="utf-8" ?><TransactionSetup xmlns="obsfucated"><Credentials><AccountID>1043155</AccountID><AccountToken>obsfucated</AccountToken><AcceptorID>obsfucated</AcceptorID></Credentials><Application><ApplicationID>obsfucated</ApplicationID><ApplicationVersion>1.0</ApplicationVersion><ApplicationName>Test</ApplicationName></Application><Terminal><TerminalID>01</TerminalID><CardholderPresentCode>2</CardholderPresentCode><CardInputCode>5</CardInputCode><TerminalCapabilityCode>3</TerminalCapabilityCode><TerminalEnvironmentCode>2</TerminalEnvironmentCode><CardPresentCode>2</CardPresentCode><MotoECICode>1</MotoECICode><CVVPresenceCode>1</CVVPresenceCode></Terminal><Transaction><TransactionAmount>SPI_CartTotalFinal</TransactionAmount></Transaction><TransactionSetup><TransactionSetupMethod>1</TransactionSetupMethod><Embedded>1</Embedded><AutoReturn>1</AutoReturn><ReturnURL>Obsfucated</ReturnURL><CustomCss>body{margin-left:50px;font-family:arial;font-size:large;border:none;}</CustomCss></TransactionSetup></TransactionSetup>', 
     guid; 
    $.ajax({ 
     type: 'POST', 
     url: 'webserviceurl', 
     contentType: "text/xml", 
     dataType: "xml", 
     data: { 
      Action: $('#Action').val(), 
      IsAjax: $('#IsAjax').val(), 
      xml: xmlStr, 
     }, 
     success: function(response) { 
      guid = response; 
      console.log('success' + guid); 
     }, 
     error: function (jqXHR, tranStatus, errorThrown) { 
     console.log('Status: ' + jqXHR.status + ' '+jqXHR.statusText+'. '+'Response: '+jqXHR.responseText); 
     } 
    }); 
}); 

Mã số đề xuất

$(function() { 
var xmlStr = '<?xml version=\"1.0\" encoding=\"utf-8\"?><TransactionSetup xmlns=\"obsfucated\"><Credentials><AccountID>1043155</AccountID><AccountToken>obsfucated</AccountToken><AcceptorID>obsfucated</AcceptorID></Credentials><Application><ApplicationID>obsfucated</ApplicationID><ApplicationVersion>1.0</ApplicationVersion><ApplicationName>Test</ApplicationName></Application><Terminal><TerminalID>01</TerminalID><CardholderPresentCode>2</CardholderPresentCode><CardInputCode>5</CardInputCode><TerminalCapabilityCode>3</TerminalCapabilityCode><TerminalEnvironmentCode>2</TerminalEnvironmentCode><CardPresentCode>2</CardPresentCode><MotoECICode>1</MotoECICode><CVVPresenceCode>1</CVVPresenceCode></Terminal><Transaction><TransactionAmount>SPI_CartTotalFinal</TransactionAmount></Transaction><TransactionSetup><TransactionSetupMethod>1</TransactionSetupMethod><Embedded>1</Embedded><AutoReturn>1</AutoReturn><ReturnURL>Obsfucated</ReturnURL><CustomCss>body{margin-left:50px;font-family:arial;font-size:large;border:none;}</CustomCss></TransactionSetup></TransactionSetup>', 
guid;  
var jqxhr = $.ajax({ 
     type: "POST", 
     url: "webserviceurl", 
     contentType: "text/plain", 
     dataType: "xml", 
     data: { 
      Action: $('#Action').val(), 
      IsAjax: $('#IsAjax').val(), 
      xml: xmlStr, 
     } 
}) 
.done(function(data) { 
    guid = data; 
    console.log(data.responseXML);  
}) 
.fail(function(jqXHR, textStatus,errorThrown) { 
    console.log("Request failed: "+errorThrown+" - "+textStatus); 
}); 
}); 
+0

Không gian trước? gần cuối của prolog xml vẫn còn hợp lệ xml. Xem thông số xml tại đây: https://www.w3.org/TR/xml11/. Ngoài ra, khi tôi chạy đoạn mã được cung cấp trong câu trả lời này, nó vẫn có khoảng trống ở cùng một chỗ với chuỗi gốc vì vậy tôi không nghĩ rằng không gian là vấn đề cũng không bị xóa bởi các bước tuần tự bổ sung. – Fitz

+0

@Fitz nếu bạn chạy đoạn mã, bạn sẽ thấy rằng không gian không có ở đó bạn có thấy đầu ra bàn điều khiển của hai chuỗi không? –

+0

Tôi thấy cả hai chuỗi bây giờ - lời xin lỗi của tôi. Tôi thấy sự thay đổi trong không gian màu trắng, nhưng tôi vẫn tin rằng một trong hai vẫn là XML hợp lệ theo thông số XML. – Fitz

3

Bạn đã thử gửi XML document thay vì string?

data: { 
     Action: $('#Action').val(), 
     IsAjax: $('#IsAjax').val(), 
     xml: $.parseXML(xmlStr), 
    } 
+0

Cảm ơn, Tubbe, tôi đã cố gắng để không có kết quả. – dentalhero

4

Tôi đã xem mã và tìm thấy một số vấn đề cần xem xét.

  1. Mã chức năng bạn đã đăng bị thiếu '});' để đóng chức năng và gọi ajax một cách thích hợp. Điều này có thể chỉ do vấn đề sao chép-dán khi bạn đăng câu hỏi của mình. Nhưng, phải rõ ràng. Các khối mã sau sẽ cần phải có để nó hoạt động.

    $(function() { 
        var xmlStr = 'validxml', guid; 
    
        $.ajax({ 
         option1:"option1" 
        }); 
    //basically, this last closing bracket/paren was missing in the sample code 
    }); 
    
  2. XML bạn đang đăng có vẻ không hợp lệ. Có thẻ mở <TransactionSetup> nhưng có vẻ như HAI thẻ đóng </TransactionSetup> ở cuối. Nhiều khả năng điều này sẽ không gây ra vấn đề với cách jQuery đăng dữ liệu, nhưng nó có thể sẽ gây ra các vấn đề phía máy chủ khi đó là thời gian để deserialize XML.

  3. Dữ liệu bạn đang hiển thị như được đăng là tò mò vì một vài lý do. Đầu tiên, nó không bao gồm phần mở đầu XML ở đầu biến javascript của bạn. Thứ hai, mã hóa là số lẻ vì nó xuất hiện sau khi thuộc tính xmlns nhận được mã hóa nhưng không có gì trước đó. Tôi nghĩ nguồn của vấn đề của bạn dựa trên thông báo lỗi là máy chủ đang gặp phải một thời gian thực sự khó phân tích cú pháp XML vì nó không được mã hóa ngay từ đầu và sau đó đột nhiên trở thành được mã hóa một phần. Điều này có ý nghĩa dựa trên thông báo lỗi "Tên không thể bắt đầu bằng ký tự '%' vì nó gặp phải các dấu ngoặc nhọn được mã hóa trong XML của bạn khi nó không mong đợi để

khuyến cáo của tôi sẽ được:.

  1. Xác minh tất cả dấu ngoặc/dấu ngoặc đơn của bạn là chính xác
  2. Xác minh XML là hợp lệ (thẻ mở phù hợp và phù hợp)
  3. Sau đó, bắt đầu khắc phục sự cố của bạn nếu vẫn tồn tại. Điều đầu tiên tôi muốn đề nghị thay đổi là xóa tùy chọn contentType: "text/xml" hoàn toàn khỏi cuộc gọi ajax() vì đó không phải là điều bình thường mà bạn cần thiết lập hoặc thay đổi khi đăng XML theo kinh nghiệm của tôi. Tôi đoán là nếu bạn xóa tùy chọn đó, bạn sẽ tiến gần hơn đến việc xác định vấn đề. Nếu việc xóa nó không có tác dụng, hãy thử đổi nó thành contentType: "application/xml".
1

Dữ liệu được đăng không thực sự là xml, nó là đối tượng có thuộc tính xml. Vì vậy, thiết lập contentType: "text/xml" không phù hợp với yêu cầu ajax của bạn.

Theo mặc định, dữ liệu được chuyển vào dữ liệu dưới dạng đối tượng (về mặt kỹ thuật, bất kỳ thứ gì ngoài chuỗi) sẽ được xử lý và chuyển thành chuỗi truy vấn, phù hợp với loại nội dung mặc định "application/x-www -form-urlencoded ". Để ngăn dữ liệu được gửi ở định dạng được mã hóa url, bạn có thể xem xét chuyển đổi dữ liệu đã đăng của mình thành chuỗi json và thay đổi cài đặt contentType thành "application/json; charset = utf-8".

$(function() { 
    var xmlStr = '<?xml version="1.0" encoding="utf-8" ?><TransactionSetup xmlns="obsfucated"><Credentials><AccountID>1043155</AccountID><AccountToken>obsfucated</AccountToken><AcceptorID>obsfucated</AcceptorID></Credentials><Application><ApplicationID>obsfucated</ApplicationID><ApplicationVersion>1.0</ApplicationVersion><ApplicationName>Test</ApplicationName></Application><Terminal><TerminalID>01</TerminalID><CardholderPresentCode>2</CardholderPresentCode><CardInputCode>5</CardInputCode><TerminalCapabilityCode>3</TerminalCapabilityCode><TerminalEnvironmentCode>2</TerminalEnvironmentCode><CardPresentCode>2</CardPresentCode><MotoECICode>1</MotoECICode><CVVPresenceCode>1</CVVPresenceCode></Terminal><Transaction><TransactionAmount>SPI_CartTotalFinal</TransactionAmount></Transaction><TransactionSetup><TransactionSetupMethod>1</TransactionSetupMethod><Embedded>1</Embedded><AutoReturn>1</AutoReturn><ReturnURL>Obsfucated</ReturnURL><CustomCss>body{margin-left:50px;font-family:arial;font-size:large;border:none;}</CustomCss></TransactionSetup></TransactionSetup>', 
     guid; 
    $.ajax({ 
     type: 'POST', 
     url: 'webserviceurl', 
     contentType: "application/json; charset=utf-8", 
     dataType: "xml", 
     data: JSON.stringify({ 
      Action: $('#Action').val(), 
      IsAjax: $('#IsAjax').val(), 
      xml: xmlStr, 
     }), 
     success: function(response) { 
      guid = response; 
      console.log('success' + guid); 
     }, 
     error: function (jqXHR, tranStatus, errorThrown) { 
     console.log(
      'Status: ' + jqXHR.status + ' ' + jqXHR.statusText + '. ' + 
      'Response: ' + jqXHR.responseText 
     ); 
    } 
    }); 

Tôi đã tạo mẫu tại liên kết này https://jsfiddle.net/b6f4tuyx/1/, bạn có thể kiểm tra.

+0

Tôi không nghĩ rằng dữ liệu được đăng là json. Tuy nhiên, ngay cả khi đó là json, tùy chọn dataType không liên quan đến loại dữ liệu được đăng, nó có nghĩa là để cho jQuery biết loại phản hồi nào sẽ đợi từ máy chủ. Xem tài liệu jQuery. http://api.jquery.com/jquery.ajax/ – Fitz

+1

@Fitz Cảm ơn rất nhiều phản hồi của bạn. Tôi đã chỉnh sửa câu trả lời của mình. –

Các vấn đề liên quan