如何阻止泽西客户端在Http 301上抛出异常?

时间:2012-10-26 05:42:00

标签: java jersey jersey-client

我正在使用Jersey客户端对我的服务运行一些集成测试。但是,我的一个电话会发送重定向。我希望得到一个重定向但是当Jersey Client获得重定向时,它会出现com.sun.jersey.api.client.UniformInterfaceException错误。有没有办法让它接受重定向的响应,让我知道它得到了什么?

1 个答案:

答案 0 :(得分:1)

您可以捕获UniformInterfaceException,它提供包含所有详细信息的响应字段。

你还可以写一些hamcrest匹配器来表达你的期望:

import static javax.ws.rs.core.Response.Status.*;
import static org.junit.rules.ExpectedException.*;

import javax.ws.rs.core.Response.Status;

import org.hamcrest.*;
import org.junit.*;
import org.junit.rules.ExpectedException;

import com.sun.jersey.api.client.*;

public class MyResourceShould {

    @Rule
    public ExpectedException unsuccessfulResponse = none();

    private WebResource resource;

    @Before
    public void setUp() {
        Client client = Client.create();
        client.setFollowRedirects(false);
        resource = client.resource("http://example.com");
    }

    @Test
    public void reportMovedPermanently() {
        unsuccessfulResponse.expect(statusCode(MOVED_PERMANENTLY));

        resource.path("redirecting").get(String.class);
    }

    public static Matcher<UniformInterfaceException> statusCode(Status status) {
        return new UniformInterfaceExceptionResponseStatusMatcher(status);
    }

}

class UniformInterfaceExceptionResponseStatusMatcher extends TypeSafeMatcher<UniformInterfaceException> {

    private final int statusCode;

    public UniformInterfaceExceptionResponseStatusMatcher(Status status) {
        this.statusCode = status.getStatusCode();
    }

    public void describeTo(Description description) {
        description.appendText("response with status ").appendValue(statusCode);
    }

    @Override
    protected boolean matchesSafely(UniformInterfaceException exception) {
        return exception.getResponse().getStatus() == statusCode;
    }

}

另请注意,以下重定向(在setUp方法中)应设置为false,以便获取UniformInterfaceException而不是跟随重定向(如果在Location标头中指定了一个)。