为 AJAX 请求在 jQuery 中对字符串进行 URL 编码

Posted

技术标签:

【中文标题】为 AJAX 请求在 jQuery 中对字符串进行 URL 编码【英文标题】:URL Encode a string in jQuery for an AJAX request 【发布时间】:2011-09-26 12:54:44 【问题描述】:

我正在我的应用程序中实现 Google 的即时搜索。我想在用户输入文本输入时触发 HTTP 请求。我遇到的唯一问题是,当用户到达名字和姓氏之间的空格时,该空格没有被编码为+,从而中断了搜索。如何用+ 替换空格,或者只是安全地对字符串进行 URL 编码?

$("#search").keypress(function()       
    var query = "% url accounts.views.instasearch  %?q=" + $('#tags').val();
    var options = ;
    $("#results").html(ajax_load).load(query);
);

【问题讨论】:

你可以使用$.param 【参考方案1】:

试试encodeURIComponent。

通过将特定字符的每个实例替换为表示字符的 UTF-8 编码的一个、两个、三个或四个转义序列来对统一资源标识符 (URI) 组件进行编码(对于由以下字符组成的字符,只有四个转义序列两个“代理”字符)。

例子:

var encoded = encodeURIComponent(str);

【讨论】:

这解决了我的问题 - 当我将一个 URL 作为参数传递给我的 AJAX 请求时,该 URL 丢失了 & 之后的所有查询字符串。当我添加这个时,这解决了我的问题。谢谢!【参考方案2】:

encodeURIComponent 对我来说很好用。我们可以在ajax调用中给出这样的url。代码如下所示:

  $.ajax(
    cache: false,
    type: "POST",
    url: "http://atandra.mivamerchantdev.com//mm5/json.mvc?Store_Code=ATA&Function=Module&Module_Code=thub_connector&Module_Function=THUB_Request",
    data: "strChannelName=" + $('#txtupdstorename').val() + "&ServiceUrl=" + encodeURIComponent($('#txtupdserviceurl').val()),
    dataType: "HTML",
    success: function (data) 
    ,
    error: function (xhr, ajaxOptions, thrownError) 
    
  );

【讨论】:

【参考方案3】:

更好的方法:

encodeURIComponent 转义除以下字符之外的所有字符:alphabetic, decimal digits, - _ . ! ~ * ' ( )

为避免对服务器的意外请求,您应该对将作为 URI 的一部分传递的任何用户输入的参数调用 encodeURIComponent。例如,用户可以为变量注释键入“Thyme &time=again”。不在此变量上使用 encodeURIComponent 将再次给出 comment=Thyme%20&time=。请注意,与号和等号标记了一个新的键值对。因此,您有两个 POST 键,一个等于“Thyme”,另一个(时间)等于再次,而不是具有等于“Thyme &time=again”的 POST 评论键。

对于 application/x-www-form-urlencoded (POST),根据 http://www.w3.org/TR/html401/interac...m-content-type,空格将被替换为“+”,因此可能希望在 encodeURIComponent 替换之后再替换“%20”用“+”。

如果希望更严格地遵守 RFC 3986(保留 !、'、(、) 和 *),即使这些字符没有正式的 URI 分隔用途,也可以安全地使用以下内容:

function fixedEncodeURIComponent (str) 
  return encodeURIComponent(str).replace(/[!'()]/g, escape).replace(/\*/g, "%2A");

【讨论】:

For application/x-www-form-urlencoded (POST), per http://www.w3.org/TR/html401/interac...m-content-type, spaces are to be replaced by '+', so one may wish to follow a encodeURIComponent replacement with an additional replacement of "%20" with "+". 这是怎么做到的? 但是为了使这个有用,需要一个 urldecode 等效项【参考方案4】:

我使用 MVC3/EntityFramework 作为后端,前端通过 jquery 使用我所有的项目控制器,直接发布(使用 $.post)不需要数据加密,当你直接传递参数而不是 URL硬编码。 我已经测试了几个字符,我什至发送了一个 URL(这个 http://www.ihackforfun.eu/index.php?title=update-on-url-crazy&more=1&c=1&tb=1&pb=1)作为参数并且完全没有问题,即使 encodeURIComponent 当你在 URL 中传递所有数据时效果很好(硬编码)

硬编码网址,即>

 var encodedName = encodeURIComponent(name);
 var url = "ControllerName/ActionName/" + encodedName + "/" + keyword + "/" + description + "/" + linkUrl + "/" + includeMetrics + "/" + typeTask + "/" + project + "/" + userCreated + "/" + userModified + "/" + status + "/" + parent;; // + name + "/" + keyword + "/" + description + "/" + linkUrl + "/" + includeMetrics + "/" + typeTask + "/" + project + "/" + userCreated + "/" + userModified + "/" + status + "/" + parent;

否则不要使用 encodeURIComponent 而是尝试在 ajax post 方法中传递参数

 var url = "ControllerName/ActionName/";   
 $.post(url,
         name: nameVal, fkKeyword: keyword, description: descriptionVal, linkUrl: linkUrlVal, includeMetrics: includeMetricsVal, FKTypeTask: typeTask, FKProject: project, FKUserCreated: userCreated, FKUserModified: userModified, FKStatus: status, FKParent: parent ,
 function (data) .......);

【讨论】:

这在当时可能是一个更好的解决方案:)【参考方案5】:

试试这个

var query = "% url accounts.views.instasearch  %?q=" + $('#tags').val().replace(/ /g, '+');

【讨论】:

Anders Fjeldstad 的解决方案要好得多。用加号替换空格可能会起作用,但如果你有其他字符(带有变音符号等),你会遇到很多麻烦。 @Uku:OP 想用 + 替换空格,所以我给了他答案如何去做。 encodeURIComponent 给他 %20 我认为@Uku 是对的。虽然这确实回答了字面上的问题(而且它肯定有效),但我认为@Anders 的解决方案在更大的方案中更好。【参考方案6】:

使用 jQuery.param()..... 描述:创建适合在 URL 查询字符串或 Ajax 请求中使用的数组、普通对象或 jQuery 对象的序列化表示。如果传递了一个 jQuery 对象,它应该包含具有名称/值属性的输入元素。

【讨论】:

以上是关于为 AJAX 请求在 jQuery 中对字符串进行 URL 编码的主要内容,如果未能解决你的问题,请参考以下文章

JQuery学习(5-AJAX1)

使用ajax jquery在html中对db中的相同数据进行分组

jQuery 将 ISO 字符集设置为 ajax 请求

如何在 prestashop 1.7 中对自定义页面进行 ajax 请求

jquery ajax如何判断正在进行

在 Django Rest Framework 中对来自我的网站的 Ajax 请求进行权限绕过