REST API-服务器应提供已处理的数据,还是客户端应自行处理

时间:2018-07-04 12:01:52

标签: rest date client-server

我想问一个关于REST方法的简单问题。

所以,这是问题所在: 我们应该以这种形式在客户端显示当前日期: DD.MM.YYYY HH:MM:SS

现在,问题是: 服务器应为客户提供一个随时显示的字符串,其中包含: “ 04.07.2018 13:53:23” 要么 服务器应为客户提供某种通用的“日期”字符串,例如: 2018-07-02T09:22:02 + 02:00 并且客户端应按照需要显示的方式(DD.MM.YYYY HH:MM:SS格式)对其进行处理。

对于回答在这种情况下(关于REST体系结构设计)哪种方法更好的答案将不胜感激。

3 个答案:

答案 0 :(得分:2)

对我来说,在ISO 8601中交换日期更有意义。这是一种众所周知的常用格式,可以通过大多数日期操作工具进行解析。如果您收到ISO格式的日期,则可以在客户端获得更大的灵活性。您可以根据需要设置其格式,而无需更改服务器代码,并且可以在不同的地方使用不同的格式。

答案 1 :(得分:1)

这两个方面各有利弊

准备显示字符串

优点

  • 较少的客户端处理(日期时间已格式化)

缺点

  • 客户端缺乏灵活性,无法以多种格式显示日期时间
  • 服务器处理量高(集中处理)

常规格式(例如Unix时间戳)

优点

  • 客户端具有更大的灵活性(可用于显示所需的时间格式)
  • 服务器处理少(去中心化的日期/时间格式化过程)

缺点

  • 更多的客户端处理(显示日期/时间的编码很少,可能还需要外部库进行格式化)

作为建议,

如果您希望有大量的客户群,则最好使用“常规格式”选项,该选项在客户端也具有灵活性,可以根据需要重新使用和重新格式化。

如果您只希望普通客户群和客户应用程序在多个屏幕上重用/重新格式化时间没有那么复杂,那么“准备显示”将是不错的选择。

答案 2 :(得分:0)

您必须使用自定义转换器,例如:球衣的MessageBodyWriter

代码:

package com.arun.java.customconverter;

import java.io.IOException;
import java.io.OutputStream;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
import java.util.Date;

import javax.ws.rs.Produces;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.ext.MessageBodyWriter;
import javax.ws.rs.ext.Provider;

@Provider
@Produces("text/shortdate")
public class ShortDateMessageBodyWriter implements MessageBodyWriter<Date> {

    @Override
    public boolean isWriteable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
        // TODO Auto-generated method stub
        return Date.class.isAssignableFrom(type);
    }

    @Override
    public void writeTo(Date t, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType,
            MultivaluedMap<String, Object> httpHeaders, OutputStream entityStream)
            throws IOException, WebApplicationException {
        String shortdate= t.getDate()+"-"+t.getMonth()+"-"+t.getYear();
        entityStream.write(shortdate.getBytes()); 

    }

}