当前位置: 首页 > 面试题库 >

AngularJS资源:如何禁用URL实体编码

祁雪峰
2023-03-14
问题内容

在我当前的项目中,我有一个drupal后端,它为我的前端公开了休息服务。对我的后端的某些调用并不真正喜欢对URL实体进行编码。

所以我的问题是:如何禁用某些参数的URL编码?

例:

我需要在不同的搜索字词之间用“ +”号来调用我的后端。像这样:

http://backend.com/someservice/search/?terms=search+terms+here

但是有角度,设置像这样:

var resource = $resource(
  backendUrl + '/views/:view', {},
    {
      'search': {params:{view:'searchposts'}, isArray:true}
    }
 );

// search posts for the given terms
this.searchPosts = function(terms, limit) {
  resource.search({search:terms.join('+'), limit:limit});
};

调用以下网址:

http://backend.com/someservice/search/?terms=search%2Bterms%2Bhere

有什么建议?谢谢!


问题答案:

更新:使用 Angular
1.4中新的httpParamSerializer,您可以编写自己的paramSerializer并设置$httpProvider.defaults.paramSerializer

以下内容仅适用于AngularJS 1.3(及更低版本)。

不更改AngularJS的来源是不可能的。

这是通过$ http完成的:

https://github.com/angular/angular.js/tree/v1.3.0-rc.5/src/ng/http.js#L1057

function buildUrl(url, params) {
      if (!params) return url;
      var parts = [];
      forEachSorted(params, function(value, key) {
        if (value === null || isUndefined(value)) return;
        if (!isArray(value)) value = [value];

        forEach(value, function(v) {
          if (isObject(v)) {
            v = toJson(v);
          }
          parts.push(encodeUriQuery(key) + '=' +
                     encodeUriQuery(v));
        });
      });
      if(parts.length > 0) {
        url += ((url.indexOf('?') == -1) ? '?' : '&') + parts.join('&');
      }
      return url;
}

encodeUriQuery使用标准encodeUriComponent(MDN),该标准将’+’替换为’%2B’

太糟糕了,您不能覆盖encodeUriQuery它,因为它是角度函数内部的局部变量。

因此,我看到的唯一选择是覆盖window.encodeURIComponent。我已经在$
http拦截器中做到了,以最大程度地减少影响。请注意,仅在响应返回时才放回原始功能,因此在您的请求正在进行时,此更改是全局(!!)。因此,请确保测试这是否不会破坏应用程序中的其他内容。

app.config(function($httpProvider) {
  $httpProvider.interceptors.push(function($q) {
    var realEncodeURIComponent = window.encodeURIComponent;
    return {
      'request': function(config) {
         window.encodeURIComponent = function(input) {
           return realEncodeURIComponent(input).split("%2B").join("+"); 
         }; 
         return config || $q.when(config);
      },
      'response': function(config) {
         window.encodeURIComponent = realEncodeURIComponent;
         return config || $q.when(config);
      }
    };
  });
});


 类似资料:
  • 问题内容: 我正在尝试将json对象导入变量。我根据教程使用服务。 我收到意外的令牌错误,因为我不应该使用 -但我真的不知道该使用什么。我用谷歌搜索了3个小时,发现只有$ http。或$ json。答案,但是我觉得可以做得更容易-更清晰。 (完美的解决方案是; D 服务文件: 控制器文件: json文件(几乎; D) 编辑: 我将$ resource(’file.json更改为https://ww

  • 有时候,你希望在不会干扰其他工作的情况下临时禁用一个资源。例如, 你可能想要调整服务器上的一个配置文件,经过 Puppet 的不断测试,直到获得你想要的确切设置。 在此期间你不想让 Puppet 覆盖旧版本的配置,为此你可以在资源上设置如下的 noop 元参数: noop => true, 操作步骤 添加如下代码到你的配置清单: file { "/tmp/test.cfg": conte

  • 当我在gradle中运行构建任务时,它将所有的Java资源(从src/main/resources)复制到build/resources中。因为我有太重的文件,所以我的构建过程比可能的要慢得多。 有什么方法可以禁止复制它们,并迫使Java仅仅从src/main/resources使用它们吗?

  • 环境:JSF2.1.7Seam2.3.0JBoss5.1.2 我的应用程序有一个需要本地化的字符串 “我同意WorldSite的隐私政策和Cookie通知” 斜体的隐私政策和Cookie通知是指向其他页面的超链接。 最初我们的facets是这样设置的: 注意:我们已经准备好了URL重写,需要/jsf/Notice。xhtml并重写为 这允许对各个键进行零碎的转换 但这需要一些语言的变通方法(在“i

  • 问题内容: 我有一个使用$ resource的简单控制器: 我在指令中使用此控制器(在链接功能中) 但是区域是不确定的。调用是异步的,这很逻辑。 我的问题是我该如何等待结果和区域成为包含所有数据的数组? 这里指令的定义 问题答案: 如果要使用异步方法,则需要通过$ promise使用回调函数,示例如下:

  • 默认情况下,vue-loader使用css-loader 和Vue模板编译器自动处理你的样式和模板文件。 在这个编译过程中,所有的资源URL,例如 img src="...", background:url(...)和CSS@import被解析为模块依赖。 例如,url(./ image.png)将被翻译为require('./ image.png')和 <img src="../image.pn