2017-10-12 8 views
1

でポストJSONパイソン要求をマーシャリング解除することはできません、私のPythonコード(クライアント側)である:はここgolang

import requests 
import json 
import datetime 
headers = {'Content-type': 'application/json',"Authorization":"Bearer MYREALLYLONGTOKENIGOT" } 
url = 'http://127.0.0.1:9210/59c94c860a52840958543027/comment/59dea421c26d684270e9321e' 
data = { 'sender' : '59c94c860a52840958543027', 'receiver':'59dea421c26d684270e9321e', 
     'score' :5, 
     'text':'tres jolie 2'} 
data_json = json.dumps(data) 
r = requests.post(url=url,headers=headers,json=data_json) 
r.json() 

そして、ここでは私のgolangサーバ側のコードです:ここ

type CommentSent struct { 
    Sender string `json:"sender,omitempty"` 
    Receiver string `json:"receiver,omitempty"` 
    Score  int `json:"score,omitempty"` 
    Text  string `json:"text,omitempty"` 
} 


func PostComment(w http.ResponseWriter, r *http.Request) { 
    var token string 
    token = getToken(r) 
    fmt.Println(token) 
    vars := mux.Vars(r) 
    idUser := vars["idUser"] 
    idUserReceiver := vars["idUserReceiver"] 
    fmt.Println(idUser) 
    fmt.Println(idUserReceiver) 
    var commentSend = CommentSend{} 
    // body, err := ioutil.ReadAll(r.Body) 
    // log.Println(string(body)) 
    decoder := json.NewDecoder(r.Body) 
    err := decoder.Decode(&commentSend) 
    if (err != nil){ 
     Info.Println("error") 
     Info.Println(err) 

    } 

は私に与えるものですコメント行:

2017/10/12 18:21:29 "{\"sender\": \"59c94c860a52840958543027\", \"score\": 5, \"receiver\": \"59dea421c26d684270e9321e\", \"text\": \"tres jolie 2\"}" 

、ここでは、私が取得エラーです:

INFO: 2017/10/12 18:22:32 comment.go:235: json: cannot unmarshal string into Go value of type main.CommentSent 

私はなぜこのエラーがあるのか​​わかりません.JsonとPythonの部分が正しいように見えますし、golangサーバー側も正しいようです。

答えて

2

リクエスト本文全体が、生のJSONではなく、引用されたJSON文字列です。

"{\"sender\":.... 

どちらかすなわち、生のJSONを送信:

{"sender":... 

またはあなたの囲碁プログラムでそれをアンエスケープします。おそらく、生のJSONを送信するほうが良い解決策です。私はPythonの教祖ではないので、それを行う方法、私は知らない。

0

私は答えがありますが、Pythonに関しては、辞書をjsonに変換しないでください。リクエストライブラリはそれを行い、データが適切に送信されることを保証します。

関連する問題