[GO]サーバーのGET/POSTの送受信練習用

久しぶりにGOを触ったので、練習代わりに書いたやつ

複数のサイトからコピペし、不十分なところを適宜直した

そのうち、綺麗に直すかも

GO自体、paiza以来2年ぶり、GOのサーバーサイド触れて2日だからミスあるかも


環境

事前準備

  1. 適当なフォルダを作って、そこにファイル「server.go」を作成
  2. コマンドプロンプトで「go mod init Test」を入力→「go.mod」が生成

コード

server.go


package main

import (
	"bytes"
	"encoding/json"
	"fmt"
	"io"
	"net/http"
	"strings"
)

//名簿
type Post struct {
	User string
	ID   int
}

var id_inc = 1
var j_data = []Post{
	{
		User: "Taro", ID: 0,
	},
}

// UserとIDをGETで取得(http://127.0.0.1:8080/get).
func get(w http.ResponseWriter, r *http.Request) {
	response, err := http.Get("http://127.0.0.1:8080/ip_ep")
	if err != nil {
		fmt.Println("Error:", err)
		return
	}
	defer response.Body.Close()

	// レスポンスを読み取る
	body, err := io.ReadAll(response.Body)
	if err != nil {
		fmt.Println("Error reading response:", err)
		return
	}
	// レスポンスを表示
	fmt.Println(strings.ReplaceAll(string(body), `\"`, ""))
}

// UserをPOSTで送信(http://127.0.0.1:8080/post?name=名前).
func post(w http.ResponseWriter, r *http.Request) {
	var data = r.FormValue("name")
	jsonData, err := json.Marshal(data)
	if err != nil {
		fmt.Println("Error encoding JSON:", err)
		return
	}
	// POSTリクエスト送信
	response, err := http.Post("http://127.0.0.1:8080/ip_ep", "application/json", bytes.NewBuffer(jsonData))
	if err != nil {
		fmt.Println("Error:", err)
		return
	}
	defer response.Body.Close()

	// レスポンスを表示
	fmt.Println("Status Code:", response.StatusCode)
}

// データ登録(POST)/データ返す(GET)用.
func ip_ep(w http.ResponseWriter, r *http.Request) {
	switch r.Method {
	case http.MethodGet:
		w.Header().Set("Content-Type", "application/json")
		//名簿を持ってくる.
		post := &j_data
		json, _ := json.Marshal(post)
		//JSONに変換したものを送り返す.
		w.Write(json)
	case http.MethodPost:
		body, err := io.ReadAll(r.Body)
		if err != nil {
			http.Error(w, "Failed to read request body", http.StatusInternalServerError)
			return
		}
		defer r.Body.Close()
		//名簿に追加.
		j_data = append(j_data, Post{User: string(body), ID: id_inc})
		//INCRIMENT代わり.
		id_inc++
		//(人数確認用).
		fmt.Println(id_inc)
	default:
		fmt.Println("...")
	}
}

func main() {
	http.HandleFunc("/get", get)
	http.HandleFunc("/post", post)
	http.HandleFunc("/ip_ep", ip_ep)
	http.ListenAndServe(":8080", nil)
}
            

結果

ブラウザのURLに「http://localhost:8080/post?name=任意の名前」を入力すると、j_dataに名前、IDが追加される

ブラウザのURLに「http://127.0.0.1:8080/get」を入力すると、現在の名簿(j_data)の中身が表示される

(おまけ)JSONファイル読み込み、Webページで表示

使用ファイル

Webページから曲情報を取得/検索

「server.go」と同じ階層に、「index.html」「main.js」を置く

注意:「server.go」を実行中に「index.html」の検索ボタンを押す

POSTも必要なネタが思いつかなかった...

server.go


package main

import (
	"encoding/json"
	"fmt"
	"io"
	"net/http"
	"os"
	"strings"
)

type Music struct {
	ID    int    `json:"ID"`
	Name  string `json:"Name"`
	Album string `json:"Album"`
}

// UserとIDをGETで取得(http://127.0.0.1:8080/get).
func get(w http.ResponseWriter, r *http.Request) {
	w.Header().Set("Access-Control-Allow-Origin", "*") //アクセス自由
	switch r.Method {
	case http.MethodGet:
		w.Header().Set("Content-Type", "application/json")
		jsonFile, err := os.Open("data.json")
		if err != nil {
			fmt.Println("JSONファイルを開けません", err)
			return
		}
		defer jsonFile.Close()
		jsonData, err := io.ReadAll(jsonFile)
		if err != nil {
			fmt.Println("JSONデータを読み込めません", err)
			return
		}
		var ms []Music
		json.Unmarshal(jsonData, &ms)
		var rt []Music
		name_req := r.FormValue("name")
		album_req := r.FormValue("album")
		for _, v := range ms {
			if (strings.Contains(v.Name, name_req) || name_req == "") && (strings.Contains(v.Album, album_req) || album_req == "") {
				rt = append(rt, v)
			}
		}
		post := &rt
		json, _ := json.Marshal(post)
		w.Write(json)
	default:
		fmt.Println("...")
	}
}

func main() {
	http.HandleFunc("/get", get)
	http.ListenAndServe(":8080", nil)
}
			

index.html


<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>Test</title>
</head>
<body>
  曲名:<input id="music_name"><br>
  アルバム名:<input id="album_name"><br>
  <button onclick="get_data()">検索</button>
  <div id="result">

  </div>
  <script src="main.js"></script>
</body>
</html>
			

main.js


function get_data(){
    var request = new XMLHttpRequest();

	//パラメーターを付けて検索.
    var url = "http://127.0.0.1:8080/get?name=" 
    + document.getElementById("music_name").value + "&album=" 
    + document.getElementById("album_name").value;
    request.open('GET', url, true);

	//JSON形式で取得.
    request.responseType = 'json';
 
    request.onload = function () {
      var data = this.response;
      var hd;
      var res = "";
      if(data === null){
		//検索件数0件だったら.
        hd = "<p>検索結果:0件</p>";
        res += "<p>見つかりませんでした...</p>";
      }else{
		//検索件数.
        hd = "<p>検索結果:" + data.length + "件</p>";
        if(data.length > 100){
		  //件数が多すぎたら.
          res += "<p>検索結果が100件を超えてます!</p>";
        }else{
		  //要素作成.
          for(var i = 0;i < data.length;i++){
            res += "<br><p>" + (i + 1) + "</p>";
            res += "<ul><li>ID:" + data[i].ID 
            + "</li><li>曲名:" + data[i].Name 
            + "</li><li>アルバム名:" 
            + data[i].Album + "</li></ul>";
          }
        }
      }

	  //表示
      document.getElementById("result").innerHTML = hd + res;
    };
 
    request.send();
}