因此,我有了这个Go http处理程序,该处理程序将一些POST内容存储到数据存储中,并检索其他一些信息作为响应。在后端,我使用:
func handleMessageQueue(w http.ResponseWriter, r *http.Request) { w.Header().Set("Access-Control-Allow-Origin", "*") if r.Method == "POST" { c := appengine.NewContext(r) body, _ := ioutil.ReadAll(r.Body) auth := string(body[:]) r.Body.Close() q := datastore.NewQuery("Message").Order("-Date") var msg []Message key, err := q.GetAll(c, &msg) if err != nil { c.Errorf("fetching msg: %v", err) return } w.Header().Set("Content-Type", "application/json") jsonMsg, err := json.Marshal(msg) msgstr := string(jsonMsg) fmt.Fprint(w, msgstr) return } }
在我的firefox OS应用程序中,我使用:
var message = "content"; request = new XMLHttpRequest(); request.open('POST', 'http://localhost:8080/msgs', true); request.onload = function () { if (request.status >= 200 && request.status < 400) { // Success! data = JSON.parse(request.responseText); console.log(data); } else { // We reached our target server, but it returned an error console.log("server error"); } }; request.onerror = function () { // There was a connection error of some sort console.log("connection error"); }; request.send(message);
传入的部分都一直如此。但是,我的回复被阻止了。给我以下信息:
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://localhost:8080/msgs. This can be fixed by moving the resource to the same domain or enabling CORS.
我尝试了许多其他操作,但是无法从服务器获得响应。但是,当我将Go POST方法更改为GET并通过浏览器访问该页面时,我得到的数据太糟糕了。我无法真正确定哪一方出了错以及为什么出问题:这可能是Go不应阻止此类请求,但也可能是我的JavaScript非法。
@Egidius,在创建XMLHttpRequest时,应使用
var xhr = new XMLHttpRequest({mozSystem: true});
什么是mozSystem?
mozSystem布尔值:将此标志设置为true可以进行跨站点连接,而无需服务器使用CORS选择加入。需要设置mozAnon:true,即不能与发送cookie或其他用户凭证一起使用。这仅适用于特权(已审核)的应用程序;它不适用于Firefox中加载的任意网页。
清单变更
在清单上,请不要忘记在您的权限中包括以下行:
"permissions": { "systemXHR" : {}, }