Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用JSON参数简化RESTURL_Java_Json_Rest_Maven_Jersey - Fatal编程技术网

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输入,那么它不应该只发送一个带有