2015-09-25 3 views
1

Я пытаюсь опубликовать XML-контент с помощью SCM Manager (v1.46) через REST. Использование Curl из командной строки работает отлично:SCM Manager REST POST xml возвращает 415 Unsupported Media Type

call curl -XPOST -u scmadmin:scmadmin -H "content-type: application/xml" -d "<users><name>abc</name><active>true</active><password>abc</password><displayName>abc</displayName><mail>[email protected]</mail><type>xml</type><lastModified/><creationDate/><admin>false</admin></users>" http://localhost:8080/scm/api/rest/users.xml 

и пользователь а создаются. Мой клиент Java, используя Джерси, получает ответ от диспетчера SCM 415 Unsupported Media Type. Клиент выглядит следующим образом:

... 

public WebResource getService(String p_url, String p_user, String p_password) { 
    ClientConfig config = new DefaultClientConfig(); 
    Client client = Client.create(config); 
    client.addFilter(new HTTPBasicAuthFilter(p_user, p_password)); 
    return client.resource(getBaseURI(p_url)); 
} 

... 

public Document postXmlDocument(String p_url, String p_user, String p_password, String p_xml) { 
    WebResource service = getService(p_url, p_user, p_password); 
    Document xmlDocument = null; 
    ClientResponse response = service.accept(MediaType.APPLICATION_XML).post(ClientResponse.class, p_xml); 
    if (response.getStatus() != 200) { 
     throw new RuntimeException("Failed : HTTP error code : " 
       + response.getStatus()); 
    } 
    String output = response.getEntity(String.class); 
    System.out.println("Server response : \n"); 
    System.out.println(output); 
    return xmlDocument; 
} 

где p_xml получает такое же содержание, как в локонах команды. Не следует ли вводить принятый тип носителя, используя MediaType.APPLICATION_XML? Используемый Джерси имеет эту координату Maven:

<dependency> 
    <groupId>com.sun.jersey</groupId> 
    <artifactId>jersey-client</artifactId> 
    <version>1.12</version> 
</dependency> 

Любой намек был бы хорошим. SK

ответ

0

Accept только говорит тип, который вы хотите назад. Вам необходимо установить Content-Type, чтобы сообщить серверу, какой тип вы отправляете. Если вы этого не сделаете, то по умолчанию будет задан какой-то неожиданный тип. Например, если вы отправляете строку, она может по умолчанию равна Content-Type: text/plain. Там сервер не может преобразовать простой текст в POJO, поэтому вы получите 415 неподдерживаемых типов носителей.

Вы называете type(String|MediaType), чтобы установить тип содержимого, или использовать header(String, String)

service.accept(MediaType.APPLICATION_XML).type("application/xml").. 

service.accept(MediaType.APPLICATION_XML).header("Content-Type", "application/xml")... 
+0

Да, принимаю (MediaType.APPLICATION_XML) .type ("приложение/XML") является решением этой проблемы. Настало время прочитать его источник jersey API. Спасибо, SK –