Java 使用JSON参数简化RESTURL
我被分配了一个任务,我真的不知道如何开始解决它,所以任何帮助将不胜感激。考虑下面的例子:Java 使用JSON参数简化RESTURL,java,json,rest,maven,jersey,Java,Json,Rest,Maven,Jersey,我被分配了一个任务,我真的不知道如何开始解决它,所以任何帮助将不胜感激。考虑下面的例子: @Path("/v1/{server}:{port}/instance") public class WSInstance { private static final Log log = LogFactory.getLog(WSInstance.class); private final String PLANNING_PROPNAME = "**
@Path("/v1/{server}:{port}/instance")
public class WSInstance {
private static final Log log = LogFactory.getLog(WSInstance.class);
private final String PLANNING_PROPNAME = "**PLNG_NAME**";
private final String PLANNING_PROPVAL = "**CALENDAR_NAME**";
@GET
@Path("/{instanceName}")
@Produces("text/plain")
public String getInstanceStatus(@Context HttpHeaders headers,
@PathParam("server")String server,
@PathParam("port")int port,
@PathParam("instanceName") String instName,
@DefaultValue("") @QueryParam("date") String date,
@DefaultValue("") @QueryParam("instnum") String numexec)
{
return getInstanceStatus(Utils.extractUserInfo(headers), server, port, instName, numexec, date);
}
调用上述方法的示例如下所示:
/v1/serverName:portNumber/instance/toto?date=21090207&instnum=0000
@Path("/v2/admin/")
public class WSAdmin {
private static final Log log = LogFactory.getLog(WSAdmin.class);
@POST
@Path("/device")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response putDevice(Admin admin)
{
String output = admin.toString();
return Response.status(200).entity(output).build();
}
任务要求用json参数替换该url中的所有变量(serverName
、portNumber
、toto
、date
和instnum
)。这是为了简化RESTURL
知道从哪里开始吗
**编辑:感谢大家的回答,你确实帮了我很多忙。以下是我迄今为止所做的工作: 我决定选择一个“更简单”的类和方法来熟悉这个过程。所以我选了这个:
@Path("/v2/{server}:{port}/admin/")
public class WSAdmin {
private static final Log log = LogFactory.getLog(WSAdmin.class);
@PUT
@Path("/device")
@Produces("text/plain")
@Consumes("application/json")
public String putDevice(String jsonObject, @Context HttpHeaders headers,
@PathParam("server")String server,
@PathParam("port")int port)
{
ObjectMapper mapper = new ObjectMapper();
try
{
return updateDevice(mapper.readTree(jsonObject), Utils.extractUserInfo(headers), server, port);
}
catch (JsonProcessingException e)
{
return e.getMessage();
}
catch (IOException e)
{
return e.getMessage();
}
}
我改成这样:
/v1/serverName:portNumber/instance/toto?date=21090207&instnum=0000
@Path("/v2/admin/")
public class WSAdmin {
private static final Log log = LogFactory.getLog(WSAdmin.class);
@POST
@Path("/device")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response putDevice(Admin admin)
{
String output = admin.toString();
return Response.status(200).entity(output).build();
}
然后我创建了相应的POJO:
@XmlRootElement
public class Admin {
private String server;
private int port;
private Date date;
private String instnum;
// Constructors + getters + setters
@Override
public String toString() {
return new StringBuffer("Server: ").append(this.server)
.append("Port: ").append(this.port).append("Date: ")
.append(this.date).append("InstNum: ")
.append(this.instnum).toString();
}
}
然后我编辑了web.xml文件,以便能够封送和取消封送Java对象:
<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
那些有类似错误的人通过在pom.xml中添加gerson
或jersey-json
使错误消失。我添加了它们,但问题没有得到解决
有什么想法吗?您可能必须将方法类型更改为POST,并在请求体中将数据作为json传递 GET请求
GET /v1/yourServerName:8080/instance/toto?date=21090207&instnum=0000
可以成为以下POST请求
POST /v1/instance
{
"serverName":"yourServerName",
"portNumber":8080,
"date":21090207,
"instnum":"0000"
}
请注意,
instnum
不是数字字段,因为您传递的字符串0000不能表示为数字值。相反,portNumber
和date
可以是数值。您可能必须更改方法类型,以便在请求体中以json的形式发布和传递数据
GET请求
GET /v1/yourServerName:8080/instance/toto?date=21090207&instnum=0000
可以成为以下POST请求
POST /v1/instance
{
"serverName":"yourServerName",
"portNumber":8080,
"date":21090207,
"instnum":"0000"
}
请注意,
instnum
不是数字字段,因为您传递的字符串0000不能表示为数字值。相反,portNumber
和date
可以是数值。考虑使用Jackson。Jackson映射JSON对象。请在此处阅读如何将其与Jersey(REST)配合使用:
考虑使用Jackson。Jackson映射JSON对象。请在此处阅读如何将其与Jersey(REST)配合使用: 每个
GET
请求的有效负载未定义。因此,您应该避免发送带有GET
请求的正文。正如Davide已经建议的那样,您应该在这里切换到POST
,因为这里接收的有效负载的语义是由您(服务器/API维护者)定义的
<> P>但是,当你把你的帖子贴上标签的时候,你应该考虑在网络上使用超过2年的概念,并把它翻译成你的API设计。首先,REST体系结构不关心URI的结构。URI本身只是一个指向资源的指针,客户端不需要解释或破解它。客户机做出独特选择所需的所有信息都应由服务器提供。由于客户端不应该解析和解释URI,它们如何确定URI是否对客户端有用
那么,我们人类如何与网页中的URI交互?通常,它们用人类可读的文本进行注释,该文本总结了该链接的内容(如上述规范)。这种简短但有意义的名称通常称为链接关系名称,应该“附加”到每个URI。如果服务器需要更改其URI结构,则读取此类链接关系名称并仅调用附带URI的客户端将能够继续其任务。这是将客户机与服务器分离的一个重要步骤。此类链接关系名称应在媒体类型中指定,但也可以在媒体类型本身中指定
许多所谓的“RESTAPI”所犯的一个常见错误是只支持application/xml
和/或application/json
。在REST体系结构中,这些媒体类型非常糟糕,因为它们只定义要使用的语法,而不定义相应元素的语义。因此,客户机很难确定这样一个文档的意图,也很难掉入陷阱并假设某个资源具有某个类型。如果这种(非标准化的)表示发生了变化,那么客户机很可能会中断与该服务/API的进一步互操作
媒体类型或多或少是针对特定接收有效负载的标准化处理规则,这将有助于为接收者提供内容的某些含义及其可能的处理方式。一种可能众所周知的媒体类型是HTML,它定义了某些元素何时可行以及每个元素具有的约束。它还定义了某些元素的渲染方式以及如何与以前的版本向后兼容。当涉及到对链接和链接关系的支持时,它是事实上的标准。虽然就链接和关系名称的支持而言,这些步骤是朝着正确的方向迈出的,它们远远没有提供与HTML相同的语义,尽管它们比普通JSON更可取,因为它们不仅指定了语法,还指定了某些元素的语义,如\u links
,即帮助客户端区分链接和内容
在内容类型协商中,媒体类型尤其重要,客户机请求服务器返回客户机理解的表示格式。如果服务器不能产生这样的表示,它将用一个足够表达的错误代码通知客户机(406)。如果服务器不能处理客户机提供的媒体类型(在POST、PUT、PATCH等操作上),它还将通知客户机它不理解这种格式(415)
设计RESTAPI的一般建议是将API看作Web服务器,并以此设计与它的整个交互。也就是说,如果客户机必须执行certian输入,那么它不应该只发送一个带有