drfrvbq736383 2014-07-06 01:15
浏览 47
已采纳

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

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:

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

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

function CreateCtrl($scope, $location, Restangular) {
$scope.save = function() {
    Restangular.all('drugs/').post($scope.drug).then(function(project) {
        $location.path('/list');
    });
}
}

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

http.Handle("/rest/v1/drugs/", drugs.MakeMuxer("/rest/v1/drugs/"));
func MakeMuxer(prefix string) http.Handler {

log.Println("**** drugs.MakeMuxer(): " + prefix);

var m *mux.Router

// Pass through the prefix if we have one.
if prefix == "" {
    m = mux.NewRouter()
} else {
    m = mux.NewRouter().PathPrefix(prefix).Subrouter()
}


m.HandleFunc("/", CreateDrug).Methods("POST")

// Everything else should 404.
//m.HandleFunc("/{path:.*}", gorca.NotFoundFunc)

return m
}

func CreateDrug(w http.ResponseWriter, r *http.Request) {

log.Println("**** CreateDrug.... ");
log.Println("drugName: " + r.FormValue("drugName"))
//c := appengine.NewContext(r)

}

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

  • 写回答

1条回答 默认 最新

  • duangai1368 2014-07-06 01:55
    关注

    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:

    type Drug struct {
        Name string `json:"drugName"`
    }
    func CreateDrug(w http.ResponseWriter, r *http.Request) {
        defer r.Body.Close()
        var d Drug
        dec := json.NewDecoder(r.Body)
        dec.Decode(&d)
        log.Println("**** CreateDrug.... ")
        log.Println("drugName:", d.Name)
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 Vue3 大型图片数据拖动排序
  • ¥15 划分vlan后不通了
  • ¥15 GDI处理通道视频时总是带有白色锯齿
  • ¥20 用雷电模拟器安装百达屋apk一直闪退
  • ¥15 算能科技20240506咨询(拒绝大模型回答)
  • ¥15 自适应 AR 模型 参数估计Matlab程序
  • ¥100 角动量包络面如何用MATLAB绘制
  • ¥15 merge函数占用内存过大
  • ¥15 使用EMD去噪处理RML2016数据集时候的原理
  • ¥15 神经网络预测均方误差很小 但是图像上看着差别太大