0

From a REST google api I'm sendind POST with Content-Type: application/x-www-form-urlencoded.

------WebKitFormBoundary
Content-Disposition: form-data; name="model"
Content-type: application/json

{
    "placeId":2,
    "reportDate":"2016-03-10T05:00:00.000Z",
    "form":{
     "apply" :"NO",
 "microbasin": {
    "id": 1,
    "name": "Caño Rubiales"
    }
  }
}
------WebKitFormBoundary--

In my method I consume:

    @POST
    @Consumes(MediaType.MULTIPART_FORM_DATA)
    public Response create (@Context UriInfo uriInfo,
                            @Context HttpServletRequest req,
                            MultipartFormDataInput input) throws IOException
    {


        List<InputPart> l = input.getFormDataMap().get("model");

        String str = new String (l.get(0).getBodyAsString().getBytes("iso-8859-1"), "UTF-8");

        System.out.println(str);

        InputStream file = input.getFormDataPart("file", new GenericType<InputStream>() {});

        return null;
    }

So the received symbol for Caño is Caýýo. I've tried a lot of options, with all encoding types, but without success. Can someone help me please, or give me some advice about how can accept file and json in just one method with the proper symbols.

1 Answers1

1

After 2 days I've solved the problem.

In my pom I updated the dependency to:

   <dependency>
        <groupId>org.jboss.resteasy</groupId>
        <artifactId>resteasy-multipart-provider</artifactId>
        <version>2.3.5.Final</version>
        <scope>provided</scope>
    </dependency>

Then I created the class.

import javax.ws.rs.WebApplicationException;
import javax.ws.rs.ext.Provider;

import org.jboss.resteasy.annotations.interception.ServerInterceptor;
import org.jboss.resteasy.core.ResourceMethod;
import org.jboss.resteasy.core.ServerResponse;
import org.jboss.resteasy.plugins.providers.multipart.InputPart;
import org.jboss.resteasy.spi.Failure;
import org.jboss.resteasy.spi.HttpRequest;
import org.jboss.resteasy.spi.interception.PreProcessInterceptor;

@Provider
@ServerInterceptor
public class ChilaPreProcessInterceptor implements PreProcessInterceptor
{
    @Override
    public ServerResponse preProcess (HttpRequest request,
                                      ResourceMethod resourceMethod)
            throws Failure, WebApplicationException
    {
        request.setAttribute(InputPart.DEFAULT_CONTENT_TYPE_PROPERTY, "*/*; charset=UTF-8");
        return null;
    }
}

And the method:

        public String getBodyPartAsString (List<InputPart> parts) throws IOException
    {
               InputPart part = parts.get(0);
               String value = part.getBody(String.class, null);

        return value;
    }

        @POST
        @Consumes(MediaType.MULTIPART_FORM_DATA)
        public Response create (@Context UriInfo uriInfo,
                                @Context HttpServletRequest req,
                                MultipartFormDataInput input) throws IOException, ParseException
        {

                Map<String, List<InputPart>> formParts = input.getFormDataMap();

                if (!formParts.containsKey("model"))
                    {
                        throw new IllegalArgumentException("Cannot create document due to param missing (model)");
                    }

                //Parsea los datos y los pone en el DTO
                String str = getBodyPartAsString(formParts.get("model"));
        }