2017-01-12 5 views
2

私はGoのhttpパッケージを使用して簡単なWebサーバーを作成しています。私はただ一つのハンドラを登録しています、 "/ requests /"というパスへのリクエストです。WebサーバーがPOSTリクエストを処理していない

これはGETリクエストをうまく処理できますが、POSTリクエストを送信すると、ハンドラは呼び出されず、クライアントは301 Moved Permanentlyレスポンスを取得します。

私はこれを検索しようとしましたが、これは人々がよく直面している問題ではないようです。

私のハンドラは、次のとおりです。

func requestHandler(w http.ResponseWriter, r *http.Request) { 
    fmt.Fprintf(w, "Hello") 
} 

主な機能:

>> curl -i -X POST http://localhost:8000/requests 
HTTP/1.1 301 Moved Permanently 
Location: /requests/ 
Date: Thu, 12 Jan 2017 08:51:10 GMT 
Content-Length: 0 
Content-Type: text/plain; charset=utf-8 

ゴー独自のHTTPクライアントは、同様のレスポンスオブジェクトを返します:

func main() { 
    mux := http.NewServeMux() 
    mux.HandleFunc("/requests/", requestHandler) 
    http.ListenAndServe(":8000", mux) 
} 

カールは、次のような出力を提供します

&{301 Moved Permanently 301 HTTP/1.1 1 1 map[Content-Type:[text/plain; charset=utf-8] Location:[/requests/] Date:[Thu, 12 Jan 2017 08:51:58 GMT] Content-Length:[0]] 0x339190 0 [] false false map[] 0xc4200cc0f0 <nil>} 

また、GETリクエストは、ハンドラ関数を呼び出すと同時に動作すると思います。 POST要求を処理するために何か別の処理を行う必要がありますか?これに助けてくれてありがとう!

+2

あなたのパスは '/ requests /'で、 '/ requests'ではありません。 – tkausl

答えて

3

/requestsを照会しています。あなたはmux.HandleFunc/requests代わりの/requests/を使用するか必要

curl localhost:8000/requests

リダイレクトが/requests/

にあなたを指しているあなたは、このようなカールを使用していました。

または

curl localhost:8000/requests/

を使用するには、また、あなたが要求した場合、それは自動的にリダイレクトを扱うよう変更することなく、ブラウザ上で動作することに注意してください。

また、mux.HandleFuncのルートにスラッシュが付いていない場合は、スラッシュを含むルートが404を返します。

PS:requestHandlerは、POSTリクエストだけでなく、すべてのメソッドを処理します。メソッドを異なる方法で処理するには、r.Methodをチェックする必要があります。

+1

ありがとう!私は末尾にスラッシュを気にする必要があります。 – beruuu

+1

@beruuu、スラッシュの有無にかかわらず、それらが表すリソースへのアクセスに関しては意味的に異なることをご理解ください。 [この文書](http://sebastians-pamphlets.com/thou-must-not-steal-the-trailing-slash-from-my-urls/)から始めることを検討してください。 – kostix

関連する問題