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

REST API - should server provide already-processed data or shall client process it itself

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

那么,问题来了: 我们应该以这种形式在客户端显示当前日期: DD.MM.YYYYHH:MM:SS

现在,问题是: 服务器应该向客户端提供一个准备显示的字符串,例如: “2018 年 7 月 4 日 13:53:23” 要么 服务器应该向客户端提供某种通用的 "Date" 字符串,例如: 2018-07-02T09:22:02+02:00 并且客户端应该按照需要显示的方式处理它(DD.MM.YYYY HH:MM:SS 格式)。

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

您必须使用自定义转换器,例如:球衣中的 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()); 

    }

}

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

两方面各有利弊

准备显示字符串

优点

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

缺点

  • 客户端以多种格式显示日期时间的灵活性较低
  • 服务器处理高(集中处理)

通用格式(如 Unix 时间戳)

优点

  • 客户端更灵活(可重复用于显示所需的时间格式)
  • 更少的服务器处理(去中心化 date/time 格式化过程)

缺点

  • 更多客户端处理(少量编码显示 date/time,也可能需要外部库来格式化)

作为建议,

如果您期望有庞大的客户群,那么最好选择 "General format" 选项,这也需要在客户端灵活地根据需要重新使用和重新格式化。

如果您只希望普通客户群和客户端应用程序在多屏幕上 re-use/re-format 时间没有那么复杂,那么 "Ready to display" 会很好。