SAP Hybris C4CエンティティでPOST操作を試行しています。
POST中にGET操作を使用して最初に取得できるX-CSRF-Tokenを送信する必要があると述べられている多くのブログに出くわしました。
私はそれをPostmanを使ってうまく行うことができました。PostmanがCSRFトークンの検証に失敗しないCookieを保存するため。
しかし、実際にはこれをgolangを使用して呼び出したいと思います。「CSRFトークンの検証に失敗しました」というエラーが毎回発生していました。その後、多くのブログを調査した結果、HTTP POSTが新しいセッションとして扱われないように、X-CSRF-TokenだけでなくCookieも設定する必要があることがわかりました。そうしないと、送信したcsrfトークンが現在のセッションと一致せず、エラーが発生します。
上記の2つのリードに従っても、エラーが発生します。以下はコードスニペットですが、他に何が欠けているのかわかりません。
コードスニペット:
auth := "******:*****"
basicAuth := base64.StdEncoding.EncodeToString([]byte(auth))
geturl := "https://******.crm.ondemand.com/sap/c4c/odata/v1/c4codataapi"
req, _ := http.NewRequest("GET", geturl, nil)
req.Header.Set("Authorization", "Basic "+basicAuth)
req.Header.Set("X-Csrf-Token", "Fetch")
cli := &http.Client{}
res, _ := cli.Do(req)
inputMap := make(map[string]interface{})
inputMap["PriorityCodeText"] = "Normal"
inputJSON, _ := json.Marshal(inputMap)
url := "https://*******.crm.ondemand.com/sap/c4c/odata/v1/c4codataapi/OpportunityCollection"
request, _ := http.NewRequest("POST", url, bytes.NewBuffer(inputJSON))
request.Header.Set("Authorization", "Basic "+basicAuth)
request.Header.Set("X-Csrf-Token", res.Header.Get("X-Csrf-Token"))
request.Header.Set("Cookie", res.Header.Get("Set-Cookie"))
request.Header.Set("X-Requested-With", "XMLHttpRequest")
request.Header.Set("Content-Type", "application/atomsvc+xml")
request.Header.Set("DataServiceVersion", "2.0")
//request.Header.Set("Accept", "application/atom+xml")
client := &http.Client{}
resp, _ := client.Do(request)
fmt.Printf("Response status code is: %d", resp.StatusCode)
jsonResponseData, _ := ioutil.ReadAll(resp.Body)
fmt.Printf("Response is: %s", jsonResponseData)
出来た!@gpで述べたように、ヘッダーを設定するだけでなく、すべてのCookieをコピーする必要がありました。以下のコードスニペットを変更しました
//request.Header.Set("Cookie", res.Header.Get("Set-Cookie"))
for i := 0; i < len(res.Cookies()); i++ {
request.AddCookie(res.Cookies()[i])
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加