web-dev-qa-db-fra.com

Comment lire les paramètres POST pour un service RESTful utilisant Jersey?

Je n'utilise pas JSON ou quelque chose comme ça. J'ai un formulaire simple pour télécharger un fichier et je veux lire les paramètres du formulaire. Le code ci-dessous ne fonctionne pas comme prévu. Il n'affichera aucun paramètre.

@POST
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
@Path("{appNum}/{docId}/file")
public Response uploadDocFile(
        @PathParam("appNum") String appNum,
        @PathParam("docId") String docId,
        @Context HttpServletRequest req)
{

    try {

        log.info("POST Parameters:");

        Enumeration e = req.getParameterNames();

        while(e.hasMoreElements())
        {
            Object key = e.nextElement();
            log.info("Key: " + key);
            log.info("Val: " + req.getParameter(key.toString()));
        }


    }  catch (Exception e) {
        e.printStackTrace();
        return Response.status(Status.INTERNAL_SERVER_ERROR).entity(new StatusResponse(e)).build();
    }

    return Response.ok().build();
}
26
Triton Man

Pour info, vous devez utiliser @FormParam. Assurez-vous également que les types HTML INPUT utilisent name = not id =.

23
Triton Man

J'ai le même problème. En utilisant @FormParam l'annotation des paramètres individuels fonctionne, mais leur lecture à partir de HttpServletRequest est injectée via @Context non. J'ai également essayé d'obtenir l'objet/les paramètres de demande via Guice en utilisant Provider<HttpServletRequest> et @RequestParameters<Map<String, String[]>>. Dans les deux cas, il n'y avait aucun paramètre de post.

Cependant, il est possible d'obtenir une carte des paramètres en ajoutant un MultivaluedMap<String, String> paramètre à la méthode de ressource. Exemple:

@POST
public void doSomething(MultivaluedMap<String, String> formParams) {
//...
}
19
Jamol

Si vous utilisez API RESTful Jersey dans Java vous pouvez rechercher Annotations de paramètres (@ * Param)

Exemple:

Dépendance:

<dependency>
    <groupId>com.Sun.jersey</groupId>
    <artifactId>jersey-client</artifactId>
    <version>1.8</version>
</dependency>

Code:

package yourpack;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.core.Response;

@Path("/path_to_data")
public class DataResource {
    @GET
    @Path("/{param}")
    public Response getMsg(@PathParam("param") String urlparam) {
        int ok = 200;
        String result = "Jersey Data resource: " + urlparam;

        return Response.status(ok).entity(result ).build();
    }
}

Liste des annotations: @ MatrixParam , @ HeaderParam , @ CookieParam , @ FormParam , @ QueryParam , @ PathParam

5
Veniamin

À un moment donné, Jersey ContainerServlet (ou un autre objet Jersey pendant le traitement de la demande) appelle request.getInputStream () ou request.getReader () qui définissent "usingInputStream" ou "usingReader" sur TRUE. Cet état empêche le remplissage du mappage de paramètres à l'intérieur de l'objet de requête. Quelque chose comme ça:

parseParameters() {
    if (usingInputStream || usingReader) {
        return; 
    } else {
        parametersMap.putAll({actual parameters parsing from stream})
    }
} 

Map getParametersMap() {
    return parametersMap;
}

Essayez de placer un point d'arrêt au tout premier point d'entrée (début de la méthode Jersey ServletContainer.service ()) de votre application et évaluez l'appel request.getParametersMap (). Vous obtiendrez vos paramètres.

2
Pavel Mikhalchuk