一些同事和我有一个问题,即ajax调用的响应返回一些意想不到的内容.而不是使用各种属性获取简单的JSON对象,result.responseText的值是通用406状态错误页面的HTML标记,表示浏览器不接受MIME类型.
这样的电话是这样的:
$.ajax({
url: '/promociones/cincogratis/canjear-codigo-promocional',
type: this.method,
data: $(this).serialize(),
success: function (result) {
$('.promotion_banner .loader').hide();
$('.promotion_banner').html(result);
},
error: function (result) {
var obj = result.responseText;
if (obj.isRedirect) {
document.location = obj.redirectUrl;
}
else {
$('.promotion_banner .loader').hide();
$(".error-wrapper").removeClass("hidden");
var generic_error = document.getElementById('generic_error').value;
$(".error-wrapper p").html(generic_error);
}
},
beforeSend: function() {
$('.promotion_banner .loader').show();
}
});
Run Code Online (Sandbox Code Playgroud)
控制器对呼叫的响应如下:
Response.StatusCode = (int)HttpStatusCode.NotAcceptable; // 406
return Json(new { errorMessage = LocalErrorMessages.Website_Promotions_FreeFiver_General_Problem, isRedirect = false } );
Run Code Online (Sandbox Code Playgroud)
我们希望result.responseText包含errorMessage和isRedirect的键值,但它们不在那里.
值得指出的是,这个代码是多租户的,由当前的应用程序和另一个代码共享,它的工作非常好.
我们尝试过:
- 配置IIS以显示详细的错误响应而不是自定义页面以获取更多详细信息 - 为解决问题提供了额外的帮助.
- 允许所有响应内容类型到呼叫
- 更改我们网站的文化(目前是es-ES) …
我有一个 RESTful 登录 Web 服务。但是,在传递给它的一组凭据无效的情况下,对于最好返回什么状态代码,内部存在争论。我一直在返回 401;但这似乎不正确,因为这意味着您必须已经登录才能使用登录服务。403也被讨论过;但这意味着您已经通过身份验证,但被限制使用给定资源。也许是 404;因为无法找到具有所述凭据的用户。
如果凭据无效,从登录服务返回的正确状态代码是什么?
如果重要的话,这个 REST 登录 API 正在被一个网络应用程序和一个 iPhone 应用程序使用。
尽管RFC 7231 的目的是使内容更加清晰,但它显然带来了有关状态代码 400 的歧义。请注意此SO 答案和评论。一个人说 400 现在包括逻辑、应用程序或验证错误,另一个人说 400 仍然仅用于语法或验证错误。
6.5.1. 400 Bad Request
400(错误请求)状态代码表示服务器由于被认为是客户端错误的原因而无法或不会处理请求(例如,格式错误的请求语法、无效的请求消息帧或欺骗性的请求路由) 。
我想得到关于这个问题更明确的答案。考虑 POST 或 PUT 尝试提供电子邮件地址的两种情况:
我想遵循 RFC 7231。我对 6.5.1 的阅读告诉我验证错误应该收到 409(或 422)响应。但其他人不同意,并声称现在应该是 400。
有谁有更多信息可以解决这种歧义吗?
只是想知道如果发布的数据已经存在,我应该为 REST api 返回什么 HTTP 状态代码。例如,如果我有一个需要电子邮件的创建帐户 API。
1) 如果我的数据库中已存在此电子邮件,我应该返回什么状态代码?
2) 如果我重定向到另一个页面,例如现有帐户登录页面,状态代码是否应该为 200?或者 300 重定向?
如果这个问题已经得到解答,请给我链接,我可以删除它,但到目前为止我只看到了无效数据的问题。
假设我们有一家在线商店,并收到更新某些订单的有效请求。
请求本身是有效的,但是假设订单有过期时间,并且已经过期,因此该请求实际上无法处理。
我怀疑这是否是一种验证错误。因为,正如我上面所说,请求本身是有效的;并且请求发送者可能不知道订单已经过期。
在这种情况下,REST API 服务返回的适当 HTTP 状态代码是什么?
警告:由于产品的一般要求,应该是一些4XX错误代码!
UPD:更多信息:这个假定的“订单”仍然存在,甚至已经过期。可以取回它,但不能再操作它。这就是代码404(例如)不合适的原因。
我有以下表格供我的用户更改他们的电子邮件地址.
<form enctype="multipart/form-data" id="email_change_form" method="post" action="/my_account/">
<table>
<tr>
<td>
<label for="id_email">E-mail address</label>:
</td>
<td>
<input name="email" value="a@a.com" maxlength="75" type="text" id="id_email" size="30" />
</td>
<td class="error_email">
</td>
</tr>
</table>
<input type="hidden" name="form_id" value="email_change_form" />
</form>
Run Code Online (Sandbox Code Playgroud)
单击保存按钮(其代码未显示)后,表单将使用以下jQuery代码ajaxly发布到服务器:
$(".save_button").click(function() {
var $form = $("#email_change_form")
url = $form.attr("action");
$.post(url, $form.serialize(),
function(data) {
//upon success, the server returns the new email (data.email) in a json dictionary.
},
"json"
);
}
})
Run Code Online (Sandbox Code Playgroud)
一旦服务器收到POST,它就需要验证新电子邮件在数据库中是否已经存在(即电子邮件需要是唯一的).假设服务器检测到重复的电子邮件,我不知道如何将错误传回客户端.我很想在json字典中添加一个条目"duplicate_email:true"并将其返回给客户端.我不知何故觉得这不是正确的做法.
请为此方案建议正确的方法.服务器应该如何将错误传递回客户端?如何在客户端捕获错误?谢谢.
我有REST方法来更新用户个人资料。如果某些参数无效,系统应返回哪个状态码?或者,例如,如果旧密码和DB中的密码不相等,则更改密码。400错误的请求?