我正在开发一个RESTful服务,它有两个服务器相互通信,可以命名为外部和内部。内部寄存器向外部寄存器请求进一步处理。用户只能访问外部。
为了测试内部和外部服务器之间的链接的可靠性,我想模拟从外部到内部返回的HTTP错误。有什么简单的方法可以做到这一点吗?否则我将不得不对从外部发送到内部的响应进行硬编码,以测试主要是5xx和4xx错误。
如果需要这些信息,我使用的服务器是JBoss。
在谷歌上搜索时,我发现了iPlanet 的数据
1.编辑obj.conf或您的虚拟服务器特定的obj.conf
2.在下添加以下行
错误代码="200"fn="设置变量"错误="503"
即使服务成功,也会返回503(默认情况下会返回200)
我正在为JBoss
我不知道JBoss配置允许您在应用程序之外执行此操作。但是,在应用程序中设置一个Resource就足够容易了,它可以模拟这种行为,并消除对供应商特定应用程序服务器的依赖:
@GET @POST @PUT @DELETE
@Path("/echostatus/{statusCode}")
@Produces(MediaType.TEXT_PLAIN, MediaType.TEXT_HTML)
public Response echoStatus(@PathParam("statusCode") final Integer statusCode) {
return Response.status(statusCode.intValue()).build();
}
在我看来,为了测试这种集成,开发一个简单的存根web应用程序会更容易,它会为任何URI返回5xx
代码。为了使其更加灵活,您可以添加一些句柄,以便能够在运行时调整此测试应用程序的行为(例如,基于URI、请求的各种参数…)
我不知道JBoss中有任何组件会重写状态代码,但自己做很简单。只需编写自己的Tomcat Valve并将其放入server.xml
import java.io.IOException;
import javax.servlet.ServletException;
import org.apache.catalina.Lifecycle;
import org.apache.catalina.connector.Request;
import org.apache.catalina.connector.Response;
import org.apache.catalina.valves.ValveBase;
public class RequestThroughputLimitValve extends ValveBase implements Lifecycle {
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// NOTE: THIS IS NOT COMPLETE IMPLEMENTATION
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
private int statusCode;
@Override
public void invoke(Request request, Response response) throws IOException, ServletException {
// Pass the request further, if necessary
getNext().invoke(request, response);
// Tweak the response
response.setContentType("text/plain");
response.sendError(this.statusCode, "Forced error.");
}
// This will make the status code configurable in valve
public void setStatusCode(int statusCode) {
this.statusCode = statusCode
}
public int getStatusCode() {
return this.statusCode;
}
}
很容易产生错误500。只需向web服务方法中抛出异常。JBoss将生成响应代码500。
另一种方式是使用HTTP响应API。只需根据需要设置状态即可。如果您愿意,您可以在HTTP过滤器中编写此代码,该过滤器只能用于测试目的。通过这种方式,您可以模拟任何HTTP状态(400或500系列)