我是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);
}
感谢愿意帮助我的每个人。
答案 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的唯一原因是安全性(即使这是有争议的)