2016-10-20 43 views
-3

我不能解碼JSON我從我的JavaScript文件中獲得(服務器處理請求是寫在GO)解碼JSON從Javascript發送到golang服務器

我必須繼續下面的JavaScript代碼,以便發送一個要求。

function Connect() { 

var data = JSON.stringify({ 
    Version: "0.1", 
    Action: "test", 
    Data: {} 
}); 

var xhr = new XMLHttpRequest(); 
xhr.onreadystatechange = function() { 
    if (xhr.readyState == XMLHttpRequest.DONE) { 
     if(xhr.status >= 200 && xhr.status < 300) { 
      console.log(xhr.responseText); 
     } else { 
      console.warn(xhr); 
     } 
    } 
}; 
xhr.open("Post", "http://localhost:5252", true); 
xhr.setRequestHeader('Content-Type', 'application/json; charset=utf-8'); 
xhr.send(data); 
} 

據我所知,這應該工作,以便發送JSON到服務器。 我的服務器接收到這些請求,但我無法對其進行解碼。

func newRequestFromJSON(jsonData io.Reader) (*Request, error) { 
// Decode the JSON to the request value. 
decoder := json.NewDecoder(jsonData) 

var r Request 
err := decoder.Decode(&r) 
if err != nil { 
    return nil, e.New(err.Error() + " at " + u.GetFile_line()) 
} 

return &r, nil 
} 

Request結構看起來如下。

type Request struct { 
Version string 
Action string 
Data interface{} 
} 

而io.reader獲取request.body作爲參數。該代碼適用於如果例如我用firefox的HttpRequester插件發送同樣的東西。

我得到一個EOF錯誤,它表示請求是零。我認爲請求的主體是空的,但我不確定這一點。

我在這裏錯過了什麼?

+0

如果你的代碼在一種情況下工作,這意味着'newRequestFromJSON'工作。請在出現故障的情況下說明如何使用該功能。 – JimB

+1

檢查瀏覽器中的網絡選項卡以查看請求。您應該能夠查看請求部分,其中將包含有效負載。 – Mobius

+0

在這兩種情況下,該方法被調用相同的方式(通過處理傳入請求的handlefunc) 我檢查了網絡選項卡,看到有一個「跨源請求被阻止」的錯誤 - 是這個原因嗎? 但是,爲什麼會有這樣的錯誤,因爲一切都運行在同一臺機器上... – Lotoras

回答

1

如果有人有相同的問題: 我終於想出我在我的服務器上做了哪些更改以允許這樣的CORS請求。

func init() { 
    http.HandleFunc("/", net.HandleRequest) 
} 

func HandleRequest(rw http.ResponseWriter, req *http.Request) { 
// Recover panics and send the error. 

if origin := req.Header.Get("Origin"); origin != "" { 
    rw.Header().Set("Access-Control-Allow-Origin", origin) 
    rw.Header().Set("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE") 
    rw.Header().Set("Access-Control-Allow-Headers", 
     "Accept, Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization") 
} 

if req.Method == "OPTIONS" { 
    return 
} 

...(normally handling real request)