Hi,
I'm trying to use CXF client proxies to connect to 3rd party REST Services 
using typed interfaces. Among other things I need to upload a file with a POST 
request to an URL. Using apache-httpclient the call to the service looks like 
this and works:

> CloseableHttpClient httpclient = HttpClients.createDefault();
> 
> try {
> 
>     HttpPost httppost = new HttpPost(
>             "https://localhost/upload?name=test";);
> 
>     File file = new File("d:/ws/file.txt");
> 
>     FileEntity reqEntity = new FileEntity(file,
>             ContentType.create("application/vnd.qlik.sense.app"));
> 
>     httppost.setEntity(reqEntity);
> 
>     System.out.println("Executing request: "
>             + httppost.getRequestLine());
>     CloseableHttpResponse response = httpclient.execute(httppost);
>     try {
>         System.out.println("----------------------------------------");
>         System.out.println(response.getStatusLine());
>         System.out.println(EntityUtils.toString(response.getEntity()));
>         EntityUtils.consume(response.getEntity());
>     } finally {
>         response.close();
>     }
> } finally {
>     httpclient.close();
> }

I tried to use the following interface to create a CXF client proxy to execute 
the call via cxf:

> public interface UploadService
> {
>   String QUERY_PARAM_APPNAME = "name";
> 
>   @POST
>   @Consumes("application/vnd.qlik.sense.app")
>   @Produces("application/json")
>   @Path("/upload")
>   UploadResponse upload(@QueryParam(QUERY_PARAM_APPNAME) final String 
> anAppName, final File anAppFile);
> }

> final UploadService proxy = JAXRSClientFactory.create(
>                               https://localhost,
>                               UploadService.class, 
> Collections.singletonList(new JacksonJsonProvider()));
> proxy.upload("test", new File("d:/ws/file.txt"));

Instead of using File I already tried to use InputStream or byte[] but all the 
requests result in a 400 response (BadRequest) from the server. As the server 
is a 3rd party tool I have no more information about how the file is to be 
uploaded other than that the file needs to be the request body.

I turned on the logging interceptors and the request looks fine:

> Nov 05, 2014 3:42:04 PM org.apache.cxf.interceptor.LoggingOutInterceptor
> INFO: Outbound Message
> ---------------------------
> ID: 1
> Address: https://localhost/upload?name=test
> Http-Method: POST
> Content-Type: application/vnd.qlik.sense.app
> Headers: {Content-Type=[application/vnd.qlik.sense.app], 
> Accept=[application/json]}
> Messages: Outbound Message (saved to tmp file):
> Filename: 
> C:\Users\dpr\AppData\Local\Temp\2\cxf-tmp-951459\cos1238456137568485932tmp
> (message truncated to 102400 bytes)
> 
> Payload: ....

But the response is

> Nov 05, 2014 3:42:04 PM org.apache.cxf.interceptor.LoggingInInterceptor
> INFO: Inbound Message
> ----------------------------
> ID: 1
> Response-Code: 400
> Encoding: ISO-8859-1
> Content-Type: 
> Headers: {Cache-Control=[private, must-revalidate, max-age=0], Date=[Wed, 05 
> Nov 2014 14:42:03 GMT], Expires=[Wed, 05 Nov 2014 14:42:04 GMT], 
> Server=[Repository API > REST Server/1.0.0.0 Microsoft-HTTPAPI/2.0], 
> transfer-encoding=[chunked]}
> Payload: File upload error

Thus my question is: How can I do the call that works using httpclient with cxf?

Best regards

Reply via email to