使用@POST而不是@GET来获取用户输入

时间:2017-03-27 08:26:00

标签: java json

我是JSON的新手。我想问一下,如何将以下代码从@GET转换为@POST,以便我可以从用户JSON输入而不是从链接中检索appdataid。

AppDataService ads = new AppDataService();
@GET
@Path("/{appdataid}")
@Produces(MediaType.APPLICATION_JSON)
public AppData getAppData(@PathParam("appdataid")long appdataid){
    return ads.getAppData(appdataid);
}

AppDataService代码

public AppDataService(){
        appdatas.put(1L, new AppData(1,"Success", " ", "123456"));
        appdatas.put(2L, new AppData(2,"Failure", " ", "654321"));
    }
public AppData getAppData(long id){
        return appdatas.get(id);
    }

而不是用户输入http://localhost:8080/gni/webapi/appdata/1作为结果

{
        "id": 1,
        "message": " ",
        "status": "Success",
        "token": "123456"
}

我希望我能收到@POST和JSON格式的用户输入。 我尝试了以下代码但没有工作。

@POST
@Path("/{appdataid}")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public AppData getAppData(@PathParam("appdataid")long appdataid){
    return ads.getAppData(appdataid);
}

感谢愿意帮助我的每个人。

2 个答案:

答案 0 :(得分:1)

如果要将JSON POST到资源,则需要为其定义POJO以将消息体反序列化为,例如:

public class AppDataRequest {
    @JsonProperty
    private long id;

    public long getId() {
        return id;
    }
}

在资源中使用此类型:

@POST
@Path("/")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public AppData getAppData(AppDataRequest appDataRequest){
    return ads.getAppData(appDataRequest.getId());
}

注意,@Path注释不再具有appdataid模板,并且参数没有注释。

SIDE NOTE

我不得不想知道你想要在这里实现什么。 HTTP方法可以而且应该用于帮助描述系统的行为。获取数据的请求应使用GET资源。应使用POST资源来创建新数据。有时候有充分的理由打破这个约定(例如GET请求中缺少消息体),但通常还有其他方法可以解决它们。关于你的例子的一切都告诉我它应该是GET请求,但我不知道你的应用程序的细节,所以如果它不适用,请随意忽略它。

答案 1 :(得分:0)

我认为你真的不需要JSON。您可以将@FormParam用于这样一个简单的有效负载(ID)

@POST
@Path("some_url")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)//optional 
public AppData getAppData(@FormParam("appdataid")long appdataid){
    return ads.getAppData(appdataid);
}

您可以从控制台调用您的Web服务(泽西岛假设)

WebTarget target = client.target(UriBuilder.fromUri("http://localhost:8088/Your_root_url").build()); 

try{

MultivaluedMap<String, Integer> formData = new MultivaluedHashMap<String, String>();

formData.add("appdataid", 1);

Response res= target.path("some_url").request(). 
post(Entity.entity(formData, MediaType.APPLICATION_FORM_URLENCODED));

AppData entity = (AppData) res.readEntity(AppData.class);

//System.out.println(entity);//if toString() is overriden


}catch(Exception e){

System.out.println(e);

return;

}
编辑:我认为在这种情况下想要使用POST的唯一原因是安全性(即使这是有争议的)