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" 会很好。
我想问一个关于 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" 会很好。