Я пытаюсь выполнить операцию POST для сущности SAP Hybris C4C.
Я сталкивался со многими блогами, в которых упоминалось, что нам нужно отправлять X-CSRF-Token во время POST, который сначала можно получить с помощью операции GET.
Мне удалось это сделать с помощью Почтальона.поскольку почтальон хранит cookie, которые не вызывают ошибку проверки токена CSRF.
Но я на самом деле хочу вызвать это с помощью golang.И я каждый раз получал сообщение об ошибке «Ошибка проверки токена CSRF».Затем, просмотрев множество блогов, я обнаружил, что мы должны установить не только X-CSRF-Token, но и Cookie, чтобы HTTP POST не обрабатывался как новый сеанс.в противном случае отправленный нами токен csrf не совпадает с текущим сеансом, вызывающим ошибку.
Даже после выполнения приведенных выше двух отведений, я все еще получаю ошибку.Ниже приведен фрагмент кода, я не уверен, чего еще не хватает.
Фрагмент кода:
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)