Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/380.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 AngularJS资源:如何禁用url实体编码_Javascript_Angularjs_Rest - Fatal编程技术网

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

Javascript AngularJS资源:如何禁用url实体编码,javascript,angularjs,rest,Javascript,Angularjs,Rest,在我当前的项目中,我有一个drupal后端,它为我的前端公开rest服务。 对我的后端的一些调用实际上不喜欢对url实体进行编码 所以我的问题是:如何禁用某些参数的URL编码 例如: 我需要在不同的搜索词之间用“+”号调用我的后端。像这样: http://backend.com/someservice/search/?terms=search+terms+here 但是角度,设置如下: var resource = $resource( backendUrl + '/views/:view

在我当前的项目中,我有一个drupal后端,它为我的前端公开rest服务。 对我的后端的一些调用实际上不喜欢对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});
};
调用以下url:

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

有什么建议吗?谢谢

虽然通常您不想这样做(因为在服务器端,您可以使用URL解码功能对请求URI进行解码以获取加号),但有时我们希望“打破”规则

现在我无法实际测试它(如果您可以创建一个带有测试用例的JSFIDLE供我们使用,这将很有帮助),但是您可能应该看看

从文档中:

transformRequest{函数(数据、, HeaderGetter)|数组}–变换 函数或此类函数的数组。变换函数需要 http请求主体和标头,并返回其已转换的 (通常序列化)版本


它看起来像是
$resource
代码将此功能包装在
Route.prototype.seturlparms
中:

  params = params || {};
  forEach(self.urlParams, function (_, urlParam) {
    val = params.hasOwnProperty(urlParam) ? params[urlParam] : self.defaults[urlParam];
    if (angular.isDefined(val) && val !== null) {
      encodedVal = encodeUriSegment(val);
      url = url.replace(new RegExp(":" + urlParam + "(\\W|$)", "g"), function (match, p1) {
        return encodedVal + p1;
      });
    } else {
      url = url.replace(new RegExp("(\/?):" + urlParam + "(\\W|$)", "g"), function (match,
          leadingSlashes, tail) {
        if (tail.charAt(0) == '/') {
          return tail;
        } else {
          return leadingSlashes + tail;
        }
      });
    }
  });

而且它看起来像是
resourceFactory
函数在构建的路由上创建了一个闭包,因此您没有权限更改它


您是否特别需要将其作为资源对象?如果没有,您可以创建一个普通的
$http
调用,并使用Antonio提到的请求转换。

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

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

如果不改变AngularJS的来源,这是不可能的

这是通过$http完成的:

encodeUriQuery
使用标准的
encodeUriComponent
(),它将“+”替换为“%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);
      }
    };
  });
});

AngularJS仅在将参数作为额外对象传递时运行encodeUriQuery方法。如果手动创建自己的param字符串并将其连接到URL,Angular将不会修改它


自己转换param对象非常简单,下面是一个示例:

不要反对它。只需使用
decodeURIComponent()
返回rfc的
+
,URI应该被编码。在服务器上解码。如果我不拥有或无法访问te服务器怎么办?如果服务器是无法更改的外部系统,该怎么办?不是真正的解决方案…您不能从
transformRequest
Dam更改url,我的选项是什么pFeels有点粗鲁,但hey似乎工作得很好:p非常感谢!创建了一个github问题,以了解还有哪些其他选项:您知道如何编写自己的paramSerializer函数吗?我到目前为止运气不好。现在,我正试图将参数传递给我的RESTAPI的GET请求,它对我的问号进行编码并破坏请求。你的帖子是我最接近的一篇可能对我有用的文章,但我不知道如何编写一个函数来阻止该字符被编码:(
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);
      }
    };
  });
});