gpt4 book ai didi

java - 我应该如何设计我的 restful API 以通过 POST 以不同格式(JSON、CSV)接受数据以达到相同目的?

转载 作者:行者123 更新时间:2023-11-30 10:04:17 26 4
gpt4 key购买 nike

我的业务需求是使用 Spring boot 开发一个 restfull API,它执行以下操作:-

a) 通过来自客户端的 POST 请求接受 csv 格式的车辆数据。b) 通过客户端的 POST 请求接受 JSON 格式的车辆数据。

在上面的 a) 和 b) 中,字段相同但格式不同(一个是 JSON,另一个是 CSV)。

我的问题是我的设计应该如何实现这一点?

1) 我是否可以继续创建类 A 并使用 2 个不同的端点方法。一个接受 csv 而另一个接受 json?或者有什么更好的方法来处理这种情况?

2) 我的类结构应该是什么样的?

3) 是否有适合此要求的特定设计模式?或者有什么具体的建议来处理这种情况?

非常感谢任何帮助。

最佳答案

您可以通过为每种格式定义一个反序列化器接口(interface)和不同的实现来做到这一点。

对于问题1:这取决于你想怎么做。一种方法是使用单个端点并使用 Web 请求的 Content-Type header ,并根据它选择一个反序列化器

这是一个例子:

public enum Formats { JSON, CSV, XML }

public interface Deserializer {

Format getFormat();
object deserialize(string input);
}

public JSONDeserializer extends Deserializer {

public Format getFormat() { return Formats.JSON; }
public object deserialize(string input) { .... }
}

public CSVDeserializer extends Deserializer {
public Format getFormat() { return Formats.CSV; }
public object deserialize(string input) { .... }
}

public XMLDeserializer extends Deserializer {
public Format getFormat() { return Formats.XML; }
public object deserialize(string input) { .... }
}

如果您想避免使用明确的 Format 枚举来定义您的类型,您可以直接使用内容类型作为字符串或 MediaType。这将导致您的 Deserializer 接口(interface)与您的请求处理程序紧密耦合,从而难以在代码的其他地方使用它们。此外,作为替代设计,您可以将检查责任转移到反序列化器中。

public interface Deserializer {

string getContentType();
object deserialize(string input);
}

public JSONDeserializer extends Deserializer {

public string getContentType() {
return "application/json";
}

public object deserialize(string input) { .... }
}

public interface Deserializer {

bool cetDeserialize(string contentType);
object deserialize(string input);
}

public JSONDeserializer extends Deserializer {

public bool cetDeserialize(string contentType) {
return contentType == "application/json";
}

public object deserialize(string input) { .... }
}

下面是您如何使用它。

List<String> mDeserializers = Arrays.asList(
new JSONDeserializer(),
new CSVDeserializer(),
new XMLNDeserializer()
);

Deserializer deserializer = mDeserializers
.stream()
.filter(d => d.getContentType() == contentType)
.findFirst();

// or if you use a specific format:
Deserializer deserializer = mDeserializers
.stream()
.filter(d => d.getFormat() == getFormatFromContentType(contentType))
.findFirst();

deserializer.deserialize(input);

至于spring,自己没试过,可以不指定consumes做这样的事情:

 @RequestMapping(value = "/data", method = RequestMethod.POST)
public String process(
@RequestHeader HttpHeaders httpHeaders,
@RequestBody String body){
// get value of content-type header as string
// get serializer based on string value
}

 @RequestMapping(value = "/data", method = RequestMethod.POST)
public String process(
@RequestHeader(value="Content-Type") String contentType,
@RequestBody String body){
// get serializer based on string value
}

关于java - 我应该如何设计我的 restful API 以通过 POST 以不同格式(JSON、CSV)接受数据以达到相同目的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55953597/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com