カテゴリー別アーカイブ: golang

GoでJSONをPOSTしてDjangoで受信してみる

最近Goglandのプレビュー版でコーディングを行っていますが、やっぱりJetBrainsのIDEはいいですね。

おかげで乏しかったGoプロ力が少しずつ付いてきている気がします。


さて、表題の通りですがGoでJSONをPOSTしたい時がありまして、調査も兼ねてテストしてみました。

受信するのはDjangoで、テストのためCSRFは検証しない設定にしています。

参考

コード

Go

package main

import (
    "net/http"
    "fmt"
    "bytes"
)

func main() {
    jsonStr := "{}"

    req, err := http.NewRequest(
        "POST",
        "http://localhost:8000/test",
        bytes.NewBuffer([]byte(jsonStr)),
    )
    if err != nil {
        fmt.Println(err)
    }

    // Content-Type 設定
    req.Header.Set("Content-Type", "application/json")

    client := &http.Client{}
    resp, err := client.Do(req)
    if err != nil {
        fmt.Println(err)
    }
    defer resp.Body.Close()
}

Django (views.py)

@csrf_exempt
def test(request):
    if request.method == "POST":
        params = json.loads(request.body.decode())
        print(params)
    return HttpResponse("OK")

request.POST[“data”]をクライアント側に設定するみたいな記事も多かったのですが、content-typeを設定しているのですからrequest.bodyから読むのが筋と思いこのような方法を取っています。

あとbyte型はstr()で変換できないという事を忘れてちょっとハマってしまったorz

Goでsocketに対して自前のヘッダーでPOSTする

最近Go言語で物を作っています。この言語、楽しいんですが、使いこなすのが難しそうですね・・・

というわけで、Go言語でUNIX domain socketに対して自前でヘッダー作ってPOSTしたかった話です。

簡単にできる方のnet/httpモジュールを使いたかったのですが、UNIX domain socketにファイル名から接続することはできませんでした。

そこで調べているとnetモジュールから直接ソケットに接続してデータを送る方法がありました。

ヘッダーも自分で作る必要がありますが、とりあえずこの方法でやってみようと思います。

    conn, err := net.Dial("unix", "/path/to/your/go.sock")
    if err != nil {
        log.Printf("error: %v\n", err)
        return
    }
    defer conn.Close()
    fmt.Fprintf(conn, "POST /get HTTP/1.0\r\nContent-Type: application/x-www-form-urlencoded\r\nContent-Length: 4\r\n\r\nid=5")
    readBuf := make([]byte, 1024)
    readlen, err := conn.Read(readBuf)
    if err != nil {
        log.Printf("error: %v\n", err)
        return
    }
    fmt.Println("response: " + string(readBuf[:readlen]))

ポイントはヘッダーにContent-Type: application/x-www-form-urlencodedとContent-Length: 4を入れているところです。サーバーもGoで書いているのですが、最低限このヘッダーが必要らしく、しばらく調べ回ってしまいました・・・

参考

  • https://github.com/kaneshin/playground/blob/master/go/net/listen-unixdomainsocket/main.go
  • https://golang.org/pkg/net/
  • https://support.f5.com/kb/en-us/solutions/public/2000/100/sol2167.html
  • http://rarara.cafe.coocan.jp/cgi-bin/lng/vc/vclng.cgi?print+200606/06060021.txt