我正在开发一个支持AJAX的JavaScript前端,它调用使用Struts编写的Java后端.我的问题是,当后端抛出异常时,客户端仍然会看到"200 OK"HTTP响应代码,而不是像预期的那样"500内部服务器错误".
这让我反复绊倒,因为我的第三方客户端JavaScript库依赖于HTTP状态代码来确定AJAX调用是否有问题,正如大多数现代库通常所做的那样.错误传递未检测到,直到我的代码在尝试解析通常为JSON的东西时爆炸.
我真的想避免黑客攻击我的客户端JS库,以便优雅地处理这些错误.那么,当后端出现未处理的异常时,如何让Struts为我提供500状态代码呢?这不应该是Struts的默认行为吗?
编辑:在这种情况下,客户端代码无关紧要.我需要修复服务器,以便在未处理的异常发生时发送相应的状态代码.谢谢!
我注意到Mozilla HTTP响应代码文档说明了这一点
方法PUT,DELETE和OPTIONS永远不会产生200 OK响应.
但是,它并不清楚实际应该使用什么样的响应.我最好的猜测是204:
204:没有内容
没有要为此请求发送的内容,但标头可能很有用.用户代理可以使用新资源更新其资源的缓存标头.
任何人都可以评论这是否是用于响应OPTIONS请求的正确代码?
我的问题是,当父资源或更高资源不存在/已被删除时,我是否应该返回HTTP响应代码400 Bad Request,404 Not Found或410 Gone?
寻找一些有关如何处理RESTful资源树中缺失链接的指导,因为我已经阅读了很多但没有很多个人经验。
假设我们具有以下资源结构:
/users/{userId}/accounts/{accoundId}/logs/{logId}
Run Code Online (Sandbox Code Playgroud)
一个用户可以拥有多个帐户,而这些帐户又可以具有许多订单,而这些订单又可以具有许多日志。日志仅针对单个帐户存在,而帐户仅针对单个用户存在。没有帐户就不能存在日志,没有用户就不能存在帐户。
当我尝试解决以下问题时,我的问题来了:
/users/123/accounts/321/logs - POST
/users/123/accounts/321/logs/987 - GET
/users/123/accounts/321/logs/987 - PUT
/users/123/accounts/321/logs/987 - DELETE
/users/123/accounts/321/logs/987 - PATCH
/users/123/accounts/321/logs/987 - HEAD
Run Code Online (Sandbox Code Playgroud)
但是此资源不存在或不再存在:
/users/123/accounts/321
Run Code Online (Sandbox Code Playgroud)
或此资源不存在或不再存在:
/users/123
Run Code Online (Sandbox Code Playgroud)
我可以说这是一个400 Bad Request,根据RFC7231:
6.5.1。400错误的要求
400(错误请求)状态代码表示服务器由于某些原因(例如格式错误的请求语法,无效的请求消息框架或欺骗性的请求路由)而被视为客户端错误,因此服务器无法或不会处理该请求。
从定义上讲是正确的,除非高速缓存尚未过期,这意味着应用程序尚未重新遍历层次结构,而另一个应用程序已删除了父资源。通过提供相关的oplock,客户端将证明,根据其最新知识,它正在发出语义上正确的请求。
我本能地会向“ 404 Not Found”或“ 410 Gone”借钱,即使这不是缓存内容,因为失败的原因实际上是缺少/不可用的资源。但是,按照RFC7231规范:
6.5.4。找不到404
404(未找到)状态代码表示原始服务器未找到目标资源的当前表示,或不愿意透露该资源的存在。404状态代码不表示这种缺乏表示是暂时的还是
永久的;如果
原始服务器大概通过某种可配置的方式得知该条件很可能是永久性的,则与404相比,首选410(已消失)状态代码。
要么
6.5.9。410去了
410(已消失)状态代码指示在源服务器上不再可以访问目标
资源,并且这种
情况很可能是永久的。
这些似乎在欺骗本能。
是否有人在处理这种或类似场景和良好方法方面有任何经验?我觉得应该使用正确的感觉,以及使用此服务时应该看到的东西,而不是文字文字。
假设我有一个Django响应对象.
我想找到URL(位置).但是,响应标头实际上不包含Location或Content-Location字段.
如何从此响应对象中确定它显示的URL?
是否可以从RESTeasy接口返回HTTP错误?我目前正在使用链式网络过滤器,但我想知道是否可以直接从界面...
示例sudo-code:
@Path("/foo")
public class FooBar {
@GET
@Path("/bar")
@Produces("application/json")
public Object testMethod(@HeaderParam("var_1") @DefaultValue("") String var1,
@HeaderParam("var_2") @DefaultValue("") String var2 {
if (var1.equals(var2)) {
return "All Good";
} else {
return HTTP error 403;
}
}
}
Run Code Online (Sandbox Code Playgroud) 我正在开发一个网络游戏.作为游戏的一部分,您可以从一组有限的功能开始,并在游戏时解锁更多功能.
例如,您/fields在本教程的第3步中解锁.但是,如果你只是导航到/fields地址栏呢?
我正在尝试找出最好的状态代码来回应.
403似乎是理想的,因为禁止用户在解锁之前访问该页面.
404也有意义,因为页面在技术上"不存在"直到它被解锁并且还阻止用户能够区分不存在的页面和它们尚未解锁的页面之间的区别.
但在这两种情况下,我都有一些用户报告浏览器缓存403/404结果的问题,即使解锁后也不让他们访问页面,除非他们完全清除缓存.
我想知道我是否应该继续使用403或404,或者我是否应该使用未使用的4XX代码(例如带有自定义statusText的442),或者甚至是开玩笑地发送HTTP/1.1 418 I'm A Teapot以响应用户在不应该的地方进行搜索.
我需要一个好的,坚实的理由,为什么应该使用一个选项而不是其他选项.
是否有类似于1.x的InterceptorAPI 的API?
我希望能够在应用程序启动时添加拦截器
401返回状态代码时显示登录对话框5xx返回状态代码时显示一般错误消息对于应用程序所做的每个http请求.
我们有两个叫做Track和的对象Walkthru.它们通过一个相互联系TrackWalkthruAssociation.如果一个Track和Walkthru彼此相关联(即,TrackWalkthruAssociation实例存在一起将它们连接起来),既不除非一个可以删除TrackWalkthruAssociation链接在一起例如,被删除的第一.
因此,发送DELETE到/tracks/1或/walkthrus/1例如,当存在关联,应该失败.对于这个,适当的HTTP响应代码是什么?我不想返回500,因为这不是一个意想不到的情况.
我正在设计一个用于注册课程注册的 REST API。在我的端点中,我可以POST注册:
POST to http://my-api/class/learn-rest/enrollment
Run Code Online (Sandbox Code Playgroud)
这将创建一个新的注册。然而,在这种情况下,注册人数只能是固定的,假设是 5 个。
当用户尝试添加第 6 个注册时,我应该返回哪个 HTTP 响应代码?
我想登录一个网站并导航到特定页面以抓取数据。我计划使用抓取(目前不是 API),出于学习目的,我计划在我的 stackoverflow 帐户上进行此操作,以提取我的声誉分数随时间的变化情况以及在哪个主题上的变化。
而且,我使用谷歌应用程序脚本作为编程语言,也是出于学习目的。
我使用下面给出的代码进行登录:
function stackLogin() {
var url = "https://stackoverflow.com/users/login?ssrc=head";
//var url = "https://stackoverflow.com/";
var payload = {
"email":"myLogin",
"password":"myPassword"
};
var opt = {
"payload":payload,
"method":"post",
"followRedirects": false
};
var response = UrlFetchApp.fetch(url, opt);
var sessionDetails = response.getAllHeaders()['Set-Cookie'];
var header = {
'Cookie': sessionDetails[1]
};
Logger.log(response.getResponseCode());
Logger.log(response);
}
Run Code Online (Sandbox Code Playgroud)
当我使用时:
url = "https://stackoverflow.com/users/login?ssrc=head"
Run Code Online (Sandbox Code Playgroud)
我得到“响应代码 = 302”,但“响应 html”非常短。我还看到StackExchange OpenID上出现了新的登录 ip
。
但是,如果我使用:
url = "https://stackoverflow.com"
Run Code Online (Sandbox Code Playgroud)
我得到“响应代码 = 200”,并且“响应 html”非常长。 …
screen-scraping login-control http-response-codes web-scraping google-apps-script