2016-06-15 4 views
2

У меня есть простой службы REST в внедренного Jetty:POST использование метода Джерси со встроенным причалу

<dependencies> 
    <dependency> 
     <groupId>org.mortbay.jetty</groupId> 
     <artifactId>jetty</artifactId> 
     <version>${jetty.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>com.sun.jersey</groupId> 
     <artifactId>jersey-server</artifactId> 
     <version>${jersey.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>com.sun.jersey</groupId> 
     <artifactId>jersey-servlet</artifactId> 
     <version>${jersey.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>com.sun.jersey</groupId> 
     <artifactId>jersey-json</artifactId> 
     <version>${jersey.version}</version> 
    </dependency> 
</dependencies> 

package test; 

класса с REST службы:

import javax.ws.rs.*; 
import javax.ws.rs.core.MediaType; 
import javax.ws.rs.core.Response; 

@Path("/test") 
public class TestRESTService { 
    @Path("/get") 
    @GET 
    @Produces(MediaType.APPLICATION_JSON) 
    public Response get() { 
     return Response.ok(new SimplePOJO("test get ok")).build(); 
    } 


    @Path("/post") 
    @POST 
    @Produces(MediaType.APPLICATION_JSON) 
    public Response post(@FormParam("data") String data) { 
     return Response.ok("your data is: " + data).build(); 
    } 

    public static class SimplePOJO { 
     private String message; 

     public SimplePOJO(String message) { 
      this.message = message; 
     } 

     public String getMessage() { 
      return message; 
     } 

     public void setMessage(String message) { 
      this.message = message; 
     } 

    } 
} 

Основной класс:

package test; 

import com.sun.jersey.spi.container.servlet.ServletContainer; 
import org.mortbay.jetty.Server; 
import org.mortbay.jetty.servlet.ServletHolder; 

public class JettyStart { 
    public static void main(String[] args) { 
     final Server server = new Server(8888); 

     final org.mortbay.jetty.servlet.Context ctxRest = new org.mortbay.jetty.servlet.Context(server, "/rest"); 
     final ServletHolder jerseyServletHolder = ctxRest.addServlet(ServletContainer.class, "/*"); 
     jerseyServletHolder.setInitParameter("com.sun.jersey.config.property.resourceConfigClass", 
       "com.sun.jersey.api.core.PackagesResourceConfig"); 
     jerseyServletHolder.setInitParameter("com.sun.jersey.config.property.packages", 
       TestRESTService.class.getPackage().getName()); 
     jerseyServletHolder.setInitParameter("com.sun.jersey.api.json.POJOMappingFeature", "true"); 
     ctxRest.addServlet(jerseyServletHolder, "/*"); 

     try { 
      server.start(); 
     } catch (Exception ignore) { 
      server.destroy(); 
     } 
    } 
} 

Когда я Я пытаюсь получить доступ к http://localhost:8888/rest/test/post через вызов ajax - все работает отлично.

$.ajax({ 
    url : "http://localhost:8888/rest/test/post", 
    type : "POST", 
    async : false, 
    data: { 
     data: "test data" 
    } 
}); 

Object {readyState: 4, responseText: "your data is: test data", status: 200, statusText: "OK"} 

Но когда я использую локон я получаю нуль как данные параметра.

curl -X POST -H "Content-Type: application/json" -d "{\"data\":\"test data\"}" http://localhost:8888/rest/test/post 

your data is: null 

Мой вопрос: что я делаю неправильно?

ответ

1

Ваша конечная точка не ожидает application/json. Ожидается application/x-www-form-urlencoded.

От Jersey documentation: @FormParam

немного особенным, потому что он извлекает информацию из представления запроса, который имеет тип медиа MIME "применение/х-WWW-форм-urlencoded" ...

Таким образом, вместо этого вы должны использовать:

curl -X POST -H "Content-Type: application/x-www-form-urlencoded" -d "data=test data" http://localhost:8888/rest/test/post 
+0

Танков много! Я пропускаю этот абзац. –