質問編集履歴

4

編集2

2019/02/14 02:39

投稿

uk_63
uk_63

スコア29

test CHANGED
File without changes
test CHANGED
@@ -378,6 +378,8 @@
378
378
 
379
379
  });
380
380
 
381
+ return false
382
+
381
383
  });
382
384
 
383
385
  });
@@ -464,10 +466,6 @@
464
466
 
465
467
 
466
468
 
467
- // ここから下がエラーみたいです。
468
-
469
-
470
-
471
469
  var room model.Room
472
470
 
473
471
  err = json.Unmarshal(body[:length], &room)

3

編集

2019/02/14 02:39

投稿

uk_63
uk_63

スコア29

test CHANGED
File without changes
test CHANGED
@@ -324,36 +324,38 @@
324
324
 
325
325
  // url の指定を変えました。
326
326
 
327
+ // JSON.stringify(data)を付け加えました。
328
+
327
329
  // この処理の結果はなぜかfailになります。
328
330
 
329
-
330
-
331
331
  $(function () {
332
332
 
333
333
  $("#roomForm").on('submit', function () {
334
334
 
335
335
  $("#roomForm").attr("disable", true);
336
336
 
337
+ let data = {
338
+
339
+ title: $("#roomTitle").val(),
340
+
341
+ content: $("#roomContent").val()
342
+
343
+ };
344
+
337
345
  $.ajax({
338
346
 
339
347
  method: 'post',
340
348
 
341
349
  url: '/room/new',
342
350
 
351
+ data:JSON.stringify(data),
352
+
343
353
  dataType: 'json',
344
354
 
345
355
  contentType: "application/json",
346
356
 
347
357
  timeout: 10000,
348
358
 
349
- data: {
350
-
351
- "title": $("#roomTitle").val(),
352
-
353
- "content": $("#roomContent").val()
354
-
355
- }
356
-
357
359
  })
358
360
 
359
361
  .done((data) => {
@@ -382,13 +384,13 @@
382
384
 
383
385
 
384
386
 
387
+
388
+
385
- ```
389
+ ```
386
-
387
-
388
-
389
- Goのコードも変えて細かくバリデーションをつけるように変えました。
390
+
390
-
391
+
392
+
391
- コードのバリデーション4までは通過しま
393
+ すべてのバリデーション通過し成功しした
392
394
 
393
395
 
394
396
 

2

コード変更

2019/02/14 02:35

投稿

uk_63
uk_63

スコア29

test CHANGED
File without changes
test CHANGED
@@ -280,6 +280,222 @@
280
280
 
281
281
 
282
282
 
283
+ # コード(追記2)
284
+
285
+
286
+
287
+ フォームから送信すると、以前まで成功していたのが`$.ajax`の結果が`fail`になっています。HTML, JSのコードがおかしくないかみていただけますか?
288
+
289
+
290
+
291
+ ```html
292
+
293
+ // actionの指定を消しました。 enctypeを追加しました。
294
+
295
+
296
+
297
+ <form id="roomForm" enctype="application/json" method="post">
298
+
299
+ <div class="form-group">
300
+
301
+ <label>掲示板の名前</label>
302
+
303
+ <input type="text" name="title" value="Go言語コミュニティ" id="roomTitle" class="form-control">
304
+
305
+ </div>
306
+
307
+ <div class="form-group">
308
+
309
+ <label>掲示板の説明</label>
310
+
311
+ <textarea name="content" rows="3" id="roomContent" class="form-control"></textarea>
312
+
313
+ </div>
314
+
315
+ <button type="submit">作成する</button>
316
+
317
+ </form>
318
+
319
+ ```
320
+
321
+
322
+
323
+ ```js
324
+
325
+ // url の指定を変えました。
326
+
327
+ // この処理の結果はなぜかfailになります。
328
+
329
+
330
+
331
+ $(function () {
332
+
333
+ $("#roomForm").on('submit', function () {
334
+
335
+ $("#roomForm").attr("disable", true);
336
+
337
+ $.ajax({
338
+
339
+ method: 'post',
340
+
341
+ url: '/room/new',
342
+
343
+ dataType: 'json',
344
+
345
+ contentType: "application/json",
346
+
347
+ timeout: 10000,
348
+
349
+ data: {
350
+
351
+ "title": $("#roomTitle").val(),
352
+
353
+ "content": $("#roomContent").val()
354
+
355
+ }
356
+
357
+ })
358
+
359
+ .done((data) => {
360
+
361
+ alert(data);
362
+
363
+ })
364
+
365
+ .fail((data) => {
366
+
367
+ alert("ERROR");
368
+
369
+ alert(data);
370
+
371
+ })
372
+
373
+ .always(() => {
374
+
375
+ $("#roomForm").attr("disable", false);
376
+
377
+ });
378
+
379
+ });
380
+
381
+ });
382
+
383
+
384
+
385
+ ```
386
+
387
+
388
+
389
+ Goのコードも変えて細かくバリデーションをつけるように変えました。
390
+
391
+ このコードのバリデーション4までは通過します。
392
+
393
+
394
+
395
+ ```go
396
+
397
+ func roomCreate(w http.ResponseWriter, r *http.Request) {
398
+
399
+ fmt.Print("roomCreate is starting!!\n")
400
+
401
+ // validation
402
+
403
+ if r.Method != "POST" {
404
+
405
+ fmt.Printf("メソッド : \n%v\n", r.Method)
406
+
407
+ w.WriteHeader(http.StatusBadRequest)
408
+
409
+ return
410
+
411
+ }
412
+
413
+ fmt.Print("バリデーション1 通過\n")
414
+
415
+
416
+
417
+ if r.Header.Get("Content-Type") != "application/json" {
418
+
419
+ fmt.Printf("レスポンスヘッダー : \n%v\n", r.Header.Get("Content-Type"))
420
+
421
+ w.WriteHeader(http.StatusBadRequest)
422
+
423
+ return
424
+
425
+ }
426
+
427
+ fmt.Print("バリデーション2 通過\n")
428
+
429
+
430
+
431
+ //To allocate slice for request body
432
+
433
+ length, err := strconv.Atoi(r.Header.Get("Content-Length"))
434
+
435
+ if err != nil {
436
+
437
+ fmt.Printf("コンテンツレングス : \n%v\n", r.Header.Get("Content-Length"))
438
+
439
+ w.WriteHeader(http.StatusInternalServerError)
440
+
441
+ return
442
+
443
+ }
444
+
445
+ fmt.Print("バリデーション3 通過\n")
446
+
447
+
448
+
449
+ body := make([]byte, length)
450
+
451
+ length, err = r.Body.Read(body)
452
+
453
+ if err != nil && err != io.EOF {
454
+
455
+ w.WriteHeader(http.StatusInternalServerError)
456
+
457
+ return
458
+
459
+ }
460
+
461
+ fmt.Print("バリデーション4 通過\n")
462
+
463
+
464
+
465
+ // ここから下がエラーみたいです。
466
+
467
+
468
+
469
+ var room model.Room
470
+
471
+ err = json.Unmarshal(body[:length], &room)
472
+
473
+ if err != nil {
474
+
475
+ w.WriteHeader(http.StatusInternalServerError)
476
+
477
+ return
478
+
479
+ }
480
+
481
+ fmt.Print("バリデーション5 通過\n")
482
+
483
+ fmt.Printf("%v\n", room)
484
+
485
+ w.WriteHeader(http.StatusOK)
486
+
487
+ http.Redirect(w, r, "/room", 302)
488
+
489
+ }
490
+
491
+
492
+
493
+ ```
494
+
495
+
496
+
497
+
498
+
283
499
 
284
500
 
285
501
  # 質問

1

追記

2019/02/14 02:29

投稿

uk_63
uk_63

スコア29

test CHANGED
@@ -1 +1 @@
1
- 「Go言語」フォームのデータをJSONで送信した
1
+ 「Go言語」フォームから送信されたJSONをサーバー側受け取れな..............
test CHANGED
@@ -34,16 +34,174 @@
34
34
 
35
35
 
36
36
 
37
- # コード(質問用に整形して書いています)
37
+ # コード(追記 2/14)
38
+
39
+
40
+
38
-
41
+ クライアント側で、JSONデータをアラートで出すようにしたところ、クライアントから送信されたデータはJSONに変換されています。しかし、サーバー(GO)でそのJSONを受け取ってコンソールに出力しようとしたら、エラーが出ています。
39
-
40
-
42
+
43
+
44
+
45
+
46
+
47
+
48
+
41
- コードのままだとフォームから送信されたータは、JSONではないため失敗ます、現状を共有します。
49
+ レスポンスィを出力するよう`fmt.Print(r.Body)`とた結果下記です。
50
+
51
+
52
+
53
+ ```
54
+
55
+ &{0xc0000aa520 <nil> <nil> false true {0 0} false false false 0x129bc20}
56
+
57
+ ```
58
+
59
+
60
+
61
+ またそのデータをデコードした結果、出力されたエラーが下記です。
62
+
63
+
64
+
65
+ ```
66
+
67
+ invalid character 'i' in literal true (expecting 'r')
68
+
69
+ ```
70
+
71
+
72
+
73
+ デコードしているGoのコード
42
74
 
43
75
 
44
76
 
45
77
  ```go
46
78
 
79
+ func roomCreate(w http.ResponseWriter, r *http.Request) {
80
+
81
+ var room model.Room
82
+
83
+ if r.Body == nil {
84
+
85
+ fmt.Printf("レスポンスボディは空です。\n")
86
+
87
+ }
88
+
89
+ err := json.NewDecoder(r.Body).Decode(&room)
90
+
91
+ if err != nil {
92
+
93
+ fmt.Printf("エラー内容\n「%v」\n", err)
94
+
95
+ }
96
+
97
+ fmt.Printf("データ\n%v\n", room)
98
+
99
+ http.Redirect(w, r, "/room", 302)
100
+
101
+ }
102
+
103
+ ```
104
+
105
+
106
+
107
+ 下記が全体のコードになります。
108
+
109
+
110
+
111
+ ```html
112
+
113
+ <form id="roomForm" method="POST" action="/room/new">
114
+
115
+ <div class="form-group">
116
+
117
+ <label>掲示板の名前</label>
118
+
119
+ <input type="text" name="title" id="roomTitle" class="form-control">
120
+
121
+ </div>
122
+
123
+ <div class="form-group">
124
+
125
+ <label>掲示板の説明</label>
126
+
127
+ <textarea name="content" rows="3" id="roomContent" class="form-control"></textarea>
128
+
129
+ </div>
130
+
131
+ <button type="submit">作成する</button>
132
+
133
+ </form>
134
+
135
+ ```
136
+
137
+
138
+
139
+ ```js
140
+
141
+ $(function () {
142
+
143
+ $("#roomForm").on('submit', function () {
144
+
145
+ $("#roomForm").attr("disable", true);
146
+
147
+ $.ajax({
148
+
149
+ method: 'POST',
150
+
151
+ url: '/routes_room.go',
152
+
153
+ contentType: 'application/json',
154
+
155
+ dataType: 'JSON',
156
+
157
+ scriptCharset: 'utf-8',
158
+
159
+ cache: 'false',
160
+
161
+ timeout: 10000,
162
+
163
+ data: {
164
+
165
+ "title": $("#roomTitle").val(),
166
+
167
+ "content": $("#roomContent").val()
168
+
169
+ }
170
+
171
+ })
172
+
173
+ .done((data) => {
174
+
175
+ alert(data)
176
+
177
+ })
178
+
179
+ .fail((data) => {
180
+
181
+ alert(data)
182
+
183
+ })
184
+
185
+ .always(() => {
186
+
187
+ $("#roomForm").attr("disable", false);
188
+
189
+ });
190
+
191
+ });
192
+
193
+ });
194
+
195
+
196
+
197
+
198
+
199
+ ```
200
+
201
+
202
+
203
+ ```go
204
+
47
205
  type Room struct {
48
206
 
49
207
  ID int `json:"id"`
@@ -122,38 +280,10 @@
122
280
 
123
281
 
124
282
 
125
- ```html
126
-
127
- <form method="POST" action="/room/new">
128
-
129
- <div class="form-group">
130
-
131
- <label>掲示板の名前</label>
132
-
133
- <input type="text" name="title" id="roomTitle" class="form-control">
134
-
135
- </div>
136
-
137
- <div class="form-group">
138
-
139
- <label>掲示板の説明</label>
140
-
141
- <textarea name="content" rows="3" id="roomContent" class="form-control"></textarea>
142
-
143
- </div>
144
-
145
- <button type="submit">作成する</button>
146
-
147
- </form>
148
-
149
- ```
150
-
151
283
 
152
284
 
153
285
  # 質問
154
286
 
287
+
288
+
155
- #### GO言語使っている皆様はブラウザのフォムから送信されたデタをどのようにJSONへ変換されていますか?
289
+ #### なぜJSON側で受け取れていないんでしょうか?
156
-
157
-
158
-
159
- 回答お待ちしております。よろしくおねがいします!