2013-09-27 3 views
0

Voici ce que j'ai essayé:jQuery - Ajax soumettre des données JSON GET

JS:

$.ajax({ 
    type: 'GET', 
    contentType: 'application/json; charset=UTF-8', 
    data: JSON.stringify({ data: 'bla' }), 
    dataType: 'json', 
    success: function(data) { 
     alert(data); 
    }, 
    error: function(data) { 
     alert('error: ' + data); 
    } 
}); 

PHP:

<?php 

    if ($_SERVER['REQUEST_METHOD'] == 'GET') 
    { 
     $data = json_decode(file_get_contents('php://input')); 

     echo json_encode($data); 
    } 

?> 

Sortie:

null 

Si vous remplacez la GET avec un POST au lieu de cela fonctionne comme un charme. "Pourquoi ne pas simplement utiliser le POST à ​​la place?", J'utilise POST pour effectuer des insertions dans la base de données. J'ai une petite idée le sentiment que ce serait peut-être parce qu'il veut avec force les données GET dans ce type de format: [email protected]&firstname=Bob&lastname=Mctest. Je ne sais pas pourquoi mais parce que le type de contenu est défini comme application/json, cela est un peu perplexe. Juste pour ajouter quelque chose de ma dernière modification, le php://input est vide autrement dit il n'est pas envoyer de données à elle, mais il fonctionne toujours sans problèmes en utilisant GET boucle du terminal.

Quand je lance une commande GET boucle à partir du terminal en utilisant le type de contenu JSON cela fonctionne comme un charme et recrache les données sans problème à savoir curl -v -X GET -H "Content-Type: application/json" -d '{"data":"bla"}' http://codes.local/test.php

Je ne sais pas comment utile ce sera mais j'ai trouvé un site PHP Fiddle et collé l'exemple de code là-bas juste pour le rendre plus facile pour tout le monde, voici le lien: http://phpfiddle.org/main/code/u4b-xkh

Merci beaucoup pour toute aide.


Edit: corrigé l'erreur d'orthographe dans « application/json » a souligné Silverblade et mis à jour le lien PHP Fiddle (sortie null persiste encore en d'autres termes ne fonctionne toujours pas). Le problème, que je l'ai dit plus haut, est le php://input est en fait vide il n'y a pas de données là-dedans du tout quand transmis via jQuery - aucun problème lorsqu'il est utilisé en conjonction avec GET boucle.


Édition2: Je n'utilise pas IIS, merci à robertdeniro (heh) de l'avoir signalé.

Répondre

2

Mes soupçons étaient précis et la cause du problème était jQuery $ .ajax/$. get forçait les chaînes de requête lors de l'utilisation Obtenir même si vous avez défini le type de contenu en JSON, cela n'a aucun sens, mais je vais devoir disséquer les manuels pour savoir pourquoi.

Voici mon code de travail avec une solution de contournement qui fonctionne avec curl GET et $ .ajax/$. Get.

JS:

$.ajax({ 
    type: 'GET', 
    url: 'manage.php', 
    data: 'user=bla', 
    dataType: 'json', 
    success: function(data) { 
     // code here... 
    } 
}); 

PHP:

$get = !empty($_GET) ? json_decode(json_encode($_GET)) : json_decode(file_get_contents('php://input')); 
1

Votre type de contenu a une erreur d'orthographe,

contentType: 'appllication/json; charset=UTF-8', 

Il devrait être

contentType: 'application/json; charset=UTF-8', 

Deuxièmement, vous pouvez vérifier avec spécifiant l'URL.

+0

Salut Silverblade Merci pour votre réponse. J'ai corrigé cette faute de frappe et mis à jour le violon PHP et tout le reste, désolé pour l'erreur embarrassante là-bas, je copiais une version simplifiée de mon code pour qu'il soit plus facile de passer. Pour info, vous n'avez pas besoin de spécifier une URL si elle est postée sur elle-même. – adamj

0

Utiliser $ .get & $ .post au lieu de $ .ajax, la vie serait beaucoup plus facile. Comme ceci:

$.get(request_url, { param: value }, function(data){ 
    // callback here 
}, 'json') 
+0

Je vais devoir vérifier celui-là, j'ai à peine touché $ .get et je ne suis pas sûr si cela fait contentType. Je vais donner un coup de feu plus tard aujourd'hui. Merci pour la réponse. – adamj

+0

Le dernier paramètre 'json' correspond à contentType 'application/json'. jQuery prend en charge les types de contenu les plus utilisés dans $ .get et $ .post. Vérifiez le document de l'API et amusez-vous :) –

1

SilverBlade peut avoir trouvé votre problème, mais il y a toujours un problème de communication entre XHR et PHP. PHP est requis pour renvoyer les en-têtes corrects ou bien des choses étranges peuvent arriver avec l'interprétation de jQuery.

Essayez:

header ('Content-Type: application/JSON');

+0

haché que là aussi (c'est dans le dernier violon PHP) pas de dés aussi bien = ( – adamj

0

Je ne comprends pas ce que vous voulez dire que vous ne pouvez pas utiliser un POST parce que vous utilisez POST pour les insertions de base de données.
POST est pour envoyer des données au serveur & probablement pourquoi le serveur ignore les données dans le GET - car il n'est pas nécessaire de traiter des données dans un GET.
Si vous utilisez déjà le POST, vous pouvez l'étendre - comme votre json pourrait avoir 2 propriétés - Action & Données. Action = [dbInsert, dbSomethingElse, fileWrite, etc]
Les données seraient les données brutes.
Vous utiliseriez des chemins de code différents en fonction de l'action
Je ne sais pas quel serveur Web vous utilisez mais IIS ignore les données dans un GET - indépendamment de 'application/json; charset = UTF-8 ',' application/x-www-formulaire-urlencoded ', etc.

+0

Merci pour la réponse.Je fais un comportement RESTful (http: //en.wikipedia .org/wiki/Representational_state_transfer) et réutiliser POST en tant qu'insert et PUT en tant que mise à jour Je n'utilise pas IIS Je vais jeter ça sur le post le plus important car c'est un facteur assez important également. – adamj