2

Hi I am working in upload api in my project . I am able to send data and get response using jersy client.

I am getting 200 as Response . Here is that code .

    final Client client = ClientBuilder.newBuilder().register(MultiPartFeature.class).build();
    client.register(new LoggingFilter());
    FileDataBodyPart filePart = new FileDataBodyPart("file", new File("/Users/rasaminathan/Desktop/test.txt"));
    FormDataMultiPart formDataMultiPart = new FormDataMultiPart();
    FormDataMultiPart multipart = (FormDataMultiPart) formDataMultiPart.field("param1", "paramValue")
                                                .field("param2", "value")
                                                .bodyPart(filePart);   
    final WebTarget target = client.target("http://URL:8000/apiPath");
    final Response response = target.request().post(Entity.entity(multipart, multipart.getMediaType()));

And This is the log I got .

    Jul 22, 2016 12:15:14 PM org.glassfish.jersey.filter.LoggingFilter log
    INFO: 1 * Sending client request on thread main
    1 > POST http://URL:8000/apiPath
    1 > Content-Type: multipart/form-data

    Jul 22, 2016 12:15:15 PM org.glassfish.jersey.filter.LoggingFilter log
    INFO: 1 * Client response received on thread main
    1 < 200
    1 < Content-Length: 203
    1 < Content-Type: application/json
    1 < Date: Fri, 22 Jul 2016 06:45:14 GMT
    1 < X-Powered-By: Servlet/2.5 JSP/2.1

But In my project we are supposed to use CXF . I tried the same with CXF webclient . But I am getting "401" Unauthorized Error. Here is the code.

    WebClient client = WebClient.create("http://URL:8000");
    String path = "apiPath"; 
    client.type(MediaType.MULTIPART_FORM_DATA)
            .path(path);

    ClientConfiguration config = WebClient.getConfig(client);
    config.getInInterceptors().add(new LoggingInInterceptor());
    config.getOutInterceptors().add(new LoggingOutInterceptor());

    List<Attachment> atts = new LinkedList<Attachment>();
    atts.add(new Attachment("file", "application/octet-stream", new ByteArrayInputStream("testContent".getBytes())));
    atts.add(new Attachment("param1","text/plain","paramValue"));
    atts.add(new Attachment("param2","text/plain","value"));
    MultipartBody body = new MultipartBody(atts);
    Response response= client.post(body);

And This is the log I got .

        Jul 22, 2016 12:23:41 PM org.apache.cxf.interceptor.LoggingOutInterceptor
        INFO: Outbound Message
        ---------------------------
        ID: 1
        Address: http://URL:8000/apiPath
        Http-Method: POST
        Content-Type: multipart/form-data; boundary="uuid:14597725-d376-4643-92f9-7a4a64ae1054"
        Headers: {Accept=[*/*]}
        Payload: --uuid:14597725-d376-4643-92f9-7a4a64ae1054
        Content-Type: application/octet-stream
        Content-Transfer-Encoding: binary
        Content-ID: <file>

        testContent
        --uuid:14597725-d376-4643-92f9-7a4a64ae1054
        Content-Type: text/plain
        Content-Transfer-Encoding: binary
        Content-ID: <param1>

        paramValue
        --uuid:14597725-d376-4643-92f9-7a4a64ae1054
        Content-Type: text/plain
        Content-Transfer-Encoding: binary
        Content-ID: <param2>

        value
        --------------------------------------
        Jul 22, 2016 12:23:42 PM org.apache.cxf.interceptor.LoggingInInterceptor
        INFO: Inbound Message
        ----------------------------
        ID: 1
        Response-Code: 401
        Encoding: UTF-8
        Content-Type: text/html; charset=UTF-8
        Headers: {Content-Length=[46], content-type=[text/html; charset=UTF-8], Date=[Fri, 22 Jul 2016 06:53:42 GMT], X-Powered-By=[Servlet/2.5 JSP/2.1]}
        --------------------------------------

I guess the params "Param1,Param2 " values not sent properly . Thats why I am getting 401 error I guess . Am I sending data correctly in CXF webclient? If not please help me to correct the code

Ramesh
  • 1,872
  • 2
  • 20
  • 33

1 Answers1

2

Setting content disposition in all the attachment helped to resolve the issue . I found solution here.

As I guessed Param1,param2 values not reached server .

        List<Attachment> atts = new LinkedList<Attachment>();
        ContentDisposition cd = new ContentDisposition("form-data; name=\"file\";filename=\"test.txt\"");
        atts.add(new Attachment("file", new ByteArrayInputStream("testContent".getBytes()),cd));
        ContentDisposition cd1 = new ContentDisposition("form-data; name=\"param1\";");
        atts.add(new Attachment("param1",new ByteArrayInputStream("paramValue".getBytes()),cd1));
        ContentDisposition cd2 = new ContentDisposition("form-data; name=\"param2\";");
        atts.add(new Attachment("param2",new ByteArrayInputStream("value".getBytes()),cd1));
        MultipartBody body = new MultipartBody(atts);
        Response response= client.post(body);

Now I am getting success response

Ramesh
  • 1,872
  • 2
  • 20
  • 33