2010-02-10 3 views
0

J'essaye de ranger un peu de code hérité.

Ce qui suit est une coupe vers le bas des principales parties du code qui fait la demande ajax:

var xmlHttp; 
    try { 
    // Firefox, Opera 8.0+, Safari 
      xmlHttp=new XMLHttpRequest(); 
    } catch (e) { 
    // Internet Explorer 
      try { 
      xmlHttp=new ActiveXObject("Msxml2.XMLHTTP"); 
      } catch (e) { 
        try { 
          xmlHttp=new ActiveXObject("Microsoft.XMLHTTP"); 
        } catch (e) { 
          $j.prompt("Your browser does not support AJAX!"); 
        return; 
        } 
      } 
    } 
    xmlHttp.onreadystatechange=function(){ 
      if(xmlHttp.readyState==4){ 
      // Get the data from the server's response 
       // returns json data 
        //i know, don't ask 
       eval(xmlHttp.responseText); 

       // doing stuff with the json data 
       ... 
       etc 
      } 
    } 
    xmlHttp.open("POST","fetchData.php",true); 

    //sample data passed 
    var request ="51.5&-0.12"; 
    xmlHttp.send(request); 

Je suis en train de se convertir à:

$j.ajax({ 
     type: "POST", 
     url: "fetchData.php", 
     success: function(data) { 
      mapFn._showSidebarHotels(data); 
     }, 
     cache: false,    
     data: "51.5&-0.12", 
     dataType: "json", 
     processData: false 
    }) 

Le code existant Renseigne le $ HTTP_RAW_POST_DATA var que le code backend hérité (que je préfère ne pas modifier) ​​utilise. Lorsque vous utilisez l'appel jquery, $ HTTP_RAW_POST_DATA ne semble pas être rempli et ce qui est bizarre, c'est que le $ _POST [] semble être vide. J'ai remarqué que la différence dans l'onglet POST de firebug lors de la comparaison des deux appels ajax est que la version de jquery a "application/x-www-form-urlencoded" comme plus d'informations où l'appel hérité n'est pas.

Je crois que le problème est dû au type d'en-têtes envoyés avec la requête jquery ajax mais je ne suis pas sûr de savoir comment je peux les manipuler en utilisant jquery.

Mes questions sont les suivantes:

  • est mon appel jquery correct? Étant donné que j'ai un tableau $ POST vide
  • Comment remplir le $ HTTP_RAW_POST_DATA en utilisant les paramètres de jquery?

Répondre

2

Les données sont converties en une chaîne de requête avant d'être envoyées. Ce traitement peut être contourné en définissant processData sur false.

Exemple:

Envoie un document XML en tant que données au serveur. En définissant l'option processData sur false, la conversion automatique des données en chaînes est empêchée.

var xmlDocument = [create xml document]; 
$.ajax({ 
    url: "page.php", 
    processData: false, 
    data: xmlDocument, 
    success: handleResponse 
}); 
+0

J'avais déjà défini "processData: false" comme mon exemple ci-dessus. D'autres idées? – thiswayup

+0

J'ai 2 autres clés dans la demande ajax: ContentType: 'text/xml', tapez : 'POST' Avec ceux-ci, je peux lire le contenu en PHP en utilisant si ('POST' == $ HTTPMethod) { // $ body = file_get_contents ("php: // entrée"); $ body = $ HTTP_RAW_POST_DATA; } Pour que le HTTP_RAW_POST_DATA fonctionne, j'ai activé le réglage php.ini always_populate_raw_post_data = On – user906825

1

Avez-vous essayé de changer le type de contenu? Peut-être le définir égal à une chaîne vide (comme vous dites que l'appel hérité n'a pas fourni un type de contenu)?

J'ai rencontré un problème similaire lorsque le serveur s'attendait à ce que les données brutes soient JSON. Après avoir changé le type de contenu en 'application/json', cela a bien fonctionné.

Questions connexes