# #go #curl
Вопрос:
Итак, у меня есть команда curl, которая работает просто отлично. Но, когда я пытаюсь реализовать его в Resty, я получаю ошибку: 405 (метод не разрешен). Теперь этот код ошибки не следует воспринимать слишком серьезно. Просто признак того, что я делаю что-то не так.
Команда curl, которая работает как чемпион, делает это:
christianb@christianb-mac hashicorp % curl -vn --location --request PUT 'http://localhost:8081/artifactory/example-repo-local/crash.zip'
--header 'Content-Type: application/zip'
--data-binary '@./samples/crash.zip'
* Trying 127.0.0.1:8081...
* Connected to localhost (127.0.0.1) port 8081 (#0)
* Server auth using Basic with user 'admin'
> PUT /artifactory/example-repo-local/crash.zip HTTP/1.1
> Host: localhost:8081
> Authorization: Basic xxx=
> User-Agent: curl/7.78.0
> Accept: */*
> Content-Type: application/zip
> Content-Length: 0
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 201
< X-JFrog-Version: Artifactory/7.24.3 72403900
< X-Artifactory-Id: 65b0c15e32af425b:-53411fa9:17be4f9b6e8:-8000
< X-Artifactory-Node-Id: cb4b887aed9e
< Location: http://localhost:8081/artifactory/example-repo-local/crash.zip
< X-Checksum-Sha256: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
< Content-Type: application/vnd.org.jfrog.artifactory.storage.ItemCreated json;charset=ISO-8859-1
< Transfer-Encoding: chunked
< Date: Wed, 15 Sep 2021 21:22:56 GMT
<
christianb@christianb-mac hashicorp %
И рестайлинг выглядит так:
PUT /artifactory/example-local-repo/crash.zip HTTP/1.1
Host: 127.0.0.1
User-Agent: jfrog/terraform-provider-artifactory:2.3.1
Content-Length: 4007
Accept: */*
Authorization: Basic cccxxx=
Content-Type: multipart/form-data; boundary=a8cddfc21bc1ecdf09e0c82e2e0ea2ac7627c4cbfeae3e51ed9e68987a99
Accept-Encoding: gzip
--a8cddfc21bc1ecdf09e0c82e2e0ea2ac7627c4cbfeae3e51ed9e68987a99
Content-Disposition: form-data; name="crash.zip"; filename="../../samples/crash.zip"
Content-Type: application/zip
...
HTTP/1.1 405
X-JFrog-Version: Artifactory/7.24.3 72403900
X-Artifactory-Id: 65b0c15e32af425b:-53411fa9:17be4f9b6e8:-8000
X-Artifactory-Node-Id: cb4b887aed9e
Allow: OPTIONS, GET, HEAD, POST
Content-Type: application/json;charset=ISO-8859-1
Content-Length: 65
Date: Wed, 15 Sep 2021 21:41:07 GMT
{
"errors" : [ {
"status" : 405,
"message" : ""
} ]
}
Итак, очевидно, что рести рассматривает это как загрузку из нескольких частей, что неправильно.
Кто — нибудь знает эквивалентный вызов resty для этой команды curl?
Я пытался:
uri := "/artifactory/" remotePath
reader, err := os.Open(localPath)
if err != nil {
return err
}
_, err = client.R().SetBody(reader).
SetHeader("Content-Type", contentType).Put(uri)
и
_, err = client.R().SetFileReader(filepath.Base(localPath), localPath, reader).
SetHeader("Content-Type", contentType).Put(uri)
и
uri := "/artifactory/" remotePath
_, err := client.R().SetFile(filepath.Base(localPath),localPath).
SetHeader("Content-Type", contentType).Put(uri)
Ничего не работает.
Комментарии:
1. Использую Go с конца 2018 года и никогда не нуждался в сторонней библиотеке для HTTP в Go, почему бы вам не попробовать http-клиент по умолчанию ?
Ответ №1:
SetFileReader
SetFile
и оба предназначены для использования при загрузке из нескольких частей.
SetBody
это правильная функция для использования, но я считаю, что вам нужно сначала прочитать содержимое файла, а затем передать байты в SetBody
:
uri := "/artifactory/" remotePath
data, err := os.ReadFile(localPath)
if err != nil {
return err
}
_, err = client.R().SetBody(data).
SetHeader("Content-Type", contentType).Put(uri)