gpt4 book ai didi

java - 使用 Content 时 urlencoded 表单的 rest 资源中没有表单参数,但 application/json 有效吗?

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

我有一个 REST 端点 @POST,当 Content-Type 为 application/x-www-form-urlencoded 时,表单参数为 null。链中较早的一个 ContainerRequestFilter(底部的代码)接收请求,将流更改为 BufferedInputStream,然后记录请求。如果我删除此日志记录代码,则端点具有正确的表单参数。否则,它们为空,我不明白为什么。

现在,如果我使用 application/json,无论记录器是启用还是禁用,我的端点都有正确的参数。

我需要 application/x-www-form-urlencoded 因为 REST 端点需要重定向,如果请求不标准(预检),浏览器会阻止重定向

REST 端点不工作(OAuthRequest 有空成员)

@Stateless
@Path("v1/oauth2")
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
@Produces(MediaType.APPLICATION_JSON)
public class OAuthTokenResource {

@POST
public Response getToken(@Form OAuthRequest oauthRequest) {
...
}

OAuthRequest

public class OAuthRequest {

@FormParam(OAuthParam.CLIENT_ID)
@JsonProperty(OAuthParam.CLIENT_ID)
private String clientId;

@URL
@FormParam(OAuthParam.REDIRECT_URI)
@JsonProperty(OAuthParam.REDIRECT_URI)
private String redirectUri;

@FormParam(OAuthParam.USERNAME)
private String username;

@FormParam(OAuthParam.PASSWORD)
private String password;
...
}

日志过滤器

@Override
public void filter(final ContainerRequestContext context) throws IOException {
...
if (logEntity && context.hasEntity()) {
context.setEntityStream(logInboundEntity(builder, context.getEntityStream(), context.getMediaType()));
}

logger.debug(builder.toString());
}

private InputStream logInboundEntity(final StringBuilder builder, InputStream stream, MediaType mediaType) throws IOException {
if (!stream.markSupported()) {
stream = new BufferedInputStream(stream);
}

stream.mark(maxEntitySize + 1);
final byte[] entity = new byte[maxEntitySize + 1];
final int entitySize = stream.read(entity);

if ( entitySize > 0 ) {
String body = new String(entity, 0, Math.min(entitySize, maxEntitySize), StandardCharsets.UTF_8);
builder.append("\nBody: ");
builder.append(body);
}

if (entitySize > maxEntitySize) {
builder.append(MORE_INDICATOR);
}

stream.reset();

return stream;
}

最佳答案

好吧,我仍然不确定如果在过滤器链期间读取 InputStream,为什么 @Form 和 @FormParam 不起作用。

但是,我发现了如下解决方法。

@POST
public Response getToken(MultivaluedMap<String, String> formParams) {
...
}

这提供了与 application/json 期间相同的行为,因为即使已使用 InputStream 也已设置参数。

但是,出于安全原因,我们最终在过滤器中禁用了请求正文的日志记录。

关于java - 使用 Content 时 urlencoded 表单的 rest 资源中没有表单参数,但 application/json 有效吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30900236/

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