3

私は Go に非常に慣れていないので、これがばかげている場合はご容赦ください。

gorest を使用して、Go で記述された REST API にフォームを投稿しようとしています。GET を使用してこれを正常に実行しましたが、POST データをマップに解析することができません。これが私のGoコードです

gotest.go:

package main
import (
  "code.google.com/p/gorest"
  "net/http"
  "fmt"
)

func main() {
  gorest.RegisterService(new(HelloService)) //Register our service                                        
  http.Handle("/",gorest.Handle())
  http.ListenAndServe(":8787",nil)
}

//Service Definition                                                                                      
type HelloService struct {
  gorest.RestService `root:"/api/"`
  save   gorest.EndPoint `method:"POST" path:"/save/" output:"string" postdata:"map[string]string"`
}

func(serv HelloService) Save(PostData map[string]string) {
  fmt.Println(PostData)
}

そして私の素晴らしいHTMLフォーム:

<form method="POST" action="http://127.0.0.1:8787/api/save/">
  key: <input type="text" name="key" /><br />  
  json: <input type="text" name="json" /><br />
  <input type="submit" />
</form>

そうすれば、投稿データがアクセスできる素敵な地図に変わると思います。フォームに入力して [送信] をクリックすると、エラーが返されます。

Error Unmarshalling data using application/json. Client sent incompetible data format in entity. (invalid character 'k' looking for beginning of value)

編集: greggory.hz が指摘するように、プログラムは投稿データが json であると考えているようです。このエラーは、json が中かっこ、大かっこ、または引用符で始まる必要があるためです。

これmap[string]stringstring実行しているbashターミナルに次を出力する場合:

key=arst&json=%7B%27arst%27%3A%27arst%27%7D

ゴーレストのドキュメントで、私が見つけた唯一の例は次のとおりです。

posted gorest.EndPoint method:"POST" path:"/post/"  postdata:"User" 
func(serv HelloService) Posted(posted User)

しかし、カスタム構造体を作成しようとしても、上記と同じアンマーシャリング エラーで失敗しました。

type MyStruct struct {
  key,json string
}

誰かが私が使用すべきデータ型を教えてもらえますか?

4

1 に答える 1

3

json ボディを期待するサービスに html フォームを投稿しようとしています。ただし、ブラウザは投稿を application/json としてフォーマットしません。代わりに、urlencoded ボディとしてフォーマットします。問題はあなたのgoサーバーコードにあるのではなく、html形式にあります。標準の HTML フォームの代わりに、JavaScript を使用して投稿をパッケージ化して送信することをお勧めします。

<div>
  <input type="hidden" name="endpont" value="http://127.0.0.1:8787/api/save/" />
  key: <input type="text" name="key" /><br /> <!-- this should be used in your post url -->
  json: <input type="text" name="json" /><br /> <!-- this will get sent by your javascript as the post body -->
  <input type="button" onclick="send_using_ajax();" />
</div>
于 2013-05-29T16:40:34.217 に答える