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();
}