如何使用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'

})

});

有效负载:

{"title":"Bleach","author":"Kubo Tite"}

服务器端:

@POST

@Path("/sayposthello")

@Produces(MediaType.APPLICATION_JSON)

public Response sayPostHello(MangaBean mb){

System.out.println(mb);

return Response.status(200).build();

}

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;

}

}

在控制台上输出:

MangaBean [title=Bleach, author=Kubo Tite]

我从这里获得了REST-interceptor实现。

public class JerseyFilter implements ContainerRequestFilter{

@Override

public ContainerRequest filter(ContainerRequest req) {

return req;

}

}

我想访问拦截器中的有效负载(请求主体)。由于数据为JSON格式,因此无法将其作为请求参数进行访问。 请指教。

回答:

这是一种可以实现的方法,与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());

}

}

以上是 如何使用Jersey拦截器获取请求正文 的全部内容, 来源链接: utcz.com/qa/424272.html

回到顶部