无法在Go中获取Angular/Restangular表单数据

huangapple go评论196阅读模式
英文:

Cannot get Angular/Restangular form data in Go

问题

我有一个正常工作的Go REST服务,我可以使用Chrome REST插件获取表单数据。
我需要从我的Angular应用程序获取表单数据到服务端,到目前为止我还无法弄清楚。

我的Angular代码:

  1. <form name="myForm">
  2. <div class="control-group" ng-class="{error: myForm.name.$invalid}">
  3. <label>Drug Name</label>
  4. <input type="text" name="drugName" ng-model="drug.name" required>
  5. <span ng-show="myForm.drugName.$error" class="help-inline">
  6. Required</span>
  7. </div>
  8. <a href="#/" class="btn">Cancel</a>
  9. <button ng-click="save()" ng-disabled="isClean() || myForm.$invalid"
  10. class="btn btn-primary">Save</button>
  11. <button ng-click="destroy()" ng-show="project._id"
  12. class="btn btn-danger">Delete</button>
  13. </form>

我的app.js中的CreateCtrl,我设置了 RestangularProvider.setBaseUrl('/rest/v1');

  1. function CreateCtrl($scope, $location, Restangular) {
  2. $scope.save = function() {
  3. Restangular.all('drugs/').post($scope.drug).then(function(project) {
  4. $location.path('/list');
  5. });
  6. }
  7. }

在我的Go代码中,我使用gorilla,以下是相关部分:

  1. http.Handle("/rest/v1/drugs/", drugs.MakeMuxer("/rest/v1/drugs/"))
  2. func MakeMuxer(prefix string) http.Handler {
  3. log.Println("**** drugs.MakeMuxer(): " + prefix);
  4. var m *mux.Router
  5. // 如果有前缀,则传递前缀。
  6. if prefix == "" {
  7. m = mux.NewRouter()
  8. } else {
  9. m = mux.NewRouter().PathPrefix(prefix).Subrouter()
  10. }
  11. m.HandleFunc("/", CreateDrug).Methods("POST")
  12. // 其他所有请求都应该返回404。
  13. //m.HandleFunc("/{path:.*}", gorca.NotFoundFunc)
  14. return m
  15. }
  16. func CreateDrug(w http.ResponseWriter, r *http.Request) {
  17. log.Println("**** CreateDrug.... ");
  18. log.Println("drugName: " + r.FormValue("drugName"))
  19. //c := appengine.NewContext(r)
  20. }

我可以看到POST请求进入了"CreateDrug"函数,但是r.FormValue("drugName")是空的(当我使用浏览器的REST插件并将"drugName"设置为某个值时,它不为空)。

英文:

I have a Go rest service that works fine, I can get form data using a Chrome REST plugin.
I need to get form data from my Angular app to the service, and so far I cannot figure it out.

My Angular code:

  1. &lt;form name=&quot;myForm&quot;&gt;
  2. &lt;div class=&quot;control-group&quot; ng-class=&quot;{error: myForm.name.$invalid}&quot;&gt;
  3. &lt;label&gt;Drug Name&lt;/label&gt;
  4. &lt;input type=&quot;text&quot; name=&quot;drugName&quot; ng-model=&quot;drug.name&quot; required&gt;
  5. &lt;span ng-show=&quot;myForm.drugName.$error&quot; class=&quot;help-inline&quot;&gt;
  6. Required&lt;/span&gt;
  7. &lt;/div&gt;
  8. &lt;a href=&quot;#/&quot; class=&quot;btn&quot;&gt;Cancel&lt;/a&gt;
  9. &lt;button ng-click=&quot;save()&quot; ng-disabled=&quot;isClean() || myForm.$invalid&quot;
  10. class=&quot;btn btn-primary&quot;&gt;Save&lt;/button&gt;
  11. &lt;button ng-click=&quot;destroy()&quot; ng-show=&quot;project._id&quot;
  12. class=&quot;btn btn-danger&quot;&gt;Delete&lt;/button&gt;
  13. &lt;/form&gt;

My app.js CreateCtrl, I set RestangularProvider.setBaseUrl(&#39;/rest/v1&#39;);:

  1. function CreateCtrl($scope, $location, Restangular) {
  2. $scope.save = function() {
  3. Restangular.all(&#39;drugs/&#39;).post($scope.drug).then(function(project) {
  4. $location.path(&#39;/list&#39;);
  5. });
  6. }
  7. }

In my Go code, I am using gorilla, and here are the pertinent parts:

  1. http.Handle(&quot;/rest/v1/drugs/&quot;, drugs.MakeMuxer(&quot;/rest/v1/drugs/&quot;));
  2. func MakeMuxer(prefix string) http.Handler {
  3. log.Println(&quot;**** drugs.MakeMuxer(): &quot; + prefix);
  4. var m *mux.Router
  5. // Pass through the prefix if we have one.
  6. if prefix == &quot;&quot; {
  7. m = mux.NewRouter()
  8. } else {
  9. m = mux.NewRouter().PathPrefix(prefix).Subrouter()
  10. }
  11. m.HandleFunc(&quot;/&quot;, CreateDrug).Methods(&quot;POST&quot;)
  12. // Everything else should 404.
  13. //m.HandleFunc(&quot;/{path:.*}&quot;, gorca.NotFoundFunc)
  14. return m
  15. }
  16. func CreateDrug(w http.ResponseWriter, r *http.Request) {
  17. log.Println(&quot;**** CreateDrug.... &quot;);
  18. log.Println(&quot;drugName: &quot; + r.FormValue(&quot;drugName&quot;))
  19. //c := appengine.NewContext(r)
  20. }

I can see that the POST is getting into "CreateDrug", but r.FormValue(&quot;drugName&quot;) is empty (it is not empty when I use a browser rest plugin and set "drugName" to some value.

答案1

得分: 0

在调用r.FormValue之前,你需要调用r.ParseForm()

//编辑

在查阅了AngularJS之后,我注意到它将数据发送为JSON格式,所以你需要使用json.NewDecoder示例

  1. type Drug struct {
  2. Name string `json:"drugName"`
  3. }
  4. func CreateDrug(w http.ResponseWriter, r *http.Request) {
  5. defer r.Body.Close()
  6. var d Drug
  7. dec := json.NewDecoder(r.Body)
  8. dec.Decode(&d)
  9. log.Println("**** CreateDrug.... ")
  10. log.Println("drugName:", d.Name)
  11. }
英文:

You need to call r.ParseForm() before you can call r.FormValue.

//edit

After looking up angularjs, I noticed it sends the data as json, so you have to use json.NewDecoder, example:

  1. type Drug struct {
  2. Name string `json:&quot;drugName&quot;`
  3. }
  4. func CreateDrug(w http.ResponseWriter, r *http.Request) {
  5. defer r.Body.Close()
  6. var d Drug
  7. dec := json.NewDecoder(r.Body)
  8. dec.Decode(&amp;d)
  9. log.Println(&quot;**** CreateDrug.... &quot;)
  10. log.Println(&quot;drugName:&quot;, d.Name)
  11. }

huangapple
  • 本文由 发表于 2014年7月6日 09:15:21
  • 转载请务必保留本文链接:https://go.coder-hub.com/24591870.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定