Go で POST リクエストされたデータを Read する方法がわからないです。
*http.Request
の ParseForm()
メソッドを用いることが一般的ですが、以下のような net/http
パッケージを使用しない場合で、適切な扱い方がわからないです。
教えていただきたいこと
net/http
パッケージを使用せず、POST リクエストのデータを取得する方法を教えていただきたいです。
実装
以下のコードが例です。上記の URL に記載されている URL と同様です。
go
1package main 2 3import ( 4 "bufio" 5 "fmt" 6 "io" 7 "log" 8 "net" 9 "strconv" 10 "strings" 11) 12 13func handleConn(conn net.Conn) { 14 defer conn.Close() 15 scanner := bufio.NewScanner(conn) 16 i := 0 17 headers := map[string]string{} 18 var url, method string 19 for scanner.Scan() { 20 ln := scanner.Text() 21 fmt.Println(ln) 22 23 if i == 0 { 24 fs := strings.Fields(ln) 25 method := fs[0] 26 url = fs[1] 27 fmt.Println("METHOD", method) 28 fmt.Println("URL", url) 29 } else { 30 // in headers now 31 // when line is empty, header is done 32 if ln == "" { 33 break 34 } 35 fs := strings.SplitN(ln, ": ", 2) 36 headers[fs[0]] = fs[1] 37 } 38 39 i++ 40 } 41 42 // parse body 43 44 // ここがポイントと思われる 45 if method == "POST" || method == "PUT" { 46 amt, _ := strconv.Atoi(headers["Content-Length"]) 47 buf := make([]byte, amt) 48 // 単に ReadFull ではデータを読み込むことができない 49 io.ReadFull(conn, buf) 50 // in buf we will have the POST content 51 fmt.Println("BODY:", string(buf)) 52 } 53 // ここまで 54 55 // response 56 body := ` 57<!DOCTYPE html> 58<html lang="en"> 59<head> 60 <meta charset="UTF-8"> 61 <title></title> 62</head> 63<body> 64 <form method="POST"> 65 <input type="text" name="key" value=""> 66 <input type="submit"> 67 </form> 68</body> 69</html> 70 ` 71 72 io.WriteString(conn, "HTTP/1.1 200 OK\r\n") 73 fmt.Fprintf(conn, "Content-Length: %d\r\n", len(body)) 74 io.WriteString(conn, "\r\n") 75 io.WriteString(conn, body) 76} 77 78func main() { 79 server, err := net.Listen("tcp", ":9000") 80 if err != nil { 81 log.Fatalln(err.Error()) 82 } 83 defer server.Close() 84 85 for { 86 conn, err := server.Accept() 87 if err != nil { 88 log.Fatalln(err.Error()) 89 } 90 go handleConn(conn) 91 } 92}
- クライアントの POST リクエスト
このときクライアントの curl で以下のように POST リクエストを送信したとします。
curl -v http://localhost:9000 -X POST -d "Sample message."
- サーバに出力されるメッセージ
しかしながらサーバ側には以下のように POST リクエストで送信されているデータを読み込むことができません。
POST / HTTP/1.1 METHOD POST URL / Host: localhost:9000 User-Agent: curl/7.55.1 Accept: */* Content-Length: 4 Content-Type: application/x-www-form-urlencoded
"BODY:": Sample message.
が表示されることを想定しているのですが、POST リクエストのデータが読み込めない理由がわからず、教えていただけると助かります。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/11/22 12:45 編集
2019/11/22 13:15
2019/11/22 13:29
2019/11/22 13:30
2019/11/22 13:52 編集
2019/11/22 13:54
2019/11/22 13:55