- Windows11
- VScode
- GO 1.24.3
久しぶりにGOを触ったので、練習代わりに書いたやつ
複数のサイトからコピペし、不十分なところを適宜直した
そのうち、綺麗に直すかも
GO自体、paiza以来2年ぶり、GOのサーバーサイド触れて2日だからミスあるかも
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)の中身が表示される
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();
}