Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 有没有办法使用JS和AngularJS获取HTTP状态代码名?_Javascript_Angularjs_Http_Dhc - Fatal编程技术网

Javascript 有没有办法使用JS和AngularJS获取HTTP状态代码名?

Javascript 有没有办法使用JS和AngularJS获取HTTP状态代码名?,javascript,angularjs,http,dhc,Javascript,Angularjs,Http,Dhc,我有一个AngularJS,JS,JQ,HTML5,CSS3网络应用程序。支持向我们项目的RESTAPI发送不同的HTTP方法并对其进行操作。它的行为类似于。每个请求返回一个状态代码,如200、201、404、500等,然后显示给用户 现在,我想显示的不仅是响应代码,还有如下描述: $http(config).success(function (data, status, headers, config) {//some logic} $.ajaxSetup({ type: "GET"

我有一个AngularJS,JS,JQ,HTML5,CSS3网络应用程序。支持向我们项目的RESTAPI发送不同的HTTP方法并对其进行操作。它的行为类似于。每个请求返回一个状态代码,如200、201、404、500等,然后显示给用户

现在,我想显示的不仅是响应代码,还有如下描述:

$http(config).success(function (data, status, headers, config) {//some logic}
$.ajaxSetup({
    type: "GET",
    dataType: "jsonp",
    error: function(xhr, exception){
        if( xhr.status === 0)
            alert('Error : ' + xhr.status + 'You are not connected.');
        else if( xhr.status == "201")
            alert('Error : ' + xhr.status + '\nServer error.');
        else if( xhr.status == "404")
            alert('Error : ' + xhr.status + '\nPage note found');
        else if( xhr.status == "500")
             alert('Internal Server Error [500].');
        else if (exception === 'parsererror') 
            alert('Error : ' + xhr.status + '\nImpossible to parse result.');
        else if (exception === 'timeout')
            alert('Error : ' + xhr.status + '\nRequest timeout.');
        else
            alert('Error .\n' + xhr.responseText);
    }
});
404未找到
201已创建

我得到的回应是:

$http(config).success(function (data, status, headers, config) {//some logic}
$.ajaxSetup({
    type: "GET",
    dataType: "jsonp",
    error: function(xhr, exception){
        if( xhr.status === 0)
            alert('Error : ' + xhr.status + 'You are not connected.');
        else if( xhr.status == "201")
            alert('Error : ' + xhr.status + '\nServer error.');
        else if( xhr.status == "404")
            alert('Error : ' + xhr.status + '\nPage note found');
        else if( xhr.status == "500")
             alert('Internal Server Error [500].');
        else if (exception === 'parsererror') 
            alert('Error : ' + xhr.status + '\nImpossible to parse result.');
        else if (exception === 'timeout')
            alert('Error : ' + xhr.status + '\nRequest timeout.');
        else
            alert('Error .\n' + xhr.responseText);
    }
});

有人知道使用AngularJS是否可以做到这一点吗?

如果我没有错,您仍然可以使用jQuery ajax进行呼叫,并使用$.ajaxSetup设置您的响应,如下所示:

$http(config).success(function (data, status, headers, config) {//some logic}
$.ajaxSetup({
    type: "GET",
    dataType: "jsonp",
    error: function(xhr, exception){
        if( xhr.status === 0)
            alert('Error : ' + xhr.status + 'You are not connected.');
        else if( xhr.status == "201")
            alert('Error : ' + xhr.status + '\nServer error.');
        else if( xhr.status == "404")
            alert('Error : ' + xhr.status + '\nPage note found');
        else if( xhr.status == "500")
             alert('Internal Server Error [500].');
        else if (exception === 'parsererror') 
            alert('Error : ' + xhr.status + '\nImpossible to parse result.');
        else if (exception === 'timeout')
            alert('Error : ' + xhr.status + '\nRequest timeout.');
        else
            alert('Error .\n' + xhr.responseText);
    }
});

当使用Angular进行调用时,您将使用success函数中显示的
status
变量返回状态代码。Angular似乎没有以我所看到的任何方式将文本返回给您

您可以使用switch语句来显示要与代码一起执行的消息,但显然,对于所有可能的代码,switch语句都可以是一个长的switch语句。您还可以返回要作为数据一部分显示的消息,这只不过是将工作放在后端而不是前端


至于从代码到消息的翻译,我建议将其放在指令(或过滤器)中,并在整个应用程序中重复使用,以获取代码并返回消息,以便在UI中显示。

好吧,我最终得到了以下解决方案:

我创建了一个常量变量,列出了所有HTTP代码及其描述(您可以将它们复制到自己的程序中):

constants.js:

var HTTP_STATUS_CODES = {
        'CODE_200' : 'OK',
        'CODE_201' : 'Created',
        'CODE_202' : 'Accepted',
        'CODE_203' : 'Non-Authoritative Information',
        'CODE_204' : 'No Content',
        'CODE_205' : 'Reset Content',
        'CODE_206' : 'Partial Content',
        'CODE_300' : 'Multiple Choices',
        'CODE_301' : 'Moved Permanently',
        'CODE_302' : 'Found',
        'CODE_303' : 'See Other',
        'CODE_304' : 'Not Modified',
        'CODE_305' : 'Use Proxy',
        'CODE_307' : 'Temporary Redirect',
        'CODE_400' : 'Bad Request',
        'CODE_401' : 'Unauthorized',
        'CODE_402' : 'Payment Required',
        'CODE_403' : 'Forbidden',
        'CODE_404' : 'Not Found',
        'CODE_405' : 'Method Not Allowed',
        'CODE_406' : 'Not Acceptable',
        'CODE_407' : 'Proxy Authentication Required',
        'CODE_408' : 'Request Timeout',
        'CODE_409' : 'Conflict',
        'CODE_410' : 'Gone',
        'CODE_411' : 'Length Required',
        'CODE_412' : 'Precondition Failed',
        'CODE_413' : 'Request Entity Too Large',
        'CODE_414' : 'Request-URI Too Long',
        'CODE_415' : 'Unsupported Media Type',
        'CODE_416' : 'Requested Range Not Satisfiable',
        'CODE_417' : 'Expectation Failed',
        'CODE_500' : 'Internal Server Error',
        'CODE_501' : 'Not Implemented',
        'CODE_502' : 'Bad Gateway',
        'CODE_503' : 'Service Unavailable',
        'CODE_504' : 'Gateway Timeout',
        'CODE_505' : 'HTTP Version Not Supported'
    };
然后在我的AngularJS控制器中,当我从
$http
接收到一个状态时,我只调用这个函数,它将状态代码消息的值设置为一个模型:

setResponseCodeDescr = function(responseCode) {

var responseCodeConstant = 'CODE_'.concat(responseCode);

if (HTTP_STATUS_CODES[responseCodeConstant]){
    $rootScope.response.description = HTTP_STATUS_CODES[responseCodeConstant];
} else {
    $rootScope.response.description = "";
}

}

仅此而已:)

从技术上获取代码似乎很容易,“只需附加响应的内置属性即可获得描述”

文档中解释了这一点,实际上,一旦你有了响应及其属性,你就可以用它做任何事情了。另一种方法是创建一个常数,但我认为我们通常不需要这么多

$http({
    method: 'GET',
    url: '/someUrl'
}).then(function successCallback(response) {
    var status = response.status;
    console.log(status); // gives the status 200/401
    var statusText = response. statusText;
    console.log(status); // HTTP status text of the response
}, function errorCallback(response) {

});
我会按照“amenoire/Jason C”的建议做,但是常数

var HTTP_STATUS_CODES = {
        '200' : 'OK',
        '201' : 'Created'
...
        '505' : 'HTTP Version Not Supported'
};
不带前缀“CODE_”编写,并将其称为

var s =  HTTP_STATUS_CODES[xmlhttp.status]
if (!(s && s.length > 0)) s = 'look at https://developer.mozilla.org/en-US/docs/Web/HTTP/Status'

我可以收到大量不同的响应代码。如果我听从你的建议,这将是一个很大的If-esle声明。这不是我想要的解决方案。顺便问一下,带开关盒看起来会更好。这是什么意思?这完全是一样的,请注意,在像Java这样的过度语言中,不能在字符串上切换大小写。当我切换beetwen编程语言时,这对我来说是一个很好的实践。@Kopax Jack Herrauer为什么Java的切换用例不能处理字符串?那是胡说八道。“开关适用于byte、short、char和int基元数据类型。它也适用于枚举类型(在枚举类型中讨论)、String类和一些特殊类…”Nazar Sobchuk:我知道,但根据JRE级别,我应该在回答中这样说“无法为低于1.7的源级别打开字符串类型的值。仅允许可转换的int或enum常量“用于”all的某个值“嗯,是的。当时我也考虑过这个问题,但我之所以选择常量值,是因为这样会对站点执行额外的请求,并且考虑到网络连接可能很差,站点可能无法访问,我认为这个特定的解决方案会比常量方法带来更多的麻烦。此外,这些代码不会改变,它们是相当静态的:)也许在Angular中不再存在这样的问题,您可以直接从响应中获取这些代码。