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

Как повторить curl запрос в java?

Здравствуйте.
У меня задача грузить слои в докер через crud запросы

У меня есть рабочий консольный запрос
spoiler
curl -X PUT -G \
      -H "Content-Type: application/octet-stream" \
      -H "Authorization: Basic bXpwX3VzZXI6VG9wYXoxMjMk" \
      -T $layer \
      --data "digest=$digest" \
      --data "_state=$state" \
      https://$SERVER_ADDR:$SERVER_PORT/v2/$REPONAME/blobs/uploads/$uuid

его составлял не я.

И я пытаюсь сделать такой же на java.
spoiler
public static String loadLayer(DockerSettings docker,
                                  String repoName,
                                  String uuid,
                                  String digest,
                                  String state,
                                  File layer){
        try {
            URI uri = new URI(format("%s/v2/%s/blobs/uploads/%s",
                    docker.host, repoName, uuid));

            int timeout = 5;
            RequestConfig config = RequestConfig.custom()
                    .setConnectTimeout(timeout * 1000)
                    .setConnectionRequestTimeout(timeout * 1000)
                    .setSocketTimeout(timeout * 1000).build();
            CloseableHttpClient httpClient = HttpClientBuilder.create().setDefaultRequestConfig(config).build();

            HttpPut httpPut = new HttpPut(uri);
            httpPut.setHeader("Authorization", "Basic " + docker.token);
            httpPut.setHeader("Content-Type", "application/octet-stream");

            MultipartEntityBuilder builder = MultipartEntityBuilder.create();
            builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
            builder.addBinaryBody("", layer, ContentType.APPLICATION_OCTET_STREAM, layer.getAbsolutePath());
            builder.addTextBody("digest", digest);
            builder.addTextBody("_state", state);
            HttpEntity entity = builder.build();
            httpPut.setEntity(entity);

            HttpResponse resp = httpClient.execute(httpPut);
            System.out.println(resp);

            int status = resp.getStatusLine().getStatusCode();
            String respText = resp.getStatusLine().getReasonPhrase();

            String result = "";

            if (status >= 400) {
                throw new RuntimeException(format("Запрос %s выполнился с ошибкой %s: %s", uri, status, respText));
            }

            return result;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }


Однако на все мои попытки я получаю bad request.
Помогите, пожалуйста, поправить.
Заранее благодарен.
  • Вопрос задан
  • 476 просмотров
Подписаться 2 Средний 1 комментарий
Пригласить эксперта
Ответы на вопрос 3
mayton2019
@mayton2019 Куратор тега Java
Bigdata Engineer
Трудно сказать где ты ошибся. Наверное ты формируешь другой запрос отличный от culr-шаблона.

Попробуй понаблюдать сетевой трафик через tcpdump/wireshark.

И попробуй активировать DEBUG логгирование для библиотеки org.apache.hc.client5 (я думаю что ты ее используешь хотя по исходнику неочевидно). Попробуй в отладке посмотреть на MultipartEntityBuilder. Есть ли у него toString() ? И что там?
Ответ написан
Комментировать
dimonchik2013
@dimonchik2013
non progredi est regredi
вот так
https://learning.postman.com/docs/sending-requests...
там джаву твою выбираешь

как вставить курл в Постман - гугли, полно мануалов
Ответ написан
leahch
@leahch
3D специалист. Dолго, Dорого, Dерьмово.
Попробуйте установить HttpMultipartMode.LEGACY
И на почитать - https://www.baeldung.com/httpclient-multipart-upload
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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