2009-04-15 8 views
93

J'utilise la méthode ci-dessus & cela fonctionne bien avec un paramètre dans l'URL.Comment utiliser getJSON, envoyer des données avec la méthode post?

par exemple. Students/getstud/1 où le format du contrôleur/action/paramètre est appliqué.

Maintenant, j'ai une action dans le contrôleur des étudiants qui accepte deux paramètres et retourne un objet JSON.

Alors, comment publier des données avec $.getJSON() en utilisant la méthode post?

Des méthodes similaires sont également acceptables.

Le point est d'appeler une action du contrôleur avec AJAX.

+4

'' get' dans getJSON' signifie * * GET utiliser pour obtenir des JSON. –

+0

@Majid Fouladpour Quand j'ai posé cette question, je ne savais pas que ..! – Vikas

Répondre

190

La méthode $ .getJSON() fait un HTTP GET et non POST. Vous devez utiliser $.post()

$.post(url, dataToBeSent, function(data, textStatus) { 
    //data contains the JSON object 
    //textStatus contains the status: success, error, etc 
}, "json"); 

Dans cet appel, dataToBeSent pourrait être tout ce que vous voulez, mais si envoient le contenu d'un formulaire HTML, vous pouvez utiliser la méthode serialize pour créer les données pour le POST de votre forme.

var dataToBeSent = $("form").serialize(); 
+5

Je veux juste ajouter que $ .getJSON supporte Jsonp (accès inter-domaine) malheureusement $ .post pas. – Tomas

+1

Actuellement, .getJSON() prend en charge l'accès interdomaine de deux manières. JSONP, qui n'utilise pas GET ou POST mais l'injection de script; mais aussi CORS - et .post() supporte également CORS. Cependant, CORS exige que le serveur le supporte également, contrairement à JSONP. – hippietrail

+2

Non vrai, JSONP requiert également le support du serveur pour analyser le paramètre de rappel. – Shrulik

-8

si vous avez seulement deux paramètres que vous pouvez faire ceci:

$.getJSON('/url-you-are-posting-to',data,function(result){ 

    //do something useful with returned result// 
    result.variable-in-result; 
}); 
+4

Je pense que ce n'est pas la réponse à ce qui a été demandé. –

12

Ceci est ma solution "une ligne":

$.postJSON = function(url, data, func) { $.post(url+(url.indexOf("?") == -1 ? "?" : "&")+"callback=?", data, func, "json"); } 

Pour utiliser jsonp et POST méthode, cette fonction ajoute le paramètre GET "callback" à l'URL. Ceci est la façon de l'utiliser:

$.postJSON("http://example.com/json.php",{ id : 287 }, function (data) { 
    console.log(data.name); 
}); 

Le serveur doit être prêt à gérer le paramètre GET de rappel et retourner la chaîne JSON comme:

jsonp000000 ({"name":"John", "age": 25}); 

dans lequel « jsonp000000 » est la valeur GET de rappel .

PHP, la mise en œuvre serait comme:

print_r($_GET['callback']."(".json_encode($myarr).");"); 

J'ai fait quelques tests inter-domaines et il semble fonctionner. Encore besoin de plus de tests si.

+1

Cela ne contournera jamais la limite GET a alors que la taille maximale POST peut être redéfinie. – Dementic

+0

Pourquoi avez-vous ajouté '? Callback'? en url? Cela a fait que le rappel ne soit pas appelé pour moi. J'ai également ajouté 'JSON.stringify (data)'. +1, un message utile! –

+0

@ IonicăBizău: merci. Afin de retourner un objet, nous devons ajouter le paramètre "callback" à l'URL et le serveur doit retourner le même nom d'objet généré par JQuery. J'utilise aussi une fonction override pour getJSON(): 'jQuery.getJSON = fonction (url, data, func) {return $ .get (url + (url.indexOf ("? ") == -1?"? ":" & ") +" callback =? ", data, func," json "); } ' – lepe

3

J'avais du code qui faisait getJSON. Je l'ai simplement remplacé par un post. À ma grande surprise, il a travaillé

$.post("@Url.Action("Command")", { id: id, xml: xml }) 
     .done(function (response) { 
      // stuff 
     }) 
     .fail(function (jqxhr, textStatus, error) { 
      // stuff 
     }); 



    [HttpPost] 
    public JsonResult Command(int id, string xml) 
    { 
      // stuff 
    } 
1

$.getJSON() est très pratique pour envoyer une requête AJAX et revenir des données JSON comme une réponse. Hélas, la documentation de jQuery n'a pas de fonction sœur qui devrait être nommée $.postJSON(). Pourquoi ne pas simplement utiliser $.getJSON() et en finir avec? Eh bien, peut-être que vous voulez envoyer une grande quantité de données ou, dans mon cas, IE7 ne veut tout simplement pas fonctionner correctement avec une requête GET.

Il est vrai, il n'y a actuellement aucune méthode $.postJSON(), mais vous pouvez accomplir la même chose en spécifiant un quatrième paramètre (type) dans la fonction $.post():

Mon code ressemblait à ceci:

$.post('script.php', data, function(response) { 
    // Do something with the request 
}, 'json'); 
3

Il suffit d'ajouter ces lignes à votre <script> (quelque part après jQuery est chargé mais avant tout affichage):

$.postJSON = function(url, data, func) 
{ 
    $.post(url, data, func, 'json'); 
} 

Remplacez (tous/tous) $.getJSON avec $.postJSON et profitez-en! Vous pouvez utiliser les mêmes fonctions de rappel Javascript qu'avec $.getJSON. Aucune modification côté serveur n'est nécessaire. (Eh bien, je recommande toujours d'utiliser $_REQUEST en PHP http://php.net/manual/en/reserved.variables.request.php, Among $_REQUEST, $_GET and $_POST which one is the fastest?)

Ceci est plus simple que la solution de @ lepe.

+0

Cela ne fonctionnait pas avec les méthodes done() et fail() que vous pouvez normalement appliquer à getJSON. – HackWeight

1

Je viens d'utiliser un poste et si:

data = getDataObjectByForm(form); 
var jqxhr = $.post(url, data, function(){}, 'json') 
    .done(function (response) { 
     if (response instanceof Object) 
      var json = response; 
     else 
      var json = $.parseJSON(response); 
     // console.log(response); 
     // console.log(json); 
     jsonToDom(json); 
     if (json.reload != undefined && json.reload) 
      location.reload(); 
     $("body").delay(1000).css("cursor", "default"); 
    }) 
    .fail(function (jqxhr, textStatus, error) { 
     var err = textStatus + ", " + error; 
     console.log("Request Failed: " + err); 
     alert("Fehler!"); 
    }); 
Questions connexes