Derniers messages sur Zeste de Savoirhttps://zestedesavoir.com/forums/2019-01-19T16:10:58+01:00Les derniers messages parus sur le forum de Zeste de Savoir.Création d'un parser de querystring, message #1976762019-01-19T16:10:58+01:00anonyme/@anonymehttps://zestedesavoir.com/forums/sujet/11268/creation-dun-parser-de-querystring/?page=1#p197676<p>Au final j’ai bien créé mon repo, j’ai mis travis, il ne me manque plus qu’à améliorer mes tests. Ma PR sur .travis.yml pour zds-site m’a permit d’apprendre à utiliser travis.</p>
<hr>
<p>Par contre je n’ai pas fais d’essai intermédiaire avec le code ci-dessous. En réfléchissant qunitjs n’est peut-être pas adapté pour être utilisé avec travis.</p>
<blockquote>
<p>Pour le côté apprentissage, je souhaiterais mettre ma fonction sur github (sous forme de bibliothèque par exemple) et faire automatiquement des tests quand je PR (comme le zds) via : <a href="https://qunitjs.com/">https://qunitjs.com/</a> est-ce possible ? Dois-je changer de lib ? Faut-il des connaissances avancées ?</p>
</blockquote>
<p>A voir si j’utilise <a href="https://mochajs.org/">MochaJS</a>.</p>Création d'un parser de querystring, message #1887032018-09-07T19:05:13+02:00cepus/@cepushttps://zestedesavoir.com/forums/sujet/11268/creation-dun-parser-de-querystring/?page=1#p188703<p>Je vois.</p>
<p>Dans ce cas je te recommande par exemple le premier résultat google : <a href="https://stackoverflow.com/questions/2090551/parse-query-string-in-javascript">https://stackoverflow.com/questions/2090551/parse-query-string-in-javascript</a> , pour la lecture. Plein de solutions qui semblent moins alambiquées que la tienne.</p>
<p>Il te reste à faire une fonction pour extraire le hash fragment, et à utiliser ce qui te plait pour parser.</p>
<p>Pour les tests je connais pas particulièrement qUnit, je suis plutôt habitué de jest, ava, mocha, … Prends ce qui te convient, au final c’est égal. Ça ne demande pas de connaissances poussées, non. Suffit généralement de lire la doc pour piger comment ça marche. En revanche le testing est un art et là je connais pas de ressources francophones pour apprendre à écrire de bons tests.</p>
<p>L’idée de tester que ton parseur retourne la même chose que celui de node n’est pas mauvaise, mais si tu testes pas les edge cases testés par node ça ne montrera pas que ton code est aussi correct que le leur. Du coup tu peux jeter un oeil à leurs tests pour cette méthode.</p>Création d'un parser de querystring, message #1887022018-09-07T18:53:34+02:00anonyme/@anonymehttps://zestedesavoir.com/forums/sujet/11268/creation-dun-parser-de-querystring/?page=1#p188702<p>J’ai choisi l'<a href="https://oauth.net/2/grant-types/implicit/">OAuth 2.0 Implicit Grant</a> pour une question de simplicité et le fait d’être léger pour le serveur. Le serveur me sert uniquement à distribuer des pages statiques avec ce mode.</p>Création d'un parser de querystring, message #1887002018-09-07T18:31:23+02:00cepus/@cepushttps://zestedesavoir.com/forums/sujet/11268/creation-dun-parser-de-querystring/?page=1#p188700<p>Pourquoi est-ce qu’elle te redirige sur cette URL ? Le principe d’OAuth c’est pas que tu dis au provider vers quelle URL rediriger le client ? Si oui, pourquoi rediriger vers <code>example.com/foo#</code> au lieu d'<code>example.com/foo?</code> (Le <code>?</code> s’applique à l’URL, mais si tu préfères tu peux l’appliquer à la question.)</p>Création d'un parser de querystring, message #1886992018-09-07T18:10:47+02:00anonyme/@anonymehttps://zestedesavoir.com/forums/sujet/11268/creation-dun-parser-de-querystring/?page=1#p188699<p>L’API avec authentication oauth me renvoi sur : <code>monsite.com/callback#token=a567082ca54abf223a77da38&scope=user%3Aread+channel%3Amoderate&token_type=auth2&token_type=auth</code>, je ne peux donc pas utiliser querystring de node.</p>Création d'un parser de querystring, message #1886982018-09-07T17:12:19+02:00cepus/@cepushttps://zestedesavoir.com/forums/sujet/11268/creation-dun-parser-de-querystring/?page=1#p188698<p>Disons qu’il y a déjà des tas de fonctions mieux que celle que tu montres pour faire ça. En revanche ce qu’elles font c’est parser une query string, pas parser une query string seulement si elle préfixée par <code>#</code>.</p>
<p>Du coup conseils :</p>
<ul>
<li>Une fonction qui fait UN truc c’est mieux qu’une fonction qui en fait plusieurs. Découpe ça en 2 fonctions : une qui extrait la query string, l’autre qui la parse. Et la 2e t’as pas besoin de l’écrire, t’en trouveras des tas de très bien partout, t’as même donné un exemple.</li>
<li>Evite de réinventer la roue.</li>
<li>Dans un topic de ce genre, ça vaut la peine d’expliquer pourquoi tu te retrouves à devoir parser une query string passée aussi bizarrement que ça. Si ça se trouve c’est un hack moche parce que t’as raté la bonne solution.</li>
</ul>Création d'un parser de querystring, message #1886732018-09-07T12:19:42+02:00anonyme/@anonymehttps://zestedesavoir.com/forums/sujet/11268/creation-dun-parser-de-querystring/?page=1#p188673<figure><blockquote>
<p>Pourquoi tu fais ça à la main ?</p>
</blockquote><figcaption><a href="https://zestedesavoir.com/forums/sujet/11268/creation-dun-parser-de-querystring/?page=1#p188672">SpaceFox</a></figcaption></figure>
<p>On peut le faire avec une fonction native dans le navigateur ?</p>Création d'un parser de querystring, message #1886722018-09-07T12:14:41+02:00SpaceFox/@SpaceFoxhttps://zestedesavoir.com/forums/sujet/11268/creation-dun-parser-de-querystring/?page=1#p188672<p>Pourquoi tu fais ça à la main ?</p>Création d'un parser de querystring, message #1886702018-09-07T11:35:05+02:00anonyme/@anonymehttps://zestedesavoir.com/forums/sujet/11268/creation-dun-parser-de-querystring/?page=1#p188670<p>Bonjour,</p>
<p>Pour une application dans un site web, j’ai besoin de récupérer le Token qui se trouve être en <code>document.location.hash</code> sous le format d’une <code>querystring</code>.</p>
<p>C’est le passage clé de mon site si je m’y prends mal, l’application ne fonctionnera pas. <img src="/static/smileys/zorro.png" alt=":zorro:" class="smiley"> Je voulais savoir si vous remarquiez un potentiel oubli dans mon parsing ou un format que je ne supporte pas.</p>
<p>Pour test : <a href="https://jsfiddle.net/v2w18tao/79/">https://jsfiddle.net/v2w18tao/79/</a></p>
<div class="hljs-code-div"><div class="hljs-line-numbers"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></div><pre><code class="hljs language-js"><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">querystringParser</span>(<span class="hljs-params">hash, opt</span>) </span>{
<span class="hljs-keyword">var</span> set = <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">defVal, optVal</span>) </span>{
<span class="hljs-keyword">return</span> (<span class="hljs-keyword">typeof</span> optVal === <span class="hljs-string">"undefined"</span>) ? defVal : optVal;
};
<span class="hljs-keyword">var</span> options = {
<span class="hljs-attr">starter</span>: set(<span class="hljs-string">"?"</span>, opt && opt.starter),
<span class="hljs-attr">sep</span>: set(<span class="hljs-string">"&"</span>, opt && opt.sep),
<span class="hljs-attr">eq</span>: set(<span class="hljs-string">"="</span>, opt && opt.eq)
};
<span class="hljs-keyword">var</span> obj = {},
enableStarter = (<span class="hljs-keyword">typeof</span> options.starter === <span class="hljs-string">"string"</span>);
<span class="hljs-keyword">for</span> (<span class="hljs-keyword">var</span> i = <span class="hljs-number">0</span>, varName = <span class="hljs-literal">null</span>, val = <span class="hljs-literal">null</span>, char, key; i <= hash.length; i++) {
char = hash[i];
<span class="hljs-keyword">if</span> (i === <span class="hljs-number">0</span> && char === options.starter && enableStarter) { <span class="hljs-comment">// Enlève le "#"</span>
<span class="hljs-keyword">continue</span>;
} <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (val === <span class="hljs-literal">null</span> && char === options.eq) { <span class="hljs-comment">// On passe à la suite si "="</span>
val = <span class="hljs-string">""</span>;
} <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (val === <span class="hljs-literal">null</span>) {
varName = ((varName === <span class="hljs-literal">null</span>) ? <span class="hljs-string">""</span> : varName) + char;
} <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (varName !== <span class="hljs-literal">null</span> && char !== options.sep && i !== hash.length) {
val = val + char;
} <span class="hljs-keyword">else</span> {
<span class="hljs-keyword">if</span> (varName !== <span class="hljs-string">""</span>) {
key = <span class="hljs-built_in">decodeURIComponent</span>(varName);
<span class="hljs-keyword">switch</span> (<span class="hljs-keyword">typeof</span> obj[key]) {
<span class="hljs-keyword">case</span> <span class="hljs-string">"undefined"</span>:
obj[key] = <span class="hljs-built_in">decodeURIComponent</span>(val);
<span class="hljs-keyword">break</span>;
<span class="hljs-keyword">case</span> <span class="hljs-string">"string"</span>:
obj[key] = [<span class="hljs-built_in">decodeURIComponent</span>(val)];
<span class="hljs-keyword">default</span>:
obj[key].push(<span class="hljs-built_in">decodeURIComponent</span>(val));
}
}
varName = <span class="hljs-literal">null</span>;
val = <span class="hljs-literal">null</span>;
}
}
<span class="hljs-keyword">return</span> obj;
}
<span class="hljs-keyword">var</span> querystring = <span class="hljs-string">"#token=a567082ca54abf223a77da38&scope=user%3Aread+channel%3Amoderate&token_type=auth2&token_type=auth"</span>;
<span class="hljs-built_in">document</span>.getElementById(<span class="hljs-string">"json"</span>).textContent = <span class="hljs-built_in">JSON</span>.stringify(querystringParser(querystring, {<span class="hljs-attr">starter</span>:<span class="hljs-string">"#"</span>}), <span class="hljs-literal">null</span>, <span class="hljs-number">4</span>);
</code></pre></div>
<hr>
<p>Pour le côté apprentissage, je souhaiterais mettre ma fonction sur github (sous forme de bibliothèque par exemple) et faire automatiquement des tests quand je PR (comme le zds) via : <a href="https://qunitjs.com/">https://qunitjs.com/</a> est-ce possible ? Dois-je changer de lib ? Faut-il des connaissances avancées ?</p>
<p>J’ai aussi pensé à faire un script <a href="https://nodejs.org/api/querystring.html#querystring_querystring_parse_str_sep_eq_options">node</a> pour tester le résultat.</p>
<p>Bon vol,</p>
<p>A.</p>
<p><strong>EDIT :</strong> Rajout des tags.</p>