脚本怎样拼接请求参数

wen 实用脚本 22

本文目录导读:

脚本怎样拼接请求参数

  1. 核心原则
  2. JavaScript (前端、Node.js)
  3. Python (后端、爬虫)
  4. Java (Spring Boot / 传统)
  5. Shell (Bash / Curl)
  6. 总结 & 最佳实践

拼接请求参数是开发中很常见的需求,具体方法取决于你用的编程语言应用场景(比如是前端JavaScript还是后端Python/PHP等)。

我给你整理几个最常用语言的拼接方式,以及通用的最佳实践。

核心原则

大部分情况下,标准做法是:

  1. 准备数据:把参数放在一个 Map / Dictionary / Object 里。
  2. 编码处理:对参数的 KeyValue 都进行 URL 编码(如 encodeURIComponent),防止特殊字符(如 &、=、空格)破坏 URL 结构。
  3. 拼接:用 & 连接,用 连接键值对。

JavaScript (前端、Node.js)

这是前端最常用的场景。

手动拼接(基础)

// 1. 准备参数对象
const params = {
  name: '张三',
  age: 25,
  city: '北京 上海' // 包含空格
};
// 2. 使用 URLSearchParams (推荐,自动处理编码)
const queryString = new URLSearchParams(params).toString();
// 结果: name=%E5%BC%A0%E4%B8%89&age=25&city=%E5%8C%97%E4%BA%AC+%E4%B8%8A%E6%B5%B7
// 3. 拼接到 URL
const baseUrl = 'https://api.example.com/search';
const fullUrl = `${baseUrl}?${queryString}`;
console.log(fullUrl);
// 输出: https://api.example.com/search?name=%E5%BC%A0%E4%B8%89&age=25&city=%E5%8C%97%E4%BA%AC+%E4%B8%8A%E6%B5%B7

手动拼接(手写循环,了解原理)

const params = { name: '张三', age: 25 };
const queryParts = [];
for (const key in params) {
  if (params.hasOwnProperty(key)) {
    // 必须进行编码!
    const encodedKey = encodeURIComponent(key);
    const encodedValue = encodeURIComponent(params[key]);
    queryParts.push(`${encodedKey}=${encodedValue}`);
  }
}
const queryString = queryParts.join('&');
// 结果: name=%E5%BC%A0%E4%B8%89&age=25

使用 Axios (最省心)

如果你用 axios 库,直接传 params 对象就行,它自动拼接。

axios.get('https://api.example.com/search', {
  params: {
    name: '张三',
    age: 25
  }
});
// Axios 会自动拼接成:https://api.example.com/search?name=%E5%BC%A0%E4%B8%89&age=25

Python (后端、爬虫)

使用 urllib.parse (标准库,推荐)

from urllib.parse import urlencode
params = {
    'name': '张三',
    'age': 25,
    'keywords': ['Python', '开发']  # 支持列表(会自动处理重复 key)
}
# urlencode 会自动编码
query_string = urlencode(params, doseq=True) 
print(query_string)
# 输出: name=%E5%BC%A0%E4%B8%89&age=25&keywords=Python&keywords=%E5%BC%80%E5%8F%91
# 拼接到 URL
base_url = "https://api.example.com/search"
full_url = f"{base_url}?{query_string}"

使用 requests 库 (最常用)

就像 Axios 一样,requests 库自动帮你处理好一切。

import requests
params = {
    'name': '张三',
    'age': 25
}
response = requests.get('https://api.example.com/search', params=params)
# 打印实际请求的 URL
print(response.url) 
# 输出: https://api.example.com/search?name=%E5%BC%A0%E4%B8%89&age=25

Java (Spring Boot / 传统)

使用 UriComponentsBuilder (Spring 推荐)

import org.springframework.web.util.UriComponentsBuilder;
import java.util.LinkedHashMap;
import java.util.Map;
public class Main {
    public static void main(String[] args) {
        String baseUrl = "https://api.example.com/search";
        Map<String, String> params = new LinkedHashMap<>();
        params.put("name", "张三");
        params.put("age", "25");
        String fullUrl = UriComponentsBuilder.fromHttpUrl(baseUrl)
                .queryParams(new org.springframework.util.LinkedMultiValueMap<>() {{
                    params.forEach(this::add);
                }})
                .build()
                .encode()  // 自动编码
                .toUriString();
        System.out.println(fullUrl);
    }
}

使用 HttpClient 或手动拼接 (传统)

import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.Map;
import java.util.StringJoiner;
public class Main {
    public static String buildQueryString(Map<String, String> params) {
        StringJoiner joiner = new StringJoiner("&");
        for (Map.Entry<String, String> entry : params.entrySet()) {
            // 手动编码
            String key = URLEncoder.encode(entry.getKey(), StandardCharsets.UTF_8);
            String value = URLEncoder.encode(entry.getValue(), StandardCharsets.UTF_8);
            joiner.add(key + "=" + value);
        }
        return joiner.toString();
    }
    public static void main(String[] args) {
        Map<String, String> params = Map.of("name", "张三", "age", "25");
        String queryString = buildQueryString(params);
        String fullUrl = "https://api.example.com/search?" + queryString;
        System.out.println(fullUrl);
    }
}

Shell (Bash / Curl)

在写脚本或直接测试 API 时常用。

方法:使用 jq 或手动构建

#!/bin/bash
# 参数
name="张三"
age="25"
# 使用 curl 的 --data-urlencode 自动编码
full_url="https://api.example.com/search"
curl -G "$full_url" \
  --data-urlencode "name=$name" \
  --data-urlencode "age=$age"
# curl 会自动构建请求 URL 并编码

& 最佳实践

场景 推荐做法 原因
任何语言 使用内置的 URL 编码函数 (encodeURIComponent, urlencode, URLEncoder) 防止特殊字符破坏 URL 结构
简单场景 使用语言标准库 (如URLSearchParams, urllib.parse) 最可靠,无额外依赖
实际项目 使用 HTTP 库 (如 axios, requests) 自动处理编码、拼接、Cookie等,少写代码
批量/测试 使用 curl 配合 --data-urlencode 高效,一行命令搞定

关键提醒:永远不要手动用 和 & 直接拼接字符串,除非你100%确定参数里没有特殊字符,否则,空格、&、、中文等都会导致请求出错。

抱歉,评论功能暂时关闭!