Derniers messages sur Zeste de Savoirhttps://zestedesavoir.com/forums/2015-08-29T08:22:45+02:00Les derniers messages parus sur le forum de Zeste de Savoir.Problème d'encodage ?, message #710142015-08-29T08:22:45+02:00viki53/@viki53https://zestedesavoir.com/forums/sujet/3930/probleme-dencodage/?page=1#p71014<p>Vu <a href="https://stackoverflow.com/questions/22811558/couchdb-error-latin-character-in-json-using-curl">ce message sur SO</a> il faudra peut-être encoder tes chaînes. C'est un peu mal foutu mais bon…</p>
<p>Sinon essaies le header <code>Content-Type: application/json; charset=utf-8</code> vu que tu envoies du JSON à la DB et non des données de formulaires.</p>Problème d'encodage ?, message #710042015-08-28T22:10:29+02:00anonyme/@anonymehttps://zestedesavoir.com/forums/sujet/3930/probleme-dencodage/?page=1#p71004<p>Ca a plus sa place dans Site Web en effet, merci. <img alt=":)" src="/static/smileys/smile.png"></p>
<p>Les lignes 2 à 4 ont des indentations et des retours à la ligne c'est vrai mais l'erreur ne vient pas de là car ça ne correspond pas à du JSON formel mais juste à un objet, que console.log représente sous cette forme.</p>
<p>Bon ce topic ne correspond plus à un besoin puisque j'ai découvert qu'au lieu de foncer tête baissée et de pisser ce code je pouvais utiliser des modules tous faits pour la plupart des SGBD existants dont CouchDB. Mais j'aimerais bien comprendre quand même ! <img alt="^^" src="/static/smileys/hihi.png"> Si quelqu'un trouve la solution à cette énigme…</p>Problème d'encodage ?, message #709232015-08-28T00:14:23+02:00Ymox/@Ymoxhttps://zestedesavoir.com/forums/sujet/3930/probleme-dencodage/?page=1#p70923<p>Salut !</p>
<p>Je ne pourrais pas t'aider, mais je pense que dans le forum Site Web, il y aurait du monde, je déplace donc ton sujet <img alt=";)" src="/static/smileys/clin.png"></p>
<p>Sinon, les lignes 2 à 4 de la sortie console semblent comprendre une indentation et des retours à la ligne, je ne suis pas sûr que ce soit accepté en JSON formel, c'est peut-être une piste.</p>Problème d'encodage ?, message #709122015-08-27T22:14:07+02:00anonyme/@anonymehttps://zestedesavoir.com/forums/sujet/3930/probleme-dencodage/?page=1#p70912<p>Bonjour. <img alt=":)" src="/static/smileys/smile.png"></p>
<p>J'essaye d'utiliser un serveur CouchDB via Node.js et j'obtiens une erreur "Invalid JSON" dont je ne comprends pas la source.</p>
<p>Voici mon script :</p>
<table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62</pre></div></td><td class="code"><div class="codehilite"><pre><span class="kd">var</span> <span class="nx">http</span><span class="o">=</span><span class="nx">require</span><span class="p">(</span><span class="s1">'http'</span><span class="p">);</span>
<span class="kd">var</span> <span class="nx">dbResponse</span><span class="o">=</span><span class="kd">function</span><span class="p">(</span><span class="nx">res</span><span class="p">,</span><span class="nx">callback</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">res</span><span class="p">.</span><span class="nx">setEncoding</span><span class="p">(</span><span class="s1">'utf8'</span><span class="p">);</span>
<span class="nx">res</span><span class="p">.</span><span class="nx">on</span><span class="p">(</span><span class="s1">'data'</span><span class="p">,</span><span class="kd">function</span><span class="p">(</span><span class="nx">chunk</span><span class="p">){</span>
<span class="nx">callback</span><span class="p">(</span><span class="kc">true</span><span class="p">,</span><span class="nx">JSON</span><span class="p">.</span><span class="nx">parse</span><span class="p">(</span><span class="nx">chunk</span><span class="p">));</span>
<span class="p">});</span>
<span class="p">};</span>
<span class="kd">var</span> <span class="nx">dbRequest</span><span class="o">=</span><span class="kd">function</span><span class="p">(</span><span class="nx">method</span><span class="p">,</span><span class="nx">path</span><span class="p">,</span><span class="nx">data</span><span class="p">,</span><span class="nx">callback</span><span class="p">)</span> <span class="p">{</span>
<span class="kd">var</span> <span class="nx">body</span><span class="o">=</span><span class="nx">JSON</span><span class="p">.</span><span class="nx">stringify</span><span class="p">(</span><span class="nx">data</span><span class="p">);</span>
<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">body</span><span class="p">);</span>
<span class="kd">var</span> <span class="nx">req</span><span class="o">=</span><span class="nx">http</span><span class="p">.</span><span class="nx">request</span><span class="p">({</span>
<span class="nx">hostname</span><span class="o">:</span> <span class="s1">'localhost'</span><span class="p">,</span>
<span class="nx">port</span><span class="o">:</span> <span class="mi">5984</span><span class="p">,</span>
<span class="nx">method</span><span class="o">:</span> <span class="nx">method</span><span class="p">,</span>
<span class="nx">path</span><span class="o">:</span> <span class="nx">path</span><span class="p">,</span>
<span class="nx">headers</span><span class="o">:</span> <span class="p">{</span>
<span class="s1">'Content-Type'</span><span class="o">:</span> <span class="s1">'application/x-www-form-urlencoded'</span><span class="p">,</span>
<span class="s1">'Content-Length'</span><span class="o">:</span> <span class="nx">body</span><span class="p">.</span><span class="nx">length</span>
<span class="p">}</span>
<span class="p">},</span><span class="kd">function</span><span class="p">(</span><span class="nx">res</span><span class="p">){</span><span class="nx">dbResponse</span><span class="p">(</span><span class="nx">res</span><span class="p">,</span><span class="nx">callback</span><span class="p">);});</span>
<span class="nx">req</span><span class="p">.</span><span class="nx">on</span><span class="p">(</span><span class="s1">'error'</span><span class="p">,</span><span class="kd">function</span><span class="p">(</span><span class="nx">e</span><span class="p">){</span><span class="nx">callback</span><span class="p">(</span><span class="kc">false</span><span class="p">,</span><span class="nx">e</span><span class="p">);});</span>
<span class="nx">req</span><span class="p">.</span><span class="nx">write</span><span class="p">(</span><span class="nx">body</span><span class="p">);</span>
<span class="nx">req</span><span class="p">.</span><span class="nx">end</span><span class="p">();</span>
<span class="p">};</span>
<span class="kd">var</span> <span class="nx">dbPut</span><span class="o">=</span><span class="kd">function</span><span class="p">(</span><span class="nx">id</span><span class="p">,</span><span class="nx">callback</span><span class="p">,</span><span class="nx">obj</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">dbRequest</span><span class="p">(</span><span class="s1">'PUT'</span><span class="p">,</span><span class="s1">'/webos/'</span><span class="o">+</span><span class="nx">id</span><span class="p">,</span><span class="nx">obj</span><span class="p">,</span><span class="nx">callback</span><span class="p">);</span>
<span class="p">};</span>
<span class="kd">var</span> <span class="nx">dbGet</span><span class="o">=</span><span class="kd">function</span><span class="p">(</span><span class="nx">id</span><span class="p">,</span><span class="nx">callback</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">dbRequest</span><span class="p">(</span><span class="s1">'GET'</span><span class="p">,</span><span class="s1">'/webos/'</span><span class="o">+</span><span class="nx">id</span><span class="p">,{},</span><span class="nx">callback</span><span class="p">);</span>
<span class="p">}</span>
<span class="kd">var</span> <span class="nx">dbModify</span><span class="o">=</span><span class="kd">function</span><span class="p">(</span><span class="nx">id</span><span class="p">,</span><span class="nx">callback</span><span class="p">,</span><span class="nx">dif</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">dbGet</span><span class="p">(</span><span class="nx">id</span><span class="p">,</span><span class="kd">function</span><span class="p">(</span><span class="nx">success</span><span class="p">,</span><span class="nx">res</span><span class="p">){</span>
<span class="k">if</span><span class="p">(</span><span class="o">!</span><span class="nx">success</span><span class="p">)</span> <span class="nx">callback</span><span class="p">(</span><span class="kc">false</span><span class="p">,</span><span class="nx">res</span><span class="p">);</span>
<span class="k">else</span> <span class="p">{</span>
<span class="kd">var</span> <span class="nx">obj</span><span class="o">=</span><span class="p">{};</span>
<span class="k">for</span><span class="p">(</span><span class="kd">var</span> <span class="nx">p</span> <span class="k">in</span> <span class="nx">res</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">obj</span><span class="p">[</span><span class="nx">p</span><span class="p">]</span><span class="o">=</span><span class="nx">res</span><span class="p">[</span><span class="nx">p</span><span class="p">];</span>
<span class="p">}</span>
<span class="k">for</span><span class="p">(</span><span class="kd">var</span> <span class="nx">p</span> <span class="k">in</span> <span class="nx">dif</span><span class="p">)</span> <span class="p">{</span>
<span class="k">if</span><span class="p">(</span><span class="nx">dif</span><span class="p">.</span><span class="nx">hasOwnProperty</span><span class="p">(</span><span class="nx">p</span><span class="p">))</span> <span class="nx">obj</span><span class="p">[</span><span class="nx">p</span><span class="p">]</span><span class="o">=</span><span class="nx">dif</span><span class="p">[</span><span class="nx">p</span><span class="p">];</span>
<span class="p">}</span>
<span class="k">delete</span> <span class="nx">obj</span><span class="p">[</span><span class="s1">'_id'</span><span class="p">];</span>
<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">obj</span><span class="p">);</span>
<span class="nx">dbPut</span><span class="p">(</span><span class="nx">id</span><span class="p">,</span><span class="nx">callback</span><span class="p">,</span><span class="nx">obj</span><span class="p">);</span>
<span class="p">}</span>
<span class="p">});</span>
<span class="p">};</span>
<span class="kd">var</span> <span class="nx">callit</span><span class="o">=</span><span class="kd">function</span><span class="p">(</span><span class="nx">success</span><span class="p">,</span><span class="nx">res</span><span class="p">)</span> <span class="p">{</span>
<span class="k">if</span><span class="p">(</span><span class="o">!</span><span class="nx">success</span><span class="p">)</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">'ERREUR!!'</span><span class="p">);</span>
<span class="k">else</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">res</span><span class="p">);</span>
<span class="p">}</span>
<span class="nx">dbModify</span><span class="p">(</span><span class="s1">'user_0'</span><span class="p">,</span><span class="nx">callit</span><span class="p">,{</span>
<span class="nx">publicname</span><span class="o">:</span> <span class="s1">'Raphafl'</span>
<span class="p">});</span>
</pre></div>
</td></tr></table>
<p>Ma fonction dbModify effectue donc deux requêtes via l'API HTTP de CouchDB : une requête GET pour récupérer l'objet, sur lequel elle effectue les modifications et qu'elle renvoie dans une requête PUT.</p>
<p>Ce script fonctionne et donne en sortie de console :</p>
<table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre>1
2
3
4
5
6
7
8
9</pre></div></td><td class="code"><div class="codehilite"><pre>{}
{ _rev: '4-b6789613ee60f6141a3a167856ff6c4c',
publicname: 'Raphafl',
login: 'raph' }
{"_rev":"4-b6789613ee60f6141a3a167856ff6c4c","publicname":"Raphafl","login":"rap
h"}
{ ok: true,
id: 'user_0',
rev: '5-8fe5cef5dda42b0c943798e913fb17fa' }
</pre></div>
</td></tr></table>
<p>Aucun problème.
Le premier {} correspond à la ligne 12, c'est le JSON.stringify de l'objet vide fourni à dbRequest par dbGet.
Le second objet affiché correspond à la ligne 49, c'est un objet (et pas une chaîne JSON), celui qui est modifié comme demandé et que l'on s'apprête à donner à dbPut.
Le troisième élément affiché est une chaîne JSON correspondant à la variable body ligne 12, envoyé comme données de la requête HTTP PUT.
Le quatrième élément est la réponse JSON-parsée du serveur CouchDB qui indique que l'opération a été effectuée avec succès.</p>
<p>Jusque là tout va bien.</p>
<p>Si je change maintenant la ligne 61 et que j'insère un caractère accentué :</p>
<table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre>1</pre></div></td><td class="code"><div class="codehilite"><pre><span class="nx">publicname</span><span class="o">:</span> <span class="s1">'Raphaël'</span>
</pre></div>
</td></tr></table>
<p>J'obtiens maintenant cette sortie de console :</p>
<table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre>1
2
3
4
5
6
7</pre></div></td><td class="code"><div class="codehilite"><pre>{}
{ _rev: '6-b63dbead996edd9792c68349932afef8',
publicname: 'Raphaël',
login: 'raph' }
{"_rev":"6-b63dbead996edd9792c68349932afef8","publicname":"Raphaël","login":"rap
h"}
{ error: 'bad_request', reason: 'invalid_json' }
</pre></div>
</td></tr></table>
<p>Le serveur répond que le JSON que je lui ai envoyé (troisième élément affiché dans la console) est invalide, alors que semble-t-il il l'est.</p>
<p>J'ai pensé à un problème d'encodage, j'ai testé à changer le charset dans le header de la requête HTTP avec une ligne 19 comme ceci :</p>
<table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre>1</pre></div></td><td class="code"><div class="codehilite"><pre><span class="s1">'Content-Type'</span><span class="o">:</span> <span class="s1">'application/x-www-form-urlencoded;charset=utf-8'</span>
</pre></div>
</td></tr></table>
<p>Mais même résultat, idem avec utf-16.
Je précise que mon script Node.js est encodé en utf-8.</p>
<p>Je ne comprends pas cette erreur, quelqu'un peut-il m'aider ? <img alt="^^" src="/static/smileys/hihi.png"></p>