Mon*_*oon 16 java jax-rs jersey
我REST-Jersey在我的项目中使用.所有POST数据都以JSON格式发送,并在服务器端解组为相应的bean.像这样的东西:
向服务器发送请求:
$('a#sayHelloPost').click(function(event){
event.preventDefault();
var mangaData = {
title:'Bleach',
author:'Kubo Tite'
}
var formData=JSON.stringify(mangaData);
console.log(formData);
$.ajax({
url:'rest/cred/sayposthello',
type: 'POST',
data: formData,
dataType: 'json',
contentType:'application/json'
})
});
Run Code Online (Sandbox Code Playgroud)
有效载荷:
{"title":"Bleach","author":"Kubo Tite"}
Run Code Online (Sandbox Code Playgroud)
服务器端:
@POST
@Path("/sayposthello")
@Produces(MediaType.APPLICATION_JSON)
public Response sayPostHello(MangaBean mb){
System.out.println(mb);
return Response.status(200).build();
}
Run Code Online (Sandbox Code Playgroud)
MangaBean:
public class MangaBean {
private String title;
private String author;
@Override
public String toString() {
return "MangaBean [title=" + title + ", author=" + author + "]";
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
}
Run Code Online (Sandbox Code Playgroud)
控制台输出:
MangaBean [title=Bleach, author=Kubo Tite]
Run Code Online (Sandbox Code Playgroud)
我从这里获得了REST-interceptor实现.
public class JerseyFilter implements ContainerRequestFilter{
@Override
public ContainerRequest filter(ContainerRequest req) {
return req;
}
}
Run Code Online (Sandbox Code Playgroud)
我想访问拦截器中的有效负载(请求主体).由于数据采用JSON格式,因此无法作为请求参数访问.有没有办法在拦截器方法中获取请求体?请指教.
Aru*_*lan 28
这是您可以实现的一种方式,与Jersey实现其日志记录过滤器的方式非常相似.您可以阅读实体并将其粘贴回请求,因此您不小心不在过滤器中使用它.
import com.sun.jersey.api.container.ContainerException;
import com.sun.jersey.core.util.ReaderWriter;
import com.sun.jersey.spi.container.ContainerRequest;
import com.sun.jersey.spi.container.ContainerRequestFilter;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
public class JerseyFilter implements ContainerRequestFilter {
@Override
public ContainerRequest filter(ContainerRequest request) {
ByteArrayOutputStream out = new ByteArrayOutputStream();
InputStream in = request.getEntityInputStream();
final StringBuilder b = new StringBuilder();
try {
if (in.available() > 0) {
ReaderWriter.writeTo(in, out);
byte[] requestEntity = out.toByteArray();
printEntity(b, requestEntity);
request.setEntityInputStream(new ByteArrayInputStream(requestEntity));
}
return request;
} catch (IOException ex) {
throw new ContainerException(ex);
}
}
private void printEntity(StringBuilder b, byte[] entity) throws IOException {
if (entity.length == 0)
return;
b.append(new String(entity)).append("\n");
System.out.println("#### Intercepted Entity ####");
System.out.println(b.toString());
}
}
Run Code Online (Sandbox Code Playgroud)
小智 5
您只能读取一次内容,因为它是一个输入流。如果您在拦截器中获取它,那么您将无法在主要解析中提供它。
您需要做的是创建一个过滤器,该过滤器读取数据并将其提供给需要它的任何其他人。基本步骤是: