18 messaggi dal 06 febbraio 2006
www.dreamse.com
Ciao a tutti,
ho uno strano problema legato al browser Chrome, nell'interrogare un servizio web tramite JSON. Il problema è che con IE 10 funziona perfettamente, ma lo stesso codice, con CHROME, non funziona perché la chiamata al servizio sembra ritornare il contenuto in XML, e non in formato JSON (stesso problema con Firefox).
Di seguito è riportato il codice della pagina, HTML/JQUERY, qualsiasi suggerimento è ben accetto. Grazie a tutti !


<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Product App</title>
</head>
<body>

<div>
<h2>All Products</h2>
<ul id="products" />
</div>
<div>
<h2>Search by ID</h2>
<input type="text" id="prodId" size="5" />
<input type="button" value="Search" onclick="find();" />&nbsp;&nbsp;&nbsp;&nbsp;
<p id="product" />
</div>

<script src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-2.0.3.min.js"></script>
<script>
var uri = 'http://localhost:47503/api/products';

$(document).ready(function () {
// Send an AJAX request
$.getJSON(uri)
.done(function (data) {
// On success, 'data' contains a list of products.
$.each(data, function (key, item) {
// Add a list item for the product.
$('<li>', { text: formatItem(item) }).appendTo($('#products'));
});
});
});

function formatItem(item) {
return item.Name + ': $' + item.Price;
}

function find() {
var id = $('#prodId').val();
$.getJSON(uri + '/' + id)
.done(function (data) {
$('#product').text(formatItem(data));
})
.fail(function (jqXHR, textStatus, err) {
$('#product').text('Error: ' + err);
});
}

</script>
</body>
</html>
11.884 messaggi dal 09 febbraio 2002
Contributi
ciao,
ogni volta che ho provato ad usare getJSON c'era qualcosa che non andava e sono dovuto tornare alla funzione base $.ajax.

In questo particolare caso proverei ad impostare esplicitamente il parametro accepts su "application/json". Solo questo è il modo per far intendere al server che vuoi ottenere il risultato in formato JSON.

Ovviamente, dato che stai usando la funzione più generica $.ajax dovrai configurare anche tutti gli altri parametri (url, metodo, dataType e così via).

Comunque, anche l'XML andrebbe bene, se ignoriamo il fatto che è più verboso del JSON. jQuery riesce a parsarlo altrettanto correttamente.

ciao,
Moreno

Enjoy learning and just keep making
18 messaggi dal 06 febbraio 2006
www.dreamse.com
Ciao BrightSoul,
grazie per il suggerimento, ho modificato e provato il codice, ma nulla da fare, con IE, gira perfettamente ma con Chrome/Firefox, niente da fare.
L'aspetto strano è che se la pagina html, default.html, è in locale funziona con IE e non con Chrome, ma se punto direttamente all'url:
http://localhost:47503/Index.html, allora funziona bene con qualsiasi browser.
Però io vorrei partire dalla pagina locale per gestirmi al meglio la modalità offline/online.

Comunque grazie per l 'aiuto ! :)

Claudio
11.884 messaggi dal 09 febbraio 2002
Contributi
ciao Claudio,
sono convinto che il problema non sia il browser in sé ma il modo diverso in cui viene formata la richiesta Ajax.
Non può essere neanche colpa del servizio perché, se riesce a fornire contenuto JSON per almeno un browser, allora vuol dire che è in grado di fornirlo per tutti dato che non discrimina il formato di output in base allo user-agent.

Per identificare la causa, dovresti controllare il traffico di rete usando o gli strumenti di sviluppo (tasto F12) o un web debugger come Fiddler.

Confronta le intestazioni e il contenuto delle richieste HTTP che partono di IE, Chrome e Firefox e, se c'è una differenza, ti salterà subito all'occhio.

Attenzione a non farti ingannare dai risultati che il browser preleva dalla cache. Costringilo a ri-effettuare ogni volta la richiesta, quando fai queste prove. Cambia il tuo uri così
var uri = '/api/products?r=' + Math.random();


ciao,
Moreno

Enjoy learning and just keep making
18 messaggi dal 06 febbraio 2006
www.dreamse.com
Ciao Moreno,
grazie per il solerte aiuto, poi considerando che è domenica ...
In realtà io arrivo dal mondo client/server, .NET/C#, sono un pò arrugginito in ambito WEB, e quindi alcuni aspetti non mi sono molto chiari.

Di seguito, ti riporto le intestazioni di CHROME e poi IE 11 (l'unico che funziona, con firefox non funzione neppure da visual studio 2012), se riesci a capire l'anomalia e, soprattutto, se ne hai voglia, hai già fatto molto!

Grazie ancora
Claudio

CHROME
1.Request URL:http://localhost:47503/api/products/2
2.Request Headersview parsed
1.GET http://localhost:47503/api/products/2 HTTP/1.1
2.Accept: application/json, text/javascript, */*; q=0.01
3.Origin: null
4.User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36

INTERNET EXPLORER 11
Chiave Valore
User-Agent Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko
Richiesta GET /api/products/2 HTTP/1.1
Host localhost:47503
DNT 1
Connection Keep-Alive
Accept-Languageit-IT,it;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encodinggzip, deflate
Accept application/json, text/javascript, */*; q=0.01
11.884 messaggi dal 09 febbraio 2002
Contributi
ciao Claudio,
tutti e due i browser inviano questa stessa intestazione Accept.
Accept: application/json, text/javascript, */*; q=0.01 

Il server dunque dovrebbe rispondere allo stesso modo. Hai esaminato anche il contenuto della risposta a quelle due richieste, per verificare che fosse JSON in entrambi i casi?
Se usi Fiddler hai una scheda "Raw" in cui puoi vedere i dati grezzi inviati dal server.

ciao,
Moreno

Enjoy learning and just keep making
18 messaggi dal 06 febbraio 2006
www.dreamse.com
Ciao Moreno,
ho eseguito il debug con il Browser Safari, stesso problema, ecco l'errore che mi ha riportato sulla console:

XMLHttpRequest cannot load http://localhost:47503/api/products/1. Origin file:// is not allowed by Access-Control-Allow-Origin.

Non capisco perchè Origin file è //, e comunque dove devo definirlo, visto che URL del servizio è corretto.

Se hai, ancora, qualche idea, te ne sarò grato, ma ti sono già grato per l'aiuto che mi hai fornito, poiché adesso, so come eseguire il debug su IE, CHROME, Safari (anche se ci capisco ancora poco riguardo i risultati).

Ciao e grazie,
Claudio
11.884 messaggi dal 09 febbraio 2002
Contributi
ciao Claudio,
qui il browser si rifiuta di caricare i dati JSON poiché la richiesta ajax violerebbe la same origin policy.
Nel caso specifico, tu probabilmente stai aprendo un file HTML aprendolo/trascinandolo direttamente dentro Safari. Così facendo, nella barra degli indirizzi del browser apparirà un percorso tipo questo:
file://C:\Users\....
Ora, il browser non potrà inviare una richiesta richiesta ajax ad http://... perché il protocollo è diverso (file:// contro http://).

Dunque dovresti visualizzare la pagina web raggiungendola dal suo percorso http. Fare questo è semplice se aggiungi Safari all'elenco dei browser di Visual Studio.

Inoltre, nel tuo codice javascript, fai in modo che tutti i percorsi alla tua API siano virtuali (cioè non includere pure il protocollo e il nome host).
var uri = '/api/products';
Altrimenti, quando andrai a pubblicare l'applicazione nel server di produzione, il nome host cambierà sicuramente e tu ti troveresti con percorsi non più validi, che il browser non accetterebbe sempre a causa della same origin policy.

ciao, e prego :)
Moreno

Enjoy learning and just keep making

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.