gpt4 book ai didi

java - Jersey 内容类型定制

转载 作者:行者123 更新时间:2023-11-30 04:54:22 25 4
gpt4 key购买 nike

您好,我有一个场景,我想动态控制 Jersey Web 服务返回的内容类型,而不使用请求 header 内容类型。

目前我做标准的事情:

@Produces( {"application/xml", "application/json"}) 
public ContactsConverter getSearchContacts()

所以默认情况下我会取回 xml。但是,如果我想取回 json 对象,我必须在请求 header 中设置“Content-Type: application/json”。目前这对我来说不是一个选择,因为请求来自跨域 ajax 调用,其中内容类型始终为 /。因此,我想在我的请求中使用一个标志或一些巧妙的东西来指定返回的内容类型。我环顾四周,但没有看到任何有用的东西,一个建议是将 json 作为默认值发送,但这是我想避免做的事情。

最佳答案

首先,我认为 Jersey 在这里做了错误的事情,因为 Content-Type 是一个描述请求/响应内容的 header ,并且您没有在请求中包含任何内容,它实际上应该将其行为基于 Accepts header ,但将其放在一边......

仅仅因为它是一个ajax调用,并不意味着内容类型将始终是/,在客户端上您可以像这样调用setRequestHeader:

var xhr = new XMLHttpRequest();
xhr.open("POST", "http://myjaxrs-server/getSearchContacts");
xhr.onreadystatechange = function() {
/* normal javascript to deal with the response goes here */
};

xhr.setRequestHeader("Content-Type", "application/json");

xhr.send("data i'm posting");

在 CORS 请求上设置 Content-Type header 将导致预检发生。您必须在服务器代码中支持预检,否则 CORS 请求将被拒绝。为 getSearchContacts 提供常规代码,但预检将通过 OPTIONS 方法进行:

@OPTIONS
public Response preflight(
@HeaderParam("Access-Control-Request-Method") String requestMethod,
@HeaderParam("Origin") String origin,
@HeaderParam("Access-Control-Request-Headers") String requestHeaders) {
return Response
.ok()
.header("Access-Control-Allow-Origin", "*") // TODO replace with specific origin
.header("Access-Control-Allow-Headers", "Content-Type")
.build();
}

现在将允许带有自定义 header 的 CORS 请求。

很容易犯这个错误:据我所知,即使是 Google 电子表格 API 也无法正确响应预检,这意味着您实际上无法更改 JavaScript 中的任何数据。

关于java - Jersey 内容类型定制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9015018/

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