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

Angularjs uri组件如何编码

慕学海
2023-03-14
问题内容

我期望AngularJS使用标准javascript函数对查询字符串参数进行编码encodeURIComponent。根据以下测试,情况并非如此:

describe('$http', function () {
 it('encodes uri components correctly', inject(function($http, $httpBackend) {
   var data = 'Hello from http://example.com';
   $httpBackend.expectGET('/api/process?data=' + encodeURIComponent(data));
   $http({ method: 'GET', url: '/api/process', params: { data: data } });
   $httpBackend.flush();
 }));
});

测试失败,并出现以下错误:

$ http正确编码uri组件
错误:意外请求:GET /api/process?data=Hello+from+http:%2F%2Fexample.com
预期的GET / api / process?data = Hello%20from%20http%3A%2F% 2Fexample.com

总结一下:

  • 预期的编码: Hello%20from%20http%3A%2F%2Fexample.com
  • 实际编码: Hello+from+http:%2F%2Fexample.com

我应该在AngularJS中使用哪种uri组件(又名查询字符串参数)编码方法?


问题答案:

Angular(至少1.3)不仅使用encodeURIComponent,而且还更改了一些替换项(例如将“”更改为“ +”)。

这是解释原因的提交:https
:
//github.com/angular/angular.js/commit/9e30baad3feafc82fb2f2011fd3f21909f4ba29e

这是您在1.3源码中可以看到的:

/**
 * This method is intended for encoding *key* or *value* parts of query component. We need a custom
 * method because encodeURIComponent is too aggressive and encodes stuff that doesn't have to be
 * encoded per http://tools.ietf.org/html/rfc3986:
 *    query       = *( pchar / "/" / "?" )
 *    pchar         = unreserved / pct-encoded / sub-delims / ":" / "@"
 *    unreserved    = ALPHA / DIGIT / "-" / "." / "_" / "~"
 *    pct-encoded   = "%" HEXDIG HEXDIG
 *    sub-delims    = "!" / "$" / "&" / "'" / "(" / ")"
 *                     / "*" / "+" / "," / ";" / "="
 */
function encodeUriQuery(val, pctEncodeSpaces) {
  return encodeURIComponent(val).
             replace(/%40/gi, '@').
             replace(/%3A/gi, ':').
             replace(/%24/g, '$').
             replace(/%2C/gi, ',').
             replace(/%3B/gi, ';').
             replace(/%20/g, (pctEncodeSpaces ? '%20' : '+'));
}

注意pctEncodeSpaces硬编码为true;

这是您可以解码URI参数的方法

decodeURIComponent(val.
             replace('@', '%40').
             replace(':', '%3A').
             replace('$', '%24').
             replace(',', '%2C').
             replace(';', '%3B').
             replace('+', '%20'));


 类似资料:
  • 我正在使用Vuejs 2(网页包简单模板),我想知道如何在呈现模板之前编译模板。下面是我的代码: App.vue main.js 这就是我启动服务器时遇到的错误: 我还尝试了这个插件vue模板编译器,但没有成功。你能帮我把它弄好吗?提前谢谢。

  • 我知道在香草ES6中,您可以编写一个,它扩展了一个函数类。这里解释了这一点。 React支持两个ES6类组件,通过扩展React。组件和功能组件。但是,当尝试扩展功能组件时,我遇到了以下错误。 我正在尝试编写一些扩展组件的代码,这些代码同时适用于ES6类组件和功能组件。我想写一个函数,返回一个组件,但不是一个高阶组件,我只想扩展和修改一些道具。 下面是一些我尝试过但不起作用的示例代码。这可能吗?我

  • 我有一个自己的骆驼组件/endpoint,我在Spring Boot应用程序中成功地在许多路线中使用。我正试图迁移到骆驼夸克斯,并在我的应用程序中使用相同的路线。 在我的camel quarkus应用程序中,仅通过添加相关依赖项是不可能使用此组件/endpoint的:quarkus无法像Spring Boot那样发现此组件/endpoint。 显而易见的解决方案是编写一个在后台使用这个camel组

  • 问题内容: 假设我在User结构中有一个密码字段。 我的客户通过一起发布用户名和密码来注册用户。因此,如果我将JSON解码为上述struct,它将忽略密码。可以预料的 但是我想知道是否只有编组时才能忽略字段。我检查了官方文档页面,但找不到任何东西。 https://golang.org/pkg/encoding/json/ 我可以在结构中添加一个额外的字段,但我首先需要知道是否可以使用JSON l

  • 通过快捷键对组件进行快速复制,在其他场景粘贴使用 共分为三部 选中要复制的组件 按下 ctrl 键同时点击之前复制组件的图标 在任意场景中通过 Ctrl + V 键,进行粘贴 备注:如果没有按下 Ctrl 键点击复制组件的图标还是照常进行组件复制,不会将组件属性放置到剪切板中 DEMO

  • 我正在使用报表工具编辑。Jasper文件。我正在更改参数的对齐方式左到中心,然后我保存该文件。它还生成“jrxml”文件。在我的Java代码中,我可以传递。jasper位置来打印一些项。但我的改变并不影响,旧的设计保持不变… 帮帮我,我怎么编辑和保存。贾斯珀??? public static JasperPrint CreateFundPrint(Ticket Ticket,HashMap map