我在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;
}
(...)
}
答案 0 :(得分:1)
404用于找不到资源http://10.17.1.72:8080/contacts
WIKIPEDIA: 404 Not Found 找不到请求的资源,但将来可能会再次提供。客户的后续请求是允许的。
如果有资源并且没有为流程提供适当的输入
它不会给404! Read More加上以下代码,有两件事
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;
}
答案 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请求,并且在抛出错误之前请求是否到达处理程序?