【问题标题】:Is there any way to simulate HTTP Error responses 5xx and 4xx有什么方法可以模拟 HTTP 错误响应 5xx 和 4xx
【发布时间】:2012-03-25 17:34:21
【问题描述】:

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

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

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

在 Google 上搜索时,我找到了 iPlanet 的这些数据

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

2.在

下添加以下行

错误代码="200" fn="set-variable" error="503"

即使成功投放也会返回 503(这将导致默认返回 200)。

我正在为 JBoss

寻找类似的东西

【问题讨论】:

    标签: java http rest jboss http-error


    【解决方案1】:

    我不知道允许您在应用程序之外执行此操作的 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();
    }
    

    【讨论】:

      【解决方案2】:

      在我看来,要测试这种集成,开发简单的存根网络应用程序会容易得多,它会为任何 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;
        }
      }
      

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

        • Thanx AlexR 但对于所有这些,我必须对 java 代码进行更改并将它们重新打包为一个 war 文件。但我想要的是我在问题中提到的 iPackage 服务器中的简单方法,即使响应成功,我也可以选择返回什么错误代码而不是 200。
        猜你喜欢
        • 2021-05-21
        • 1970-01-01
        • 2011-11-16
        • 2023-01-23
        • 2011-07-17
        • 1970-01-01
        • 2011-10-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多