Я пытаюсь выполнить операцию POST для объекта SAP Hybris C4C.
Я встречал много блогов, где упоминалось, что нам нужно отправить X-CSRF-Token во время POST, который сначала можно получить с помощью операции GET.
Мне удалось это сделать с помощью Postman. поскольку Почтальон хранит 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)