Javascript 获取或发布请求=>;非常长的URL

Javascript 获取或发布请求=>;非常长的URL,javascript,node.js,fetch,Javascript,Node.js,Fetch,我正在postgresql中创建一个动态查询来过滤结果集 我在URL中传递参数,例如: http://www.myurl.com/search?query=hello+word&sortorder=relevance&date=week&categories=cat1,cat2 问题是,当用户选择大量类别(以及示例URL中未包含的其他参数)时,URL将非常非常长。我对ID使用UUIDv4,所以URL中有很多UUIDv4,用逗号分隔。 使用POST请求进行此操作是否更好

我正在postgresql中创建一个动态查询来过滤结果集

我在URL中传递参数,例如:

http://www.myurl.com/search?query=hello+word&sortorder=relevance&date=week&categories=cat1,cat2
问题是,当用户选择大量类别(以及示例URL中未包含的其他参数)时,URL将非常非常长。我对ID使用UUIDv4,所以URL中有很多UUIDv4,用逗号分隔。 使用POST请求进行此操作是否更好

编辑:

我使用来检查传入的参数是否是有效的UUIDv4(或数字,…无论我需要该参数是什么)

我正在使用它来执行查询。这支持预处理语句,但我不知道如何在动态查询中使用预处理语句

我的选择代码现在如下所示(简化):

如您所见,我没有将准备好的语句($1,$2,…)传递给查询,而是使用模板文本。我不知道如何使用准备好的语句添加/删除where子句

有没有更安全的方法


编辑2:参数不包含敏感信息。我在授权头中将用户ID作为JWT传递。

如果您使用程序而不是浏览器获取包含参数的URL的内容,那么长获取URL并不重要。(在浏览器中,它们很难看。)为了获得最佳结果,减少各种传统代理服务器等的测试负担,请尽最大努力将URL长度保持在2000个八位字节或更少。(POST请求的有效负载大小没有此类限制。)

注意URL会被记录。因此,如果您的参数携带任何敏感信息,您应该考虑使用POST而不是GET。否则,你的用户的敏感信息将登录到你的web服务器日志中,成为网络爬虫的目标

另外,请仔细阅读SQL注入。请在将传入参数传递到数据库服务器之前对其进行清理。记住,网络爬虫可以(也将)从他们的恶意程序中攻击你的URL,并尝试各种组合试图入侵


如果您使用的是程序而不是浏览器获取包含参数的URL的内容,那么长获取URL并不重要。(在浏览器中,它们很难看。)为了获得最佳结果,减少各种传统代理服务器等的测试负担,请尽最大努力将URL长度保持在2000个八位字节或更少。(POST请求的有效负载大小没有此类限制。)

注意URL会被记录。因此,如果您的参数携带任何敏感信息,您应该考虑使用POST而不是GET。否则,你的用户的敏感信息将登录到你的web服务器日志中,成为网络爬虫的目标

另外,请仔细阅读SQL注入。请在将传入参数传递到数据库服务器之前对其进行清理。记住,网络爬虫可以(也将)从他们的恶意程序中攻击你的URL,并尝试各种组合试图入侵


您是否允许您的用户直接从前端对您的数据库运行任何查询?我正在创建一个IOS应用程序,因此URL不会出现在用户可见的浏览器中,而是出现在代码中。我正在应用程序中使用用户所做的选择动态构建URL。无论如何,是的,这就是传递数据对象的简单POST请求的目的。好的,谢谢你的回答,我将更改我的代码。@Jeremy POST的语义含义与GET非常不同,并且对缓存和浏览器历史记录等有影响。它不仅仅是长URL的替代品。您是否允许您的用户直接从前端对您的数据库运行任何查询?我正在创建一个IOS应用程序,以便URL不在用户可见的浏览器中,而是在代码中。我正在应用程序中使用用户所做的选择动态构建URL。无论如何,是的,这就是传递数据对象的简单POST请求的目的。好的,谢谢你的回答,我将更改我的代码。@Jeremy POST的语义含义与GET非常不同,并且对缓存和浏览器历史记录等有影响。它不仅仅是一个长URL的替代品。我已经添加了一个关于您关注的编辑。也许你可以帮我回答一下。这是关于SQL注入的。谢谢你的回答,顺便说一句!这是一封信。再问一个问题。。。。在这里发布一个问题的链接……我已经添加了一个关于您的问题的编辑。也许你可以帮我回答一下。这是关于SQL注入的。谢谢你的回答,顺便说一句!这是一封信。再问一个问题。。。。在这里发布问题的链接。。。。
const { featured, order } = req.body;

// featured
let featuredQuery = '';

if (featured !== undefined && validator.isBoolean(featured.toString())) {
  let featuredQuery = ` AND featured = ${featured}`;
}

// order
let orderQuery = 'timestamp DESC';

if (order !== undefined) {
  switch (order) {
    default:
    case 'date':
        orderQuery = 'timestamp DESC';
    break;
    case 'user_id':
        orderQuery = 'user_id DESC';
    break;
  }
}


const query = `
  SELECT
    name,
    description
  FROM
    users
  WHERE
    active = true
    ${featuredQuery}
  ORDER BY
    ${orderQuery}
`;