【问题标题】:Access header's properties within a $http call in AngularJS在 AngularJS 中的 $http 调用中访问标头的属性
【发布时间】:2015-08-04 14:42:25
【问题描述】:

按照 github API 的分页文档,我正在尝试请求事件项并检索 Link 标头 (just like they suggest) 以构建分页。问题是我不知道如何处理headers('Link') 对象。

功能:

getEvents: function(page) {        
        if(cacheService.get('eventos_'+page)) {
          return cacheService.get('eventos_'+page);
        } else {
          var deferred = $q.defer();
          $http.get('https://api.github.com/repos/'+owner+'/'+repo+'/events', {params: {per_page: 15, page: page}})
          .success(function(events, status, headers) {
            console.log(events, status, headers('Link'));
               cacheService.put('eventos_'+page, events);
            deferred.resolve(events);
          }).error(function(err) {
            deferred.reject('Error', err);
          });
          return deferred.promise;
        }
      }

生成的“对象”(如果可以这样调用的话)是:

"
<https://api.github.com/repositories/XXXXXX/events?page=2&per_page=15>; rel="next",
<https://api.github.com/repositories/XXXXXX/events?page=4&per_page=15>; rel="last"
"

¿如何在 $scope 变量中保存页面(下一个和最后一个)数字?或者至少我怎样才能遍历那个对象? 别笑,但我试过headers('Link').rel['last'],当然没有成功。

【问题讨论】:

    标签: javascript angularjs pagination http-headers request-headers


    【解决方案1】:

    来自角度 $http 文档https://docs.angularjs.org/api/ng/service/$http 响应对象具有以下属性:

    data – {string|Object} – The response body transformed with the transform functions.
    status – {number} – HTTP status code of the response.
    headers – {function([headerName])} – Header getter function.
    config – {Object} – The configuration object that was used to generate the request.
    statusText – {string} – HTTP status text of the response.
    

    如果您可以在响应标头中看到“链接”,则要从标头中获取数据,其标头['Link']

    如果您在响应标头中发送分页参数,以下是从标头获取分页链接的代码

    function parseHeader(header){
     // Split parts by comma
            var parts = header.split(',');
            var links = {};
            // Parse each part into a named link
            angular.forEach(parts, function (p) {
                var section = p.split(';');
                if (section.length != 2) {
                    throw new Error("section could not be split on ';'");
                }
                var url = section[0].replace(/<(.*)>/, '$1').trim();
                var queryString = {};
                url.replace(
                    new RegExp("([^?=&]+)(=([^&]*))?", "g"),
                    function($0, $1, $2, $3) { queryString[$1] = $3; }
                );
                var page = queryString['page'];
                if( angular.isString(page) ) {
                    page = parseInt(page);
                }
                var name = section[1].replace(/rel="(.*)"/, '$1').trim();
                links[name] = page;
            });
    
            return links;
    }
    

    【讨论】:

    • 没有其他方法或最佳实践吗?而不是拆分和“手动遍历”对象......我不知道,感觉不是正确的方式,尽管它可能会起作用。
    • 顺便说一句,对象并不总是相同的,有时它带有“2 个部分”(如您的示例中的那个),但有时它带有 4 个部分,包括第一页、上一页页、下一页和最后一页...您的代码这次将无法正常工作
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-17
    • 1970-01-01
    • 2018-08-30
    • 2013-09-23
    • 2014-12-07
    • 2019-02-07
    • 2010-09-18
    相关资源
    最近更新 更多