Java Wildfly POST метод multipart / form-data: «Невозможно получить границу ...» - PullRequest
0 голосов
/ 14 февраля 2019

У меня возникла проблема с методом post в java:

@POST
@Path("/test")
@Produces("application/xml")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public String testing(MultipartFormDataInput input)
{
    Map<String, List<InputPart>> uploadForm = input.getFormDataMap();
    String name = this.getFormValue(uploadForm, "name");

    List<InputPart> inputParts = uploadForm.get("file");
...
}

В листинге показан запуск метода POST, который использует файл, и несколько других параметров, таких как «name».Все работает нормально, пока я предоставляю некоторые параметры и файл в качестве ввода.Я также хочу предоставить некоторые выходные данные тем же методом, если файл не предоставлен.Но в этом случае я всегда получаю эту ошибку :

java.io.IOException: RESTEASY007550: Невозможно получить границу для нескольких частей

Thisдаже в том случае, если я вручную установил заголовок содержимого запроса в multipart / form-data.Есть ли какое-либо решение для обработки обоих вариантов использования (params + file и only params) одним единственным методом POST?

Спасибо за помощь!

Код клиента в python:

payload = {"name": "test"}
file = {"file": open("test.zip", "rb")}
url = "http://localhost:8080/test_war/test/test"
r = requests.post(url, data=payload, files=file)
print r.text
print r.status_code

1 Ответ

0 голосов
/ 15 февраля 2019

Проблема в используемой клиентской библиотеке: https://github.com/kennethreitz/requests/blob/bedd9284c9646e50c10b3defdf519d4ba479e2c7/requests/models.py#L503

В этой строке делается предположение, что если вы передаете файлы, то это запрос из нескольких частей, без файлов он выполняет что-то еще.

Добавление поддельного файла с другим именем параметра должно соответствовать коду на стороне сервера:

file_name ="test.zip"
if file_name:
    files = {"file": open("test.zip", "rb")}
else:
    files = {"dummy_file": "nothing"}
url = "http://localhost:8080/test_war/test/test"
r = requests.post(url, data={"name": "test"}, files=files)
print r.text
print r.status_code
...