27 Stimmen

Wie lese ich POST-Parameter für einen RESTful-Dienst mit Jersey?

Ich verwende kein JSON oder etwas Ähnliches. Ich habe ein einfaches Formular zum Hochladen einer Datei und möchte die Parameter des Formulars lesen. Der folgende Code funktioniert nicht wie erwartet. Es werden keine Parameter angezeigt.

@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();
}

23voto

Rocky Pulley Punkte 21329

Zu Ihrer Information: Sie müssen @FormParam verwenden. Stellen Sie außerdem sicher, dass die INPUT-HTML-Typen name= und nicht id= verwenden.

21voto

Jamol Punkte 2271

Ich habe das gleiche Problem. Mit @FormParam Annotation für einzelne Parameter funktioniert, aber das Lesen von HttpServletRequest injiziert durch @Context nicht. Ich habe auch versucht, das Anforderungsobjekt/die Parameter durch Guice zu erhalten, indem ich Provider<HttpServletRequest> y @RequestParameters<Map<String, String[]>> . In beiden Fällen gab es keine Postparameter.

Es ist jedoch möglich, eine Karte der Parameter zu erhalten, indem man eine MultivaluedMap<String, String> Parameter der Ressourcenmethode. Beispiel:

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

5voto

Veniamin Punkte 466

Wenn Sie Folgendes verwenden Jersey RESTful API in JAVA können Sie nach Parameter-Bemerkungen (@*Param)

Exemple :

Abhängigkeit:

<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 der Anmerkungen: @MatrixParam , @KopfParam , @CookieParam , @FormParam , @QueryParam , @PfadParam

2voto

Zu einem bestimmten Zeitpunkt ruft Jersey ContainerServlet (oder ein anderes Jersey-Objekt während der Verarbeitung einer Anfrage) request.getInputStream() oder request.getReader() auf, die 'usingInputStream' oder 'usingReader' auf TRUE setzen. Dieser Zustand verhindert das Auffüllen der Parameter-Map innerhalb des request-Objekts. Etwa so:

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

Map getParametersMap() {
    return parametersMap;
}

Versuchen Sie, am allerersten Einstiegspunkt (Beginn der Methode Jersey ServletContainer.service()) Ihrer Anwendung einen Haltepunkt zu setzen und den Aufruf request.getParametersMap() auszuwerten. Sie werden Ihre Parameter erhalten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X