Задать вопрос
@egorpershin

Golang: как исправить PUT-запрос завершающийся ошибкой, когда cURL в bash завершается успешно?

Использую DNS-сервера Hetzner. Возникла необходимость обновлять записи через Hetzner DNS Public API.
Запрос cURL, отправленный через bash и составленный по примерам в документации к API
curl -X "PUT" "https://dns.hetzner.com/api/v1/records/{457bcee459d6932084bb1bc915210f88}" \
     -H 'Content-Type: application/json' \
     -H 'Auth-API-Token: LlGoDUQ39S6akqoav5meAsv5OIpeywhj' \
     -d $'{
  "value": "1.1.1.90",
  "ttl": 60,
  "type": "A",
  "name": "www",
  "zone_id": "oH7shFebR6nLPgTnmvNjM8"
}'

завершается успешно
record":{"id":"457bcee459d6932084bb1bc915210f88","type":"A","name":"www","value":"1.1.1.90","ttl":60,"zone_id":"oH7shFebR6nLPgTnmvNjM8","created":"2022-07-16 11:51:06.063 +0000 UTC","modified":"2022-07-17 09:16:05.809 +0000 UTC"}}

Запрос же из приложения на go (код взят из примеров той же документации)
package main

import (
	"fmt"
	"io/ioutil"
	"net/http"
	"bytes"
)

func sendUpdateRecord() {
	// Update Record (PUT https://dns.hetzner.com/api/v1/records/{RecordID})

	json := []byte(`{"value": "1.1.1.90","ttl": 60,"type": "A","name": "www","zone_id": "oH7shFebR6nLPgTnmvNjM8"}`)
	body := bytes.NewBuffer(json)

	// Create client
	client := &http.Client{}

	// Create request
	req, err := http.NewRequest("PUT", "https://dns.hetzner.com/api/v1/records/{457bcee459d6932084bb1bc915210f88}", body)

	// Headers
	req.Header.Add("Content-Type", "application/json")
	req.Header.Add("Auth-API-Token", "LlGoDUQ39S6akqoav5meAsv5OIpeywhj")

	// Fetch Request
	resp, err := client.Do(req)
	
	if err != nil {
		fmt.Println("Failure : ", err)
	}

	// Read Response Body
	respBody, _ := ioutil.ReadAll(resp.Body)

	// Display Results
	fmt.Println("response Status : ", resp.Status)
	fmt.Println("response Headers : ", resp.Header)
	fmt.Println("response Body : ", string(respBody))
}

завершается ошибкой
PS C:\Dev\Go\test> go run main.go  
response Status :  404 Not Found
response Headers :  map[Access-Control-Allow-Origin:[*] Content-Length:[142] Content-Type:[application/json; charset=utf-8] Date:[Sun, 17 Jul 2022 09:15:40 GMT] Ratelimit-Limit:[40000] Ratelimit-Remaining:[39991] Ratelimit-Reset:[2660] Vary:[Origin] X-Ratelimit-Limit-Hour:[40000] X-Ratelimit-Remaining-Hour:[39991]]
response Body :  {"record":{"id":"","type":"","name":"","value":"","zone_id":"","created":"","modified":""},"error":{"message":"record not found","code":404}}

Прошу помочь найти ошибку или подсказать, как это правильно загуглить и где взять правильные примеры реализации запросов.
P.S. При использовании инструмента /tool fetch в роутере Mikrotik, для взаимодействия с этим же API, запрос завершается такой же ошибкой.
  • Вопрос задан
  • 245 просмотров
Подписаться 1 Средний 6 комментариев
Решения вопроса 1
Ecstazy
@Ecstazy
Golang, vue.js | Fullstack
Добрый день. Попробуйте в URL убрать фигурные скобки { }, чтобы передаваемый в функцию URL выглядел следующим образом:
http.NewRequest("PUT", "https://dns.hetzner.com/api/v1/records/457bcee459d6932084bb1bc915210f88", body)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы