Apache Flink Rest-Client Jar-Upload не работает

Я борюсь за автоматическое развертывание новых заданий Flink в наших рабочих процессах CI/CD с помощью rest-api Flink (который можно найти здесь в хранилище flink Github).

Документация только говорит о том, что загрузка JAR может быть достигнута с помощью /jars/upload, но не так, как именно должен быть построен правильный запрос на отдых (который Headers, который Body тип, который Authorization, который Method и так далее).

Итак, я взглянул на код панели управления Flink flink/flink-runtime-web проект на Github и искал реализацию, которую они использовали, чтобы загрузить банку и - Yippie! Это реализовано путем вызова rest-api, который я пытаюсь использовать (используя POST как метод). После этого я попытался выяснить с почтальоном, как правильно отправлять запросы, используя разные Content-Type заголовки и Body типы, но ни один из них не работал для меня сейчас.

Я бы подал заявку прямо в проект flink, но не смог найти никакой ссылки на их систему заявок.

Итак, основной вопрос здесь:

  • Как мне позвонить на конечную точку отдыха? /jars/upload успешно загрузить файл?

2 ответа

Те, кто более неравнодушен к командной строке, могут использовать curl:

curl -X POST -H "Expect:" -F "jarfile=@path/to/flink-job.jar" http://hostname:8081/jars/upload

Я столкнулся с той же проблемой и решил ее, посмотрев запрос сети в chrome при загрузке jar с веб-интерфейсом.

Запрос должен

  • Использовать многочастную загрузку
  • Имя поля должно быть jarfile
  • Содержимое, состоящее из нескольких частей, также должно содержать файл Content-Type (иначе вы получите 500 от Flink с жалобой на отсутствующий заголовок)

Вот скрипт на Python, использующий запросы, который выполняет загрузку

upload = requests.post(                                                                                               
    base_url + "/jars/upload",                                                                                        
    files={
        "jarfile": (
            os.path.basename(path), 
            open(path, "rb"), 
            "application/x-java-archive"
         )
    }
)       

Для тех, кто хочет Java-решение, можно использовать:

CloseableHttpClient client = HttpClients.createDefault();
        HttpPost httpPost = new HttpPost("YOUR API URL");
        MultipartEntityBuilder builder = MultipartEntityBuilder.create();
        builder.addBinaryBody("jarfile", new File("jarr.jar"));
        HttpEntity multipart = builder.build();
        httpPost.setEntity(multipart);

        try{
            CloseableHttpResponse response = client.execute(httpPost);
            System.out.println(response);
            BufferedReader rd = new BufferedReader(new InputStreamReader(
                    response.getEntity().getContent()));

            String line = "";
            while ((line = rd.readLine()) != null) {
                System.out.println(line);
                }
        }
        catch (Exception e){
            e.printStackTrace();
        }
Другие вопросы по тегам