2013-05-28 74 views
3

我很新,所以請原諒我,如果這是愚蠢的明顯。我應該在我的POST請求中使用哪種類型的gorest?

我正在嘗試將表單發佈到使用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指出,該計劃似乎認爲POST數據是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 
} 

有人可以告訴我我應該使用什麼樣的數據類型嗎?

+0

我主要猜這裏是因爲我不熟悉gorest具體,但我相信它試圖解析POST數據作爲JSON的整體,而不僅僅是使用JSON鍵關聯的值。 也就是說,我相信它除了發佈請求中的所有數據被格式化爲JSON。 – gregghz

+1

更具體地說:key = arst&json =%7B%27arst%27%3A%27arst%27%7D無效JSON。 – gregghz

+1

字符串'key = arst&json =%7B%27arst%27%3A%27arst%27%7D'看起來像一個URL變量路徑。嘗試避免使用字符串(http://golang.org/pkg/net/url/#QueryUnescape)。這個錯誤聽起來像是試圖解開「密鑰」一詞。 – Intermernet

回答

3

您正在嘗試將html表單發佈到期待json正文的服務。但是,您的瀏覽器不會將該帖子格式化爲application/json。它會將其格式化爲urlencoded身體。問題不在於你的服務器代碼是在html表單中。您可能希望使用JavaScript打包併發送您的帖子,而不是標準的HTML表單。

<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> 
+1

以上是我修復您編寫的代碼的答案。不過/ api/save並不是特別安靜的端點。更適合什麼gorest會期待你的端點將更像是:/ api/keyname和GET,POST,PUT和公司將是你正在做的行動。 GET =檢索,POST =修改,並且PUT =通常創建。 –

相關問題