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








