gpt4 book ai didi

java - 基于接受参数的 REST 服务响应

转载 作者:行者123 更新时间:2023-12-01 14:08:35 25 4
gpt4 key购买 nike

我希望创建一个与 XML 以及 JSON 响应兼容的 REST 服务。两者的 URI 相似。我需要根据接受 header 提供响应。

这可以通过单个 URI 实现吗?如果可能的话,如何设置@Produces?

最佳答案

读取@Produces的javadoc:

Defines the media type(s) that the methods of a resource class or {@link javax.ws.rs.ext.MessageBodyWriter} can produce. * If not specified then a container will assume that any type can be produced.

这意味着此注释只会减少支持的媒体类型的数量。否则,选择将自动完成。

接口(interface)MessageBodyWriter有很多针对不同媒体类型的实现。具体实现选择MessageBodyFactory:

public <T> MediaType getMessageBodyWriterMediaType(Class<T> c, Type t,
Annotation[] as, List<MediaType> acceptableMediaTypes) {
for (MediaType acceptable : acceptableMediaTypes) {
for (MessageBodyWriterPair mbwp : customWriterListProviders) {
for (MediaType mt : mbwp.types) {
if (mt.isCompatible(acceptable) &&
mbwp.mbw.isWriteable(c, t, as, acceptable)) {
return MediaTypes.mostSpecific(mt, acceptable);
}
}
}
......................

正如我们所见,选择了支持第一个 acceptableMediaTypes 的第一个提供程序。尽管恕我直言,名称 acceptableMediaTypes 是可以 self 解释的,但我继续我的发现并找到了唯一调用此方法的地方:

        contentType = getMessageBodyWorkers().getMessageBodyWriterMediaType(
entity.getClass(),
entityType,
annotations,
request.getAcceptableMediaTypes());

其中request的类型是ContainerRequest

这是getAcceptableMediaTypes()的代码

public List<MediaType> getAcceptableMediaTypes() {
if (accept == null || headersModCount != headers.getModCount())
accept = new ArrayList<MediaType>(HttpHelper.getAccept(this));

return accept;
}

正如我们所看到的,媒体类型列表填充了 HttpHelper.getAccept(this) 的结果:

最终字符串接受 = request.getHeaderValue(HttpHeaders.ACCEPT);

底线:是的,媒体类型会根据 HTTP header Accept 自动选择,除非硬编码注释 @Produces 对此进行限制。

关于java - 基于接受参数的 REST 服务响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18712218/

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