2017-02-08 24 views
12

Próbuję opublikować kod XML w serwisie internetowym przy użyciu jQuery. Otrzymuję odpowiedź zwrotną, której się nie spodziewałem:Nazwa XML nie może się zaczynać od znaku "%".

"Nazwa Nie może zaczynać się od znaku"% ", wartości szesnastkowej 0x25 .. Wiersz 1, pozycja 65."

Kod

$(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 
     ); 
    } 
    }); 

UPDATE - Opublikowane dane

<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 

Jak widać danych jest URL zakodowane. Zakładam, że to jest problem, ale nie wiem, jak to naprawić. Wszelkie wskazówki byłyby pomocne. Dzięki!

+0

To może być czasami spowodowany gdy witryna IIS nie jest prawidłowo skonfigurowany. Spróbuj sprawdzić, czy dla Twojej witryny została określona poprawna wersja .NET. – Chris

+0

Dzięki. Próbowałem zmienić wersję .net, z której korzysta strona, ale to nie miało żadnego efektu. Mam zainstalowane 2.0 i 4.0 i próbowałem obu. – dentalhero

Odpowiedz

2

Błąd jest produkowany ze względu na miejsce tuż przed zakończeniem? oznaczenia, jak widać poniżej

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

można sprawdzić ciąg xml i powrócić to nieco bardziej schludny ze sposobu przewidzianego we fragmencie.

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>

Różnica w ciągi XML przed i po

enter image description here

EDIT

po bliższym spojrzeniu na kodzie pisał i po ustaleniu brakujących }) część powiedziałbym, że twój problem to contentType, który jest błędnie uznany.

Aby lepiej wyjaśnić, należy zadeklarować contentType jako text/plain, ponieważ myślę, że wraca do domyślnego application/x-www-form-urlencoded. Wystarczy popatrzeć na contentType w jquery ajax dokumentacji jest to określone, że

Uwaga: Dla żądań między domenami, ustawienie typu zawartości do niczego innego niż application/x-www-form-urlencoded, multipart/form-data lub text/plain uruchomi przeglądarkę wysłać preflight OPTIONS wniosek do serwera.

Ponadto:

Wystarczy popatrzeć na HTTP access control (CORS) o content-Type a także sprawdzić to answer w SO.

Początkowa Kod

$(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); 
     } 
    }); 
}); 

Proponowany kod

$(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

Przestrzeń przed? pod koniec prologu xml jest nadal poprawny xml. Zobacz specyfikację xml tutaj: https://www.w3.org/TR/xml11/. Dodatkowo, gdy uruchomię fragment kodu dostarczony w tej odpowiedzi, nadal ma on miejsce w tym samym miejscu, co oryginalny ciąg, więc nie sądzę, że przestrzeń jest problemem ani nie jest usuwana przez dodatkowe kroki serializacji. – Fitz

+0

@ Fitz, jeśli uruchomisz fragment kodu, zobaczysz, że nie ma tam miejsca, czy widzisz wyjście konsoli z dwóch ciągów? –

+0

Widzę teraz oba łańcuchy - moje przeprosiny. Widzę zmianę w białej przestrzeni, ale nadal uważam, że jeden z nich jest nadal prawidłowym kodem XML zgodnie ze specyfikacją XML. – Fitz

3

Czy próbowałeś wysłać XML document zamiast string?

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

Dzięki, Tubbe, próbowałem tego bezskutecznie. – dentalhero

4

Spojrzałem na kod i znalazłem kilka spraw do obejrzenia.

  1. W opublikowanym kodzie funkcji brakuje zamknięcia "}); aby odpowiednio zamknąć funkcję i wywołać ajax. Może to wynikać z problemu wklejania i wklejania, kiedy opublikowałeś swoje pytanie. Ale, żeby było jasne. Aby działał, potrzebne będą następujące bloki kodu.

    $(function() { 
        var xmlStr = 'validxml', guid; 
    
        $.ajax({ 
         option1:"option1" 
        }); 
    //basically, this last closing bracket/paren was missing in the sample code 
    }); 
    
  2. Opublikowany plik XML wydaje się nieprawidłowy. Jest tam tag otwierający <TransactionSetup>, ale wydaje się, że na końcu znajduje się DWA zamykające znaczniki </TransactionSetup>. Najprawdopodobniej nie spowoduje to problemów z tym, jak jQuery wysyła dane, ale prawdopodobnie spowoduje problemy po stronie serwera, gdy nadszedł czas na deserializację kodu XML.

  3. Dane wyświetlane jako opublikowane są interesujące z kilku powodów. Po pierwsze, nie zawiera prologu XML na początku pokazów zmiennych javascript. (Zamiast tego, po prostu zaczyna się od <TransactionSetup>. Po drugie, kodowanie jest nieparzyste, ponieważ wydaje się, że rzeczy po atrybucie xmlns są kodowane, ale nic przed tym. Myślę, że źródłem problemu na podstawie komunikatu o błędzie jest to, że serwer ma bardzo ciężki czas parsowania XML, ponieważ nie jest on zakodowany na początku, a następnie nagle staje się zakodowany w części. Ma to sens w oparciu o komunikat o błędzie "Nazwa nie może zaczynać się od znaku"% "ponieważ napotyka zakodowane nawiasy kątowe w Twój XML, kiedy nie spodziewa się

Moja rekomendacja byłoby.

  1. Sprawdź, czy wszystkie nawiasy zamykające/nawiasy są poprawne.
  2. Sprawdź, czy plik XML jest poprawny (prawidłowe otwieranie i dopasowywanie znaczników zamykających)
  3. Następnie rozpocznij rozwiązywanie problemu, jeśli problem nadal występuje. Pierwszą rzeczą, którą sugerowałbym zmienić byłoby usunięcie opcji contentType: "text/xml" całkowicie z wywołania ajax(), ponieważ nie jest to normalnie coś, co musisz ustawić lub zmienić podczas publikowania XML w moim doświadczeniu. Domyślam się, że jeśli usuniesz tę opcję, będziesz bliżej zidentyfikowania problemu. Jeśli usunięcie go nie pomaga, spróbuj zmienić go na contentType: "application/xml".
1

Dane, które zostaną opublikowane, nie są w rzeczywistości znakami xml, jest to obiekt, który ma właściwość xml. Tak więc ustawienie contentType: "text/xml" nie jest odpowiednie dla twojego zapytania ajax.

Domyślnie dane przekazywane w danych jako przedmiot (technicznie coś innego niż ciąg) będą przetwarzane i przekształcony w ciąg kwerendy pasująca do domyślnej zawartości typu „application/x-www -formalnie zakodowany ". Aby zapobiec wysyłaniu danych w formacie zakodowanym w adresie URL, można rozważyć przekształcenie opublikowanych danych w ciąg json i zmianę ustawienia contentType na "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 
     ); 
    } 
    }); 

Utworzyłem próbki pod tym linkiem https://jsfiddle.net/b6f4tuyx/1/, można to sprawdzić.

+0

Nie sądzę, że publikowane dane to json. Ale nawet jeśli był to json, opcja dataType nie jest związana z typem publikowanych danych, ma to na celu poinformowanie jQuery, jakiego typu odpowiedzi oczekiwać od serwera. Zobacz dokumentację jQuery. http://api.jquery.com/jquery.ajax/ – Fitz

+1

@Fitz Bardzo dziękuję za opinię. Edytowałem swoją odpowiedź. –

Powiązane problemy