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