質問編集履歴

4 編集2

uk_63

uk_63 score 23

2019/02/14 11:39  投稿

「Go言語」フォームから送信されたJSONをサーバー側で受け取れない..............
# はじめに
質問を読んでくださりありがとうございます。
環境
mac
go 1.11
Go言語の勉強のためにWebアプリケーションを作っています。
そこでブラウザの`form`からから送信されたデータをJSONに変換して、構造体にマッピングし、SQLに保存したいと考えています。しかし、ブラウザから送信されたデータをJSONに変換できず、詰まっています。
**なので、まずはブラウザから送信されたデータをJSONに変換して構造体へマッピング、コンソール上に表示までができるようになりたいです。**
# 試したこと
こちらの記事「[jQueryでJSONをPOSTしてJSONのレスポンスを受け取る](https://www.walbrix.co.jp/blog/2013-08-jquery-json-post.html)」を参考にしてJSONをフォームからの送信を試みましたが、失敗しました。
# コード(追記 2/14)
クライアント側で、JSONデータをアラートで出すようにしたところ、クライアントから送信されたデータはJSONに変換されています。しかし、サーバー(GO)でそのJSONを受け取ってコンソールに出力しようとしたら、エラーが出ています。
レスポンスのボディを出力するように`fmt.Print(r.Body)`とした結果が下記です。
```
&{0xc0000aa520 <nil> <nil> false true {0 0} false false false 0x129bc20}
```
またそのデータをデコードした結果、出力されたエラーが下記です。
```
invalid character 'i' in literal true (expecting 'r')
```
デコードしているGoのコード
```go
func roomCreate(w http.ResponseWriter, r *http.Request) {
   var room model.Room
   if r.Body == nil {
       fmt.Printf("レスポンスボディは空です。\n")
   }
   err := json.NewDecoder(r.Body).Decode(&room)
   if err != nil {
       fmt.Printf("エラー内容\n「%v」\n", err)
   }
   fmt.Printf("データ\n%v\n", room)
   http.Redirect(w, r, "/room", 302)
}
```
下記が全体のコードになります。
```html
   <form id="roomForm" method="POST" action="/room/new">
       <div class="form-group">
           <label>掲示板の名前</label>
           <input type="text" name="title" id="roomTitle" class="form-control">
       </div>
       <div class="form-group">
           <label>掲示板の説明</label>
           <textarea name="content" rows="3" id="roomContent" class="form-control"></textarea>
       </div>
       <button type="submit">作成する</button>
   </form>
```
```js
$(function () {
   $("#roomForm").on('submit', function () {
       $("#roomForm").attr("disable", true);
       $.ajax({
           method: 'POST',
           url: '/routes_room.go',
           contentType: 'application/json',
           dataType: 'JSON',
           scriptCharset: 'utf-8',
           cache: 'false',
           timeout: 10000,
           data: {
               "title": $("#roomTitle").val(),
               "content": $("#roomContent").val()
           }
       })
       .done((data) => {
           alert(data)
       })
       .fail((data) => {
           alert(data)
       })
       .always(() => {
           $("#roomForm").attr("disable", false);
       });
   });
});
```
```go
type Room struct {
   ID       int      `json:"id"`
   Title    string   `json:"subject"`
   Content  string   `json:"content"`
   CreatedAt time.Time `json:"created_at"`
}
func roomCreate(w http.ResponseWriter, r *http.Request) {
   var room model.Room
   if r.Body == nil {
       fmt.Printf("レスポンスボディは空です。\n")
   }
   err := json.NewDecoder(r.Body).Decode(&room)
   if err != nil {
       fmt.Printf("エラー内容\n「%v」\n", err)
   }
   fmt.Printf("データ\n%v\n", room)
   http.Redirect(w, r, "/room", 302)
}
func main() {
   mux := http.NewServeMux()
   files := http.FileServer(http.Dir("assets"))
   mux.Handle("/static/", http.StripPrefix("/static/", files))
   mux.HandleFunc("/", homeIndex)
   mux.HandleFunc("/room/", roomIndex)
   mux.HandleFunc("/room/new", roomCreate)
   server := http.Server{
       Addr:   "127.0.0.1:8080",
       Handler: mux,
   }
   log.Fatal(server.ListenAndServe())
}
```
# コード(追記2)
フォームから送信すると、以前まで成功していたのが`$.ajax`の結果が`fail`になっています。HTML, JSのコードがおかしくないかみていただけますか?
```html
// actionの指定を消しました。 enctypeを追加しました。
<form id="roomForm" enctype="application/json" method="post">
       <div class="form-group">
           <label>掲示板の名前</label>
           <input type="text" name="title" value="Go言語コミュニティ" id="roomTitle" class="form-control">
       </div>
       <div class="form-group">
           <label>掲示板の説明</label>
           <textarea name="content" rows="3" id="roomContent" class="form-control"></textarea>
       </div>
       <button type="submit">作成する</button>
   </form>
```
```js
// url の指定を変えました。
// JSON.stringify(data)を付け加えました。
// この処理の結果はなぜかfailになります。
$(function () {
   $("#roomForm").on('submit', function () {
       $("#roomForm").attr("disable", true);
       let data = {
           title: $("#roomTitle").val(),
           content: $("#roomContent").val()
       };
       $.ajax({
           method: 'post',
           url: '/room/new',
           data:JSON.stringify(data),
           dataType: 'json',
           contentType: "application/json",
           timeout: 10000,
       })
       .done((data) => {
           alert(data);
       })
       .fail((data) => {
           alert("ERROR");
           alert(data);
       })
       .always(() => {
           $("#roomForm").attr("disable", false);
       });
       return false  
   });
});
```
すべてのバリデーションを通過し成功しました。
```go
func roomCreate(w http.ResponseWriter, r *http.Request) {
   fmt.Print("roomCreate is starting!!\n")
   // validation
   if r.Method != "POST" {
       fmt.Printf("メソッド : \n%v\n", r.Method)
       w.WriteHeader(http.StatusBadRequest)
       return
   }
   fmt.Print("バリデーション1 通過\n")
   if r.Header.Get("Content-Type") != "application/json" {
       fmt.Printf("レスポンスヘッダー : \n%v\n", r.Header.Get("Content-Type"))
       w.WriteHeader(http.StatusBadRequest)
       return
   }
   fmt.Print("バリデーション2 通過\n")
   //To allocate slice for request body
   length, err := strconv.Atoi(r.Header.Get("Content-Length"))
   if err != nil {
       fmt.Printf("コンテンツレングス : \n%v\n", r.Header.Get("Content-Length"))
       w.WriteHeader(http.StatusInternalServerError)
       return
   }
   fmt.Print("バリデーション3 通過\n")
   body := make([]byte, length)
   length, err = r.Body.Read(body)
   if err != nil && err != io.EOF {
       w.WriteHeader(http.StatusInternalServerError)
       return
   }
   fmt.Print("バリデーション4 通過\n")
   // ここから下がエラーみたいです。  
 
   var room model.Room
   err = json.Unmarshal(body[:length], &room)
   if err != nil {
       w.WriteHeader(http.StatusInternalServerError)
       return
   }
   fmt.Print("バリデーション5 通過\n")
   fmt.Printf("%v\n", room)
   w.WriteHeader(http.StatusOK)
   http.Redirect(w, r, "/room", 302)
}
```
# 質問
#### なぜJSONをサーバー側で受け取れていないんでしょうか?
  • Go

    776 questions

    Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

  • JSON

    1765 questions

    JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

3 編集

uk_63

uk_63 score 23

2019/02/14 11:35  投稿

「Go言語」フォームから送信されたJSONをサーバー側で受け取れない..............
# はじめに
質問を読んでくださりありがとうございます。
環境
mac
go 1.11
Go言語の勉強のためにWebアプリケーションを作っています。
そこでブラウザの`form`からから送信されたデータをJSONに変換して、構造体にマッピングし、SQLに保存したいと考えています。しかし、ブラウザから送信されたデータをJSONに変換できず、詰まっています。
**なので、まずはブラウザから送信されたデータをJSONに変換して構造体へマッピング、コンソール上に表示までができるようになりたいです。**
# 試したこと
こちらの記事「[jQueryでJSONをPOSTしてJSONのレスポンスを受け取る](https://www.walbrix.co.jp/blog/2013-08-jquery-json-post.html)」を参考にしてJSONをフォームからの送信を試みましたが、失敗しました。
# コード(追記 2/14)
クライアント側で、JSONデータをアラートで出すようにしたところ、クライアントから送信されたデータはJSONに変換されています。しかし、サーバー(GO)でそのJSONを受け取ってコンソールに出力しようとしたら、エラーが出ています。
レスポンスのボディを出力するように`fmt.Print(r.Body)`とした結果が下記です。
```
&{0xc0000aa520 <nil> <nil> false true {0 0} false false false 0x129bc20}
```
またそのデータをデコードした結果、出力されたエラーが下記です。
```
invalid character 'i' in literal true (expecting 'r')
```
デコードしているGoのコード
```go
func roomCreate(w http.ResponseWriter, r *http.Request) {
   var room model.Room
   if r.Body == nil {
       fmt.Printf("レスポンスボディは空です。\n")
   }
   err := json.NewDecoder(r.Body).Decode(&room)
   if err != nil {
       fmt.Printf("エラー内容\n「%v」\n", err)
   }
   fmt.Printf("データ\n%v\n", room)
   http.Redirect(w, r, "/room", 302)
}
```
下記が全体のコードになります。
```html
   <form id="roomForm" method="POST" action="/room/new">
       <div class="form-group">
           <label>掲示板の名前</label>
           <input type="text" name="title" id="roomTitle" class="form-control">
       </div>
       <div class="form-group">
           <label>掲示板の説明</label>
           <textarea name="content" rows="3" id="roomContent" class="form-control"></textarea>
       </div>
       <button type="submit">作成する</button>
   </form>
```
```js
$(function () {
   $("#roomForm").on('submit', function () {
       $("#roomForm").attr("disable", true);
       $.ajax({
           method: 'POST',
           url: '/routes_room.go',
           contentType: 'application/json',
           dataType: 'JSON',
           scriptCharset: 'utf-8',
           cache: 'false',
           timeout: 10000,
           data: {
               "title": $("#roomTitle").val(),
               "content": $("#roomContent").val()
           }
       })
       .done((data) => {
           alert(data)
       })
       .fail((data) => {
           alert(data)
       })
       .always(() => {
           $("#roomForm").attr("disable", false);
       });
   });
});
```
```go
type Room struct {
   ID       int      `json:"id"`
   Title    string   `json:"subject"`
   Content  string   `json:"content"`
   CreatedAt time.Time `json:"created_at"`
}
func roomCreate(w http.ResponseWriter, r *http.Request) {
   var room model.Room
   if r.Body == nil {
       fmt.Printf("レスポンスボディは空です。\n")
   }
   err := json.NewDecoder(r.Body).Decode(&room)
   if err != nil {
       fmt.Printf("エラー内容\n「%v」\n", err)
   }
   fmt.Printf("データ\n%v\n", room)
   http.Redirect(w, r, "/room", 302)
}
func main() {
   mux := http.NewServeMux()
   files := http.FileServer(http.Dir("assets"))
   mux.Handle("/static/", http.StripPrefix("/static/", files))
   mux.HandleFunc("/", homeIndex)
   mux.HandleFunc("/room/", roomIndex)
   mux.HandleFunc("/room/new", roomCreate)
   server := http.Server{
       Addr:   "127.0.0.1:8080",
       Handler: mux,
   }
   log.Fatal(server.ListenAndServe())
}
```
# コード(追記2)
フォームから送信すると、以前まで成功していたのが`$.ajax`の結果が`fail`になっています。HTML, JSのコードがおかしくないかみていただけますか?
```html
// actionの指定を消しました。 enctypeを追加しました。
<form id="roomForm" enctype="application/json" method="post">
       <div class="form-group">
           <label>掲示板の名前</label>
           <input type="text" name="title" value="Go言語コミュニティ" id="roomTitle" class="form-control">
       </div>
       <div class="form-group">
           <label>掲示板の説明</label>
           <textarea name="content" rows="3" id="roomContent" class="form-control"></textarea>
       </div>
       <button type="submit">作成する</button>
   </form>
```
```js
// url の指定を変えました。
// JSON.stringify(data)を付け加えました。  
// この処理の結果はなぜかfailになります。
 
$(function () {
   $("#roomForm").on('submit', function () {
       $("#roomForm").attr("disable", true);
       let data = {  
           title: $("#roomTitle").val(),  
           content: $("#roomContent").val()  
       };  
       $.ajax({
           method: 'post',
           url: '/room/new',
           data:JSON.stringify(data),  
           dataType: 'json',
           contentType: "application/json",
           timeout: 10000,
           data: {  
               "title": $("#roomTitle").val(),  
               "content": $("#roomContent").val()  
           }  
       })
       .done((data) => {
           alert(data);
       })
       .fail((data) => {
           alert("ERROR");
           alert(data);
       })
       .always(() => {
           $("#roomForm").attr("disable", false);
       });
   });
});
```
Goのコードも変えて細かくバリデーションをつけるように変えました。
```
```go
func roomCreate(w http.ResponseWriter, r *http.Request) {
   fmt.Print("roomCreate is starting!!\n")
   // validation
   if r.Method != "POST" {
       fmt.Printf("メソッド : \n%v\n", r.Method)
       w.WriteHeader(http.StatusBadRequest)
       return
   }
   fmt.Print("バリデーション1 通過\n")
   if r.Header.Get("Content-Type") != "application/json" {
       fmt.Printf("レスポンスヘッダー : \n%v\n", r.Header.Get("Content-Type"))
       w.WriteHeader(http.StatusBadRequest)
       return
   }
   fmt.Print("バリデーション2 通過\n")
   //To allocate slice for request body
   length, err := strconv.Atoi(r.Header.Get("Content-Length"))
   if err != nil {
       fmt.Printf("コンテンツレングス : \n%v\n", r.Header.Get("Content-Length"))
       w.WriteHeader(http.StatusInternalServerError)
       return
   }
   fmt.Print("バリデーション3 通過\n")
   body := make([]byte, length)
   length, err = r.Body.Read(body)
   if err != nil && err != io.EOF {
       w.WriteHeader(http.StatusInternalServerError)
       return
   }
   fmt.Print("バリデーション4 通過\n")
   // ここから下がエラーみたいです。
   var room model.Room
   err = json.Unmarshal(body[:length], &room)
   if err != nil {
       w.WriteHeader(http.StatusInternalServerError)
       return
   }
   fmt.Print("バリデーション5 通過\n")
   fmt.Printf("%v\n", room)
   w.WriteHeader(http.StatusOK)
   http.Redirect(w, r, "/room", 302)
}
```
# 質問
#### なぜJSONをサーバー側で受け取れていないんでしょうか?
  • Go

    776 questions

    Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

  • JSON

    1765 questions

    JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

2 コード変更

uk_63

uk_63 score 23

2019/02/14 11:29  投稿

「Go言語」フォームから送信されたJSONをサーバー側で受け取れない..............
# はじめに
質問を読んでくださりありがとうございます。
環境
mac
go 1.11
Go言語の勉強のためにWebアプリケーションを作っています。
そこでブラウザの`form`からから送信されたデータをJSONに変換して、構造体にマッピングし、SQLに保存したいと考えています。しかし、ブラウザから送信されたデータをJSONに変換できず、詰まっています。
**なので、まずはブラウザから送信されたデータをJSONに変換して構造体へマッピング、コンソール上に表示までができるようになりたいです。**
# 試したこと
こちらの記事「[jQueryでJSONをPOSTしてJSONのレスポンスを受け取る](https://www.walbrix.co.jp/blog/2013-08-jquery-json-post.html)」を参考にしてJSONをフォームからの送信を試みましたが、失敗しました。
# コード(追記 2/14)
クライアント側で、JSONデータをアラートで出すようにしたところ、クライアントから送信されたデータはJSONに変換されています。しかし、サーバー(GO)でそのJSONを受け取ってコンソールに出力しようとしたら、エラーが出ています。
レスポンスのボディを出力するように`fmt.Print(r.Body)`とした結果が下記です。
```
&{0xc0000aa520 <nil> <nil> false true {0 0} false false false 0x129bc20}
```
またそのデータをデコードした結果、出力されたエラーが下記です。
```
invalid character 'i' in literal true (expecting 'r')
```
デコードしているGoのコード
```go
func roomCreate(w http.ResponseWriter, r *http.Request) {
   var room model.Room
   if r.Body == nil {
       fmt.Printf("レスポンスボディは空です。\n")
   }
   err := json.NewDecoder(r.Body).Decode(&room)
   if err != nil {
       fmt.Printf("エラー内容\n「%v」\n", err)
   }
   fmt.Printf("データ\n%v\n", room)
   http.Redirect(w, r, "/room", 302)
}
```
下記が全体のコードになります。
```html
   <form id="roomForm" method="POST" action="/room/new">
       <div class="form-group">
           <label>掲示板の名前</label>
           <input type="text" name="title" id="roomTitle" class="form-control">
       </div>
       <div class="form-group">
           <label>掲示板の説明</label>
           <textarea name="content" rows="3" id="roomContent" class="form-control"></textarea>
       </div>
       <button type="submit">作成する</button>
   </form>
```
```js
$(function () {
   $("#roomForm").on('submit', function () {
       $("#roomForm").attr("disable", true);
       $.ajax({
           method: 'POST',
           url: '/routes_room.go',
           contentType: 'application/json',
           dataType: 'JSON',
           scriptCharset: 'utf-8',
           cache: 'false',
           timeout: 10000,
           data: {
               "title": $("#roomTitle").val(),
               "content": $("#roomContent").val()
           }
       })
       .done((data) => {
           alert(data)
       })
       .fail((data) => {
           alert(data)
       })
       .always(() => {
           $("#roomForm").attr("disable", false);
       });
   });
});
```
```go
type Room struct {
   ID       int      `json:"id"`
   Title    string   `json:"subject"`
   Content  string   `json:"content"`
   CreatedAt time.Time `json:"created_at"`
}
func roomCreate(w http.ResponseWriter, r *http.Request) {
   var room model.Room
   if r.Body == nil {
       fmt.Printf("レスポンスボディは空です。\n")
   }
   err := json.NewDecoder(r.Body).Decode(&room)
   if err != nil {
       fmt.Printf("エラー内容\n「%v」\n", err)
   }
   fmt.Printf("データ\n%v\n", room)
   http.Redirect(w, r, "/room", 302)
}
func main() {
   mux := http.NewServeMux()
   files := http.FileServer(http.Dir("assets"))
   mux.Handle("/static/", http.StripPrefix("/static/", files))
   mux.HandleFunc("/", homeIndex)
   mux.HandleFunc("/room/", roomIndex)
   mux.HandleFunc("/room/new", roomCreate)
   server := http.Server{
       Addr:   "127.0.0.1:8080",
       Handler: mux,
   }
   log.Fatal(server.ListenAndServe())
}
```
# コード(追記2)  
 
フォームから送信すると、以前まで成功していたのが`$.ajax`の結果が`fail`になっています。HTML, JSのコードがおかしくないかみていただけますか?  
 
```html  
// actionの指定を消しました。 enctypeを追加しました。  
 
<form id="roomForm" enctype="application/json" method="post">  
       <div class="form-group">  
           <label>掲示板の名前</label>  
           <input type="text" name="title" value="Go言語コミュニティ" id="roomTitle" class="form-control">  
       </div>  
       <div class="form-group">  
           <label>掲示板の説明</label>  
           <textarea name="content" rows="3" id="roomContent" class="form-control"></textarea>  
       </div>  
       <button type="submit">作成する</button>  
   </form>  
```  
 
```js  
// url の指定を変えました。  
// この処理の結果はなぜかfailになります。  
 
$(function () {  
   $("#roomForm").on('submit', function () {  
       $("#roomForm").attr("disable", true);  
       $.ajax({  
           method: 'post',  
           url: '/room/new',  
           dataType: 'json',  
           contentType: "application/json",  
           timeout: 10000,  
           data: {  
               "title": $("#roomTitle").val(),  
               "content": $("#roomContent").val()  
           }  
       })  
       .done((data) => {  
           alert(data);  
       })  
       .fail((data) => {  
           alert("ERROR");  
           alert(data);  
       })  
       .always(() => {  
           $("#roomForm").attr("disable", false);  
       });  
   });  
});  
 
```  
 
Goのコードも変えて細かくバリデーションをつけるように変えました。  
このコードのバリデーション4までは通過します。  
 
```go  
func roomCreate(w http.ResponseWriter, r *http.Request) {  
   fmt.Print("roomCreate is starting!!\n")  
   // validation  
   if r.Method != "POST" {  
       fmt.Printf("メソッド : \n%v\n", r.Method)  
       w.WriteHeader(http.StatusBadRequest)  
       return  
   }  
   fmt.Print("バリデーション1 通過\n")  
 
   if r.Header.Get("Content-Type") != "application/json" {  
       fmt.Printf("レスポンスヘッダー : \n%v\n", r.Header.Get("Content-Type"))  
       w.WriteHeader(http.StatusBadRequest)  
       return  
   }  
   fmt.Print("バリデーション2 通過\n")  
 
   //To allocate slice for request body  
   length, err := strconv.Atoi(r.Header.Get("Content-Length"))  
   if err != nil {  
       fmt.Printf("コンテンツレングス : \n%v\n", r.Header.Get("Content-Length"))  
       w.WriteHeader(http.StatusInternalServerError)  
       return  
   }  
   fmt.Print("バリデーション3 通過\n")  
 
   body := make([]byte, length)  
   length, err = r.Body.Read(body)  
   if err != nil && err != io.EOF {  
       w.WriteHeader(http.StatusInternalServerError)  
       return  
   }  
   fmt.Print("バリデーション4 通過\n")  
 
   // ここから下がエラーみたいです。  
 
   var room model.Room  
   err = json.Unmarshal(body[:length], &room)  
   if err != nil {  
       w.WriteHeader(http.StatusInternalServerError)  
       return  
   }  
   fmt.Print("バリデーション5 通過\n")  
   fmt.Printf("%v\n", room)  
   w.WriteHeader(http.StatusOK)  
   http.Redirect(w, r, "/room", 302)  
}  
 
```  
 
 
# 質問
#### なぜJSONをサーバー側で受け取れていないんでしょうか?
  • Go

    776 questions

    Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

  • JSON

    1765 questions

    JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

1 追記

uk_63

uk_63 score 23

2019/02/14 10:09  投稿

# はじめに
質問を読んでくださりありがとうございます。
環境
mac
go 1.11
Go言語の勉強のためにWebアプリケーションを作っています。
そこでブラウザの`form`からから送信されたデータをJSONに変換して、構造体にマッピングし、SQLに保存したいと考えています。しかし、ブラウザから送信されたデータをJSONに変換できず、詰まっています。
**なので、まずはブラウザから送信されたデータをJSONに変換して構造体へマッピング、コンソール上に表示までができるようになりたいです。**
# 試したこと
こちらの記事「[jQueryでJSONをPOSTしてJSONのレスポンスを受け取る](https://www.walbrix.co.jp/blog/2013-08-jquery-json-post.html)」を参考にしてJSONをフォームからの送信を試みましたが、失敗しました。
# コード(質問用に整形して書いています)
# コード(追記 2/14)
このコードのままだとフォームから送信されたデータは、JSONではないために失敗しますが、現状を共有します。
クライアント側で、JSONデータをアラートで出すようにしたところ、クライアントから送信されたデータはJSONに変換されています。しかし、サーバー(GO)でそのJSONを受け取ってコンソールに出力しようとしたら、エラーが出ています。
レスポンスのボディを出力するように`fmt.Print(r.Body)`とした結果が下記です。
```
&{0xc0000aa520 <nil> <nil> false true {0 0} false false false 0x129bc20}
```
またそのデータをデコードした結果、出力されたエラーが下記です。
```
invalid character 'i' in literal true (expecting 'r')
```
デコードしているGoのコード
```go
func roomCreate(w http.ResponseWriter, r *http.Request) {
   var room model.Room
   if r.Body == nil {
       fmt.Printf("レスポンスボディは空です。\n")
   }
   err := json.NewDecoder(r.Body).Decode(&room)
   if err != nil {
       fmt.Printf("エラー内容\n「%v」\n", err)
   }
   fmt.Printf("データ\n%v\n", room)
   http.Redirect(w, r, "/room", 302)
}
```
下記が全体のコードになります。
```html
   <form id="roomForm" method="POST" action="/room/new">
       <div class="form-group">
           <label>掲示板の名前</label>
           <input type="text" name="title" id="roomTitle" class="form-control">
       </div>
       <div class="form-group">
           <label>掲示板の説明</label>
           <textarea name="content" rows="3" id="roomContent" class="form-control"></textarea>
       </div>
       <button type="submit">作成する</button>
   </form>
```
```js
$(function () {
   $("#roomForm").on('submit', function () {
       $("#roomForm").attr("disable", true);
       $.ajax({
           method: 'POST',
           url: '/routes_room.go',
           contentType: 'application/json',
           dataType: 'JSON',
           scriptCharset: 'utf-8',
           cache: 'false',
           timeout: 10000,
           data: {
               "title": $("#roomTitle").val(),
               "content": $("#roomContent").val()
           }
       })
       .done((data) => {
           alert(data)
       })
       .fail((data) => {
           alert(data)
       })
       .always(() => {
           $("#roomForm").attr("disable", false);
       });
   });
});
```
```go
type Room struct {
   ID       int      `json:"id"`
   Title    string   `json:"subject"`
   Content  string   `json:"content"`
   CreatedAt time.Time `json:"created_at"`
}
func roomCreate(w http.ResponseWriter, r *http.Request) {
   var room model.Room
   if r.Body == nil {
       fmt.Printf("レスポンスボディは空です。\n")
   }
   err := json.NewDecoder(r.Body).Decode(&room)
   if err != nil {
       fmt.Printf("エラー内容\n「%v」\n", err)
   }
   fmt.Printf("データ\n%v\n", room)
   http.Redirect(w, r, "/room", 302)
}
func main() {
   mux := http.NewServeMux()
   files := http.FileServer(http.Dir("assets"))
   mux.Handle("/static/", http.StripPrefix("/static/", files))
   mux.HandleFunc("/", homeIndex)
   mux.HandleFunc("/room/", roomIndex)
   mux.HandleFunc("/room/new", roomCreate)
   server := http.Server{
       Addr:   "127.0.0.1:8080",
       Handler: mux,
   }
   log.Fatal(server.ListenAndServe())
}
```
```html  
<form method="POST" action="/room/new">  
       <div class="form-group">  
           <label>掲示板の名前</label>  
           <input type="text" name="title" id="roomTitle" class="form-control">  
       </div>  
       <div class="form-group">  
           <label>掲示板の説明</label>  
           <textarea name="content" rows="3" id="roomContent" class="form-control"></textarea>  
       </div>  
       <button type="submit">作成する</button>  
   </form>  
```  
# 質問
#### GO言語を使っている皆様はブラウザのフォームから送信されたデータをどのようにJSONへ変換されていますか?  
回答お待ちしております。よろしくおねがいします!
#### なぜJSONをサーバー側で受け取れていないんでしょうか?
  • Go

    776 questions

    Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

  • JSON

    1765 questions

    JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る