Méthode normalisée pour sérialiser JSON à la chaîne de requête?
Je suis en train de construire une bonne API
et je suis en difficulté sur la façon de sérialiser JSON
des données à un HTTP query string
.
Il y a un certain nombre de obligatoires et facultatives les arguments qui doivent être transmis dans la demande, l'e.g (représenté comme un objet JSON ci-dessous):
{
"-columns" : [
"name",
"column"
],
"-where" : {
"-or" : {
"customer_id" : 1,
"services" : "schedule"
}
},
"-limit" : 5,
"return" : "table"
}
J'ai besoin de l'appui d'un divers nombre de clients différents, donc je suis à la recherche d'une méthode normalisée pour convertir cet objet json à une chaîne de requête. Est-il un, et comment est-il?
Une autre alternative est de permettre aux utilisateurs de simplement passer le long de l'objet json dans un corps de message, mais j'ai lu que je devrais l'éviter (HTTP GET avec le corps de la requête).
Toutes les pensées?
Modifier pour la clarification:
Inscription comment certains différentes langues, code de la donnée json en objet ci-dessus:
jQuery
à l'aide de$.param
: -columns[]=name&-columns[]=column&-where[-or][customer_id]=1&-where[-or][services]=schedule&-limit=5&return=columnPHP
à l'aide dehttp_build_query
: -columns[0]=name&-columns[1]=column&-where[-or][customer_id]=1&-where[-or][services]=schedule&-limit=5&return=columnPerl
à l'aide deURI::query_form
: -colonnes=nom&-colonnes=colonne&-si=HASH(0x59d6eb8)& limit=5&retour=colonnePerl
à l'aide decomplex_to_query
: -columns:0=name&-columns:1=column&-limit=5&-where.-or.customer_id=1&-where.-or.services=schedule&return=column
jQuery et PHP est très similaire. Perl à l'aide de complex_to_query est également assez semblables à eux. Mais pas exactement le même.
- pourquoi ne pas tout simplement à l'aide de requêtes POST?
- vérifier si cela aide, api.jquery.com/jQuery.param
- Parce que je suis en train de chercher (GET) certaines données, pas POSTER de nouvelles données.
- Vous êtes à la recherche pour ce faire sur le côté serveur, et si oui, dans quelle langue? Si sur le côté client, vous pouvez utiliser jquery?
- C'est jQuery spécifiques, droit? Est-il normalisé?
- ok, si vous ne voulez pas utiliser
POST
alors pourquoi ne pas l'url de codage de votre JSON et le mettre dans un unique paramètre de chaîne de requête? - L'API est sur le côté serveur, écrit en PERL 5, mais qui n'a pas d'importance je crois. Je ne maîtrise pas les langues dans lesquelles les clients seront écrits.
- Oui exactement! Mais l'encodage semble être fait dans différentes langues, d'où la question si il y a une façon standardisée.
- J'ai toujours pensé que l'encodage de l'url est indépendante de la langue. vous venez de remplacer certains caractères par leur représentation hexadécimale précédé par un
%
caractère. en.wikipedia.org/wiki/Percent-encoding - Honnêtement, je ne sais pas si il y a un moyen standardisé de faire, je pense que son tout environ la langue que vous utilisez. pour jquery vous pouvez utiliser celui que je vous ai envoyé. vous pouvez utiliser d'autres bibliothèques en dotnet. Ou vous pouvez créer votre propre fonction pour sérialiser et désérialiser JSON à la chaîne de recherche et à l'arrière.
- Édité le post avec des exemples de jQuery, PHP et PERL.
- Semble que chaque langue a sa propre mise en œuvre.
- oui, mais le résultat est le même à travers toutes ces implémentations. vous avez le protocole HTTP, et chaque langue a ses propres clients. mais le protocole est toujours le même. même ici.
- Si j'allais à mon propre sérialisation/désérialisation, comment les clients, écrits en différentes langues, les utiliser?
- J'ai posté les résultats de certaines langues différentes, et ils ne sont pas les même :/
- double possible de Sérialiser JSON à la chaîne de requête en JavaScript/jQuery
Vous devez vous connecter pour publier un commentaire.
Encoderhttps://en.wikipedia.org/wiki/Percent-encoding) votre JSON texte et le mettre dans un seul paramètre de chaîne de requête. par exemple, si vous souhaitez passer
{"val": 1}
:Notez que si votre JSON devient trop longtemps, alors vous allez courir dans une limitation de longueur d'URL problème. Dans ce cas, je voudrais utiliser
POST
avec un corps (oui, je sais, l'envoi d'unPOST
quand vous voulez chercher quelque chose n'est pas "pure" et ne rentre pas bien dans le RESTE de paradigme, mais ce n'est votre domaine spécifique basé sur JSON query language).POST
. UnGET
avec un corps que je n'aime pas parce que c'est bizarre, même si c'est techniquement possible.Il n'existe pas de standard unique pour le JSON à la chaîne de requête de sérialisation, j'ai donc fait un comparaison de quelques JSON sérialiseurs et les résultats sont comme suit:
Le plus court d'entre eux est URL de l'Objet de la Notation.
JSON: ...
ligne que vous avez.)Une autre option pourrait être nœud-querystring. Il utilise également un système similaire à celles que vous avez jusqu'à présent répertoriés.
Il est disponible dans les deux
npm
etbower
, c'est pourquoi je l'utilise.Que diriez-vous d'essayer ce en les envoyant comme suit:
J'ai essayé avec un Client REST
Et sur le côté serveur (Ruby avec Sinatra) j'ai vérifié les paramètres, il me donne exactement ce que vous voulez. 🙂