Javascript 如何格式化带有多个问号的url并确保使用最后一个查询字符串

Javascript 如何格式化带有多个问号的url并确保使用最后一个查询字符串,javascript,node.js,url,query-string,Javascript,Node.js,Url,Query String,在我的node.js应用程序中,我正在使用一个API,该API接受如下调用 http://myapi.com/action?url= https://www.test.com/play?action=jump 然后根据传递到URL参数中的参数(例如–“action=jump”),API返回一个特定的响应 我遇到的问题是,在某些情况下,发送到API的URL可能已经有一个带有查询字符串的问号(?song=grait) 在本例中,API返回的响应不正确,因为它使用的是查询字符串中的第一个问号参数。示

在我的node.js应用程序中,我正在使用一个API,该API接受如下调用

http://myapi.com/action?url= https://www.test.com/play?action=jump
然后根据传递到URL参数中的参数(例如–“action=jump”),API返回一个特定的响应

我遇到的问题是,在某些情况下,发送到API的URL可能已经有一个带有查询字符串的问号(?song=grait)

在本例中,API返回的响应不正确,因为它使用的是查询字符串中的第一个问号参数。示例
?宋=肖像

在不修改API的情况下,如何确保API读取末尾的参数-示例–
action=jump

有没有办法避开第一个问号而保留一个有效的URL,或者如何使用
URL.format()
URL.parse()
来解决这个问题


我忘记添加我已经对传递到URL参数中的URL进行了编码。

您应该使用
encodeURIComponent
(在浏览器和节点中工作)

考虑使用来正确处理node.js中的URL

您可以尝试以下方法:

var url = require('url');
  , apiurl = 'http://myapi.com/action';
  , urlObject = url.parse(apiurl);

// Add query string parameters
urlObject.query = {
  action: 'jump', 
  url: 'https://www.test.com/play?song=portrait'
};

// Generate valid url
var urlString = url.format(urlObject);
console.log(urlString); 
它将建立一个正确的url:
http://myapi.com/action?action=jump&url=https%3A%2F%2Fwww.test.com%2Fplay%3Fsong%3Dportrait


另外,请记住,在第一个问号之后还有其他问号。

也许我过于简单化了,但您不能使用
lastIndexOf()


您希望将
&action=jump
添加到此url,而不是添加
?action=jump
:https://www.test.com/play%3F

请注意
%3F
-部分,它是一个编码的

这不起作用,因为它只会将该部分作为另一个参数添加到
http://myapi.com/action
-url

我知道您已经对url进行了编码,但它没有对
&
进行编码,因此我们必须手动进行编码

您可以通过在添加参数时将
&
更改为
%26
来解决此问题

例如:

http://myapi.com/action?url=https://www.test.com/play%3Fsong=portrait%26action=jump
在服务器端,您需要使用
decodeURIComponent(req.query.url)
%26
解析回
&

这样,您将有一个完整正确的url,如下所示:

https://www.test.com/play?song=portrait&action=jump
使用此字符串,您可以使用此线程中的函数:

并称之为:

getParameterByName('action', 'https://www.test.com/play?song=portrait&action=jump')
这将返回
跳转


现在,您可以解析url并提取参数“action”,以始终确保获得正确的参数,而不考虑位置。

当您使用查询字符串值构建url时,首先通过传递查询字符串值调用encodeURIComponent方法,然后框显url。

例如:
var encodedURLComp=”http://myapi.com/action?url=“+window.encodeURIComponent(”); 警报(encodedURLComp)


它编码以下文字@#$&=:/,;?+'

如果您已经对url参数进行了编码,则只需使用符号AND追加操作参数。例如:
'http://myapi.com/action?url=“+encodeURIComponent('https://www.test.com/play?song=portrait“)+”&action=jump“
如果我执行&action=jump,则api不会读取查询字符串。。。仅当我使用问号时,API如何读取参数?它会自动接受第二个参数并将其视为“跳转”,或者它会实际检查传递的参数的名称?您确实需要使用解析/编码,否则会存在安全风险,您的站点可能会被利用来执行它不是为其设计的查询。出于好奇,为什么您需要将整个url作为一个参数?创建像“”这样的请求会更容易吗?当你说你正在使用一个API时,第一次阅读时,我以为你在向那个API发送请求。如果是这样的话,您将不得不了解API解析方式的奇怪之处,并构建/重建请求行以匹配。当您说“在某些情况下”请求行不是API解析的形式(如所需),听起来您既不是生产者也不是消费者。如果你两者都不是,你就无能为力了。请澄清,您是在请求此API,还是实现了此API?
https://www.test.com/play?song=portrait&action=jump
function getParameterByName(name, url) {
    name = name.replace(/[\[\]]/g, "\\$&");
    var regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)"),
        results = regex.exec(url);
    if (!results) return null;
    if (!results[2]) return '';
    return decodeURIComponent(results[2].replace(/\+/g, " "));
}
getParameterByName('action', 'https://www.test.com/play?song=portrait&action=jump')