应该对GET请求有404响应但是收到200. Restlet

时间:2014-04-09 08:36:56

标签: java junit httprequest httpresponse restlet

我在Android设备上运行的RESTlet服务器。它配置正常。现在我正在测试它,并且这个特定的测试无缘无故地失败了。

我有这个网址:

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,请使用Chrome postman扩展程序(请注意"订单"拼写错误)我会收到404。直到这里一切都很好。

问题出现在我创建一个RESTlet客户端以在我的jUnit测试中生成GET request时,它会收到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的邮递员收到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;
    } 
(...)
}

3 个答案:

答案 0 :(得分:1)

404用于找不到资源http://10.17.1.72:8080/contacts

WIKIPEDIA: 404 Not Found 找不到请求的资源,但将来可能会再次提供。客户的后续请求是允许的。

如果有资源并且没有为流程提供适当的输入

它不会给404! Read More

加上以下代码,有两件事

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

    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;
        } 
    

答案 1 :(得分:0)

由于某种原因,我不知道RESTlet客户端可能是我遇到问题的原因。

我切换到android async http客户端,事情进展顺利。

以下是使用async http client的代码:

    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");
        }
    });

答案 2 :(得分:-1)

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