Java 对GET请求应有404响应,但收到200。再出租

Java 对GET请求应有404响应,但收到200。再出租,java,junit,httprequest,httpresponse,restlet,Java,Junit,Httprequest,Httpresponse,Restlet,我有一个RESTlet服务器在我的android设备上运行。它的配置很好。现在我正在jUnit测试它,这个特殊的测试毫无理由地失败了 我有一个网址: http://10.17.1.72:8080/contacts?order=ASC&limit=10&offset=1这是正确的,我收到了预期的200条回复 但是如果我在URL中拼错了参数,我会得到404响应。如果我点击http://10.17.1.72:8080/contacts?oooooooorder=ASC&limit=10&offset=

我有一个RESTlet服务器在我的android设备上运行。它的配置很好。现在我正在jUnit测试它,这个特殊的测试毫无理由地失败了

我有一个网址:

http://10.17.1.72:8080/contacts?order=ASC&limit=10&offset=1
这是正确的,我收到了预期的200条回复

但是如果我在URL中拼错了参数,我会得到404响应。如果我点击
http://10.17.1.72:8080/contacts?oooooooorder=ASC&limit=10&offset=1
(注意“订单”拼写错误)我收到了404,这是我应该收到的。在这里之前一切都很好

当我在jUnit测试中创建一个RESTlet客户机来发出
GET请求时,问题就出现了,它会收到200个响应

以下是我的jUnit测试方法:

public void testGoodRequest() // Success, receives a 200 code.
{
    // Create the client resource
    ClientResource resource = new ClientResource("http://10.17.1.72:8080/contacts?order=ASC&limit=10&offset=1");
    Response response = resource.getResponse();

    Log.d(TAG, "Good: " + response.getStatus().getCode());

    assertTrue(response.getStatus().getCode() == 200);      
}
Adn这个应该会收到404,但会收到200,即使使用Chrome的postman收到相同的get请求,也会收到404:

public void testBadRequestWithOrderMisspelled()
{
    // Create the client resource
    ClientResource resource = new ClientResource("http://10.17.1.72:8080/contacts?oofdgrder=ASC&limit=10&offset=1");
    Response response = resource.getResponse();

    Log.d(TAG, "BadRequestWithOrderMisspelled: " + response.getStatus().getCode());

    assertTrue(response.getStatus().getCode() == 404); // Assert fails, receives 200 instead of 404     
}
下面是我的Restlet句柄方法:

@Override
public void handle(Request request, Response response) {

    //final ContactList contactList = new ContactList(mContext);
    String type = request.getMethod().getName();

    String order = request.getResourceRef().getQueryAsForm().getFirstValue("order");
    String limit = request.getResourceRef().getQueryAsForm().getFirstValue("limit");
    String offset = request.getResourceRef().getQueryAsForm().getFirstValue("offset");
    String query = request.getResourceRef().getQueryAsForm().getFirstValue("query");

    if(!"order".equals(order) || !"limit".equals(limit) || !"offset".equals(offset) || !"query".equals(query))
    {
        // Show error
        response.setStatus(new Status(Status.CLIENT_ERROR_NOT_FOUND, "Badly formatted URL."));
        return;
    } 
(...)
}

404代表资源
http://10.17.1.72:8080/contacts
未找到

维基百科:404未找到 找不到请求的资源,但将来可能会再次可用。客户的后续请求是允许的

若资源存在,且未为流程提供适当的输入

它不会给404

另外,根据下面的代码,有两件事

  • 您拼错了
    limite
  • 您正在将收到的值与字符串进行比较,如
    order
    offset
    amd
    limit
  • 我不认为这是你想要实现的,你应该把它与一些变量进行比较,而不是

    if(!"order".equals(order) || !"limite".equals(limit) || !"offset".equals(offset) || !"query".equals(query))
        {
            // Show error
            response.setStatus(new Status(Status.CLIENT_ERROR_NOT_FOUND, "Badly formatted URL."));
            return;
        } 
    

    您是否使用工具跟踪HTTP请求,请求是否在抛出错误之前到达您的处理程序?

    出于某种原因,我不知道RESTlet客户端可能是我出现问题的原因

    我转到了一个客户那里,一切都很顺利

    以下是我使用异步http客户端的代码:

        SyncHttpClient client = new SyncHttpClient();
    
        // Should be success
        client.get("http://10.17.1.72:8080/contacts", new AsyncHttpResponseHandler() {
            @Override
            public void onSuccess(String response) {
                Log.d(TAG, "GET - ID: 1 - Success expected -> Got success");
                auxArray.add("1");
            }
    
            @Override
            public void onFailure(int arg0, Header[] arg1, byte[] arg2, Throwable arg3) {
                super.onFailure(arg0, arg1, arg2, arg3);
                Log.d(TAG, "GET - ID: 1 - Success expected -> Got failure");
            }
        });
    

    但如果有错误的输入,我会在处理程序上显式返回404响应。如果我在浏览器上点击这个url,我也会收到404请求。根据我的说法,你不应该这样做,玩标准的HTTP代码。第二件事是您正在做的是
    “order”。equals(order)
    将order属性的值与
    String
    “order”
    进行比较,这就是您想要实现的吗?确切地说,我想确保
    order
    变量实际上持有值“order”。是的,同时我发现限额也被拼错了,我把它修好了。仍然得到200个响应码。我这样做是因为我将在设备中执行SQL查询,我想防止对设备进行不必要的查询或导致设备过度使用。我希望您知道
    getFirst()
    getFirstValue()
    request.getResourceRef().getQueryForm().getFirstValue(“顺序”)中的区别
    阅读这里并不是对您的问题的确切答案,但我个人认为,对于错误/无效的参数,给出404不是一个好主意。我建议您修改发送错误消息的协议(Json或Xml)到客户端,客户端应相应地处理错误。我这样做是因为我将在设备上执行SQL查询,并且我希望防止在设备上执行不必要的查询或因此导致设备崩溃。您使用的是哪个版本的Restlet client?我推荐我们最新的稳定的Restlet 2.2.0版本,它直接依赖于HttpURLConnection。您始终可以在Android异步任务中运行它@JeromeLouvel我正在使用Restlet 2.1。我已经看到了一个新的稳定版本(2.2)的Android Restlet,但还没有做出改变。