4

我正在开发一个 RESTful 服务,它有两个服务器相互通信,可以命名为外部和内部。内部将请求注册到外部以进行进一步处理。用户只能访问外部。

为了测试内部和外部服务器之间的链接的可靠性,我想模拟外部到内部返回的 HTTP 错误。有什么简单的方法可以做到这一点,否则我必须对外部发送到内部的响应进行硬编码,以便主要测试 5xx 和 4xx 错误。

如果需要这些信息,我正在使用的服务器是 JBoss。

在谷歌上搜索,我找到了 iPlanet 的数据

1. 编辑 obj.conf 或您的虚拟服务器特定的 obj.conf

2. 在下面添加以下行

错误代码="200" fn="设置变量" 错误="503"

即使服务成功,这也会返回 503(这将导致默认返回 200)。

我正在为JBoss寻找类似的东西

4

3 回答 3

2

我不知道允许您在应用程序之外执行此操作的 JBoss 配置。但它很容易在您的应用程序中设置一个资源来模拟这种行为并消除对供应商特定应用程序服务器的依赖:

@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();
}
于 2012-03-25T18:09:17.570 回答
2

在我看来,要测试这种集成,开发简单的存根 Web 应用程序会更容易,它会返回5xx任何 URI 的代码。为了使其更灵活,您可以添加一些句柄,以便能够在运行时调整此测试应用程序的行为(例如,基于 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;
  }
}
于 2012-03-27T08:09:57.473 回答
1

很容易产生错误 500。只需将异常抛出到 Web 服务方法中。JBoss 将生成响应代码 500。

以其他方式使用 HTTP Resptonse API。只需根据需要设置状态。如果您愿意,您可以在 HTTP 过滤器中编写此代码,该过滤器仅可用于测试目的。这样您就可以模拟任何 HTTP 状态(400 或 500 系列)

于 2012-03-25T17:40:22.867 回答