2014-10-03 7 views
0

У меня возникли проблемы с преобразованием строки cURL примера (которая работает) в значимое выражение resteasy. Завиток:Преобразование строки cURL в Resteasy

curl -X POST -u admin:admin --data-binary "@tempfile.xml" http://localhost:8810/rest/configurations 

У меня есть:

public void sendPost(ConfigurationDTO config) throws JAXBException, FileNotFoundException { 
    // client target is: http://localhost:8810/rest 
    ResteasyWebTarget target = getTarget(); 
    target.path("configurations"); 
    JAXBContext context = JAXBContext.newInstance(ConfigurationDTO.class); 
    Marshaller marshaller = context.createMarshaller(); 
    marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); 
    // this here produces exactly what I need 
    marshaller.marshal(config, new File("test.xml")); 

    MultipartFormDataOutput dataOutput = new MultipartFormDataOutput(); 
    dataOutput.addFormData("file", new FileInputStream(new File("test.xml")), MediaType.APPLICATION_OCTET_STREAM_TYPE); 
    GenericEntity<MultipartFormDataOutput> entity = new GenericEntity<MultipartFormDataOutput>(dataOutput) {}; 


    Response response = target.request().post(Entity.entity(entity, MediaType.MULTIPART_FORM_DATA_TYPE)); 
    response.close(); 
} 

protected ResteasyWebTarget getTarget() { 
    ResteasyClient client = new ResteasyClientBuilder().build(); 
    ResteasyWebTarget target = client.target(UriBuilder.fromUri(restUrl).build()); 
    client.register(new AddAuthHeadersRequestFilter(user, pass)); 
    return target; 
} 

Броски HTTP.500, у меня нет доступа к серверу, чтобы посмотреть, что случилось.

+0

Сначала у меня отсутствует информация о пароле пользователя в вашем коде. – Tomas

+0

Это делается в 'getTarget()', также выполняются запросы GET, поэтому проблем нет. –

+0

Должен ли я понять, что вы можете вызывать запросы GET через своего клиента RESTEasy, и он работает? – Tomas

ответ

1

Я бы попытался отладить CORS в cURL (см. How can you debug a CORS request with cURL?). В вашем случае это команда:

curl --verbose -u admin:admin \ 
    -H "Origin: http://localhost:1234" \ 
    -H "Access-Control-Request-Method: POST" \ 
    -H "Access-Control-Request-Headers: X-Requested-With" \ 
    -X OPTIONS \ 
    http://localhost:8810/rest/configurations 

Пожалуйста, замените localhost:1234 с путем контекста, где клиент Resteasy это работает.

Если запрос не увенчался успехом, это означает проблему с конфигурацией CORS. Запрос выполнен успешно, если ответ содержит Access-Control-Allow-Origin.

+0

Работает cURL-вызов, проблема в коде RESTeasy. Также здесь не может быть проблем с CORS, так как ни завиток, ни клиент RESTeasy не имеют политики одинакового происхождения. – lefloh

1

cURL отправляет Content-Type: application/x-www-form-urlencoded при использовании аргумента --data-binary. Вы используете MediaType.MULTIPART_FORM_DATA_TYPE (multipart/form-data), поэтому я ожидаю, что ваш сервер не примет последний. Затем RESTeasy выбрасывает javax.ws.rs.NotSupportedException: Cannot consume content type.

Я не понимаю, почему вы сортируете свою сущность в файл и передаете этот файл клиенту RESTeasy. Использование, например, StringWriter ваш код может выглядеть следующим образом:

StringWriter sw = new StringWriter(); 
marshaller.marshal(config, sw); 
Response response = target.request().post(Entity.entity(sw.toString(), MediaType.APPLICATION_FORM_URLENCODED)); 

Является ли сервер частью также написанный вами? Если вы отправляете только xml-файлы, то application/x-www-form-urlencoded, по-видимому, не соответствует лучшим ContentType.

+0

Спасибо за ваш вклад. Запись в файл в основном предназначалась для отладки. Сервер не написан мной, это как черный ящик, я просто тестирую его, когда мы его потребляем. Я попробую ваши предложения в понедельник. –

Смежные вопросы