jQuery的$.ajax URL编码问题

17
我正在使用jQuery的$.ajax方法向REST服务发送和检索数据。我提供给$.ajax方法的一些URL需要对空格和其他特殊字符进行编码。
问题在于Chrome、Safari(Webkit)和Internet Explorer浏览器。Firefox会将已经编码的URL进行POST,而其他浏览器则会将未编码的URL进行POST。
例如:
$.ajax ({
  url: "http://localhost:8080/rest/123/Product Line A/[Product Type B]",
  type: "POST",
  dataType: "json",
  data: { ... },
  success: function(...){},
  error: function(...){}
})

Firefox以以下格式POST URL:

http://localhost:8080/rest/123/Product%20Line%20A/%5BProduct%20Type%20B%5D

Chrome、Safari和IE以以下格式POST URL:

http://localhost:8080/rest/123/Product Line A/[Product Type B]

这个 REST 服务接受编码为 Firefox 格式的内容 - 有没有办法让所有浏览器都统一使用这种格式呢?

谢谢!

4个回答

23
你可以使用JavaScript的encodeURI()函数将URL编码为“Firefox格式”,正如你所述。

7

以未编码的形式传递[产品类型B]是无效的,因此浏览器对其的处理是不确定的。

对产品类型部分执行encodeURIComponent()操作。


“产品线B”也无效吗?我会尝试解决这个问题,唯一的问题是它发生在越来越深层次的地方,所以必须小心谨慎。 - user151419
1
@schone 是的,没错。encodeURI() 更方便,因为它允许你一次性运行整个 URL。 - Pekka
encodeURIComponent()/ 编码为 %2F,当在 $.ajax url 中使用时会导致错误 Uncaught SyntaxError: Unexpected token C - David Torres

3

当我尝试使用encodeURIComponent()时,它似乎也对斜杠进行了编码,这会破坏URL。 - user151419
@schone 将每个组件单独传递给 encodeURIComponent(),然后用斜杠将它们连接起来。这是有意而为之的,这样你就可以在组件中使用斜杠,并且它会被相应地编码。 - dsh
@ShivanRaptor,信任有不同的层次,w3schools对于基础知识非常好,有时比stackoverflow上某些不合格的评论更好,可以看上面的内容。 - mahatmanich

1

快速解决方法是在传递给$.ajax之前对URL进行encodeURI()编码。您还可以使用一个薄包装器替换$.ajax函数,以便在传递给原始函数之前将{}文字和URL进行编码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接