为什么我的参数没有传递给RESTful Web服务?

时间:2017-12-19 13:58:06

标签: java angular rest

我有使用Angular 4 HttpClient的代码,应该与一个简单的RESTful JAVA Web服务进行通信并返回JSON字符串:

this.client.post('http://localhost:8080/ToDoService/rest/service/create', {id: 'foo', todo: 'bar'}).subscribe((data) => {
    console.log("Got data: ", data);
}, (error) => {
    console.log("Error", error);           
})

它无法正常工作。我的意思是idtodo参数没有传递给REST后端。

另一方面,如果我将上面的代码更改为:

this.client.post('http://localhost:8080/ToDoService/rest/service/create?id=foo&todo=bar', '').subscribe((data) => {
    console.log("Got data: ", data);
}, (error) => {
    console.log("Error", error);           
})

一切正常,但我确定第二个剪辑是错误的。它只是看起来不对。

你能给我一个推动并指出我的错误吗?

P.S

JAVA后端:

@Path("/service")
public class Rest extends Application{
    @POST
    @Path("/create")
        public Response printMessage(@QueryParam("id") String userId, @QueryParam("todo") String toDo) {
            JSONObject result = new JSONObject();

            result.put("id", userId);
            result.put("todo", toDo);

            return Response.status(200).entity(result.toString()).build();
        }
}

2 个答案:

答案 0 :(得分:2)

您正在映射QueryParams,您需要将该有效负载映射到Map或Object:

class PayLoad {
    private String id;
    private String todo;
    // Getter and Setters
}

@Path("/service")
public class Rest extends Application{
    @POST
    @Path("/create")
        public Response printMessage(@RequestBody PayLoad payload) {
            JSONObject result = new JSONObject();

            result.put("id", payload.getId());
            result.put("todo", payload.getTodo());

            return Response.status(200).entity(result.toString()).build();
        }
}

希望这有帮助!

答案 1 :(得分:1)

首先,查看MyKong tutorial,您可以看到@QueryParam接受在网址中发送的参数。这是第一个问题。回到主要观点。

我不是Angular 4的专家,但我认为问题在于您的架构更深层次。你发送到你的后端:

{id: 'foo', todo: 'bar'}

并期待你的Java:

@QueryParam("id") String userId, @QueryParam("todo") String toDo

您传递一个对象并期望在您的Java后端两个字符串。如果你想获得你的对象,你可以创建这种类:

public class JsonWrapper    {
    private String id;
    private String todo;

 // Classic constructor and setters
}

然后,在您的服务中:

@Path("/service")
public class Rest extends Application    {
    @POST
    @Path("/create")
    public Response printMessage(@RequestBody JsonWrapper wrapper) {
        JSONObject result = new JSONObject();

        result.put("id", wrapper.getId());
        result.put("todo", wrapper.getTodo());

        return Response.status(200).entity(result.toString()).build();
    }
}

如果JsonWrapper不起作用,我认为Map也可以解决问题。