鱼弦:公众号【红尘灯塔】,CSDN博客专家、内容合伙人、新星导师、全栈领域优质创作者 、51CTO(Top红人+专家博主) 、github开源爱好者(go-zero源码二次开发、游戏后端架构 https://github.com/Peakchen)
算法概述
URL拼接(URL拼接)是指将多个URL组件(方案、主机、端口、路径、查询参数等)组合成完整的URL字符串的过程。这在构建Web应用程序或进行网络请求时非常有用。
常见的URL拼接算法步骤如下:
-
构建基本URL:
- 以所需的方案(如“https”或“http”)开头。
- 添加“://”分隔符。
- 添加主机名或IP地址。
- 如果指定了端口,使用冒号(“:”)和端口号进行分隔。
- 添加路径(通常以“/”开头)。
-
添加查询参数:
- 如果存在查询参数,使用“?”符号开始查询参数部分。
- 每个查询参数使用“&”符号分隔。
- 每个参数使用“=”符号连接键和值。
代码实现
Java
public class UrlBuilder {
private String scheme;
private String host;
private String port;
private String path;
private Map<String, String> queryParams;
public UrlBuilder() {
this.scheme = "https"; // Default to HTTPS
this.port = null; // No default port
this.path = "/"; // Default path to root
this.queryParams = new HashMap<>();
}
public UrlBuilder setScheme(String scheme) {
this.scheme = scheme;
return this;
}
public UrlBuilder setHost(String host) {
this.host = host;
return this;
}
public UrlBuilder setPort(int port) {
this.port = String.valueOf(port);
return this;
}
public UrlBuilder setPath(String path) {
this.path = path;
return this;
}
public UrlBuilder addQueryParam(String key, String value) {
this.queryParams.put(key, value);
return this;
}
public String build() {
StringBuilder urlBuilder = new StringBuilder();
urlBuilder.append(scheme).append("://").append(host);
if (port != null) {
urlBuilder.append(":").append(port);
}
urlBuilder.append(path);
if (!queryParams.isEmpty()) {
urlBuilder.append("?");
for (Map.Entry<String, String> entry : queryParams.entrySet()) {
urlBuilder.append(entry.getKey()).append("=").append(entry.getValue()).append("&");
}
urlBuilder.deleteCharAt(urlBuilder.length() - 1); // Remove trailing '&'
}
return urlBuilder.toString();
}
public static void main(String[] args) {
UrlBuilder builder = new UrlBuilder();
String url = builder
.setScheme("http")
.setHost("www.example.com")
.setPort(8080)
.setPath("/api/users")
.addQueryParam("id", "123")
.addQueryParam("name", "John Doe")
.build();
System.out.println("Constructed URL: " + url);
}
}
JavaScript
class UrlBuilder {
constructor() {
this.scheme = "https"; // Default to HTTPS
this.host = null; // No default host
this.port = null; // No default port
this.path = "/"; // Default path to root
this.queryParams = {};
}
setScheme(scheme) {
this.scheme = scheme;
return this;
}
setHost(host) {
this.host = host;
return this;
}
setPort(port) {
this.port = port;
return this;
}
setPath(path) {
this.path = path;
return this;
}
addQueryParam(key, value) {
this.queryParams[key] = value;
return this;
}
build() {
let url = `${this.scheme}://${this.host}`;
if (this.port) {
url += `:${this.port}`;
}
url += this.path;
if (Object.keys(this.queryParams).length > 0) {
url += "?";
for (const [key, value] of Object.entries(this.queryParams)) {
url += `${key}=${encodeURIComponent(value)}&`;
}
url = url.slice(0, -1); // Remove trailing '&'
}
return url;
}
static create() {
return new UrlBuilder();
}
}
// Usage example
const urlBuilder = UrlBuilder.create()
.setScheme("http")
.setHost("www.example.com")
.setPort(8080)
.setPath("/api/users")
.addQueryParam("id", 123)
.addQueryParam("name", "John Doe");
const constructedUrl = urlBuilder.build();
console.log("Constructed URL:", constructedUrl);
拼接URL(Python、C、C++)完整实现及部署测试搭建(中文解释)
Python实现
Python
import urllib.parse
class UrlBuilder:
def __init__(self):
self.scheme = "https"
self.host = None
self.port = None
self.path = "/"
self.queryParams = {}
def set_scheme(self, scheme):
self.scheme = scheme
return self
def set_host(self, host):
self.host = host
return self
def set_port(self, port):
self.port = port
return self
def set_path(self, path):
self.path = path
return self
def add_query_param(self, key, value):
self.queryParams[key] = value
return self
def build(self):
url_components = []
url_components.append(self.scheme)
url_components.append("://")
url_components.append(self.host)
if self.port:
url_components.append(":")
url_components.append(str(self.port))
url_components.append(self.path)
if self.queryParams:
query_params = []
for key, value in self.queryParams.items():
query_params.append(f"{key}={urllib.parse.quote(value)}")
query_string = "?" + "&".join(query_params)
url_components.append(query_string)
return "".join(url_components)
# Usage example
url_builder = UrlBuilder()
url = url_builder \
.set_scheme("http") \
.set_host("www.example.com") \
.set_port(8080) \
.set_path("/api/users") \
.add_query_param("id", 123) \
.add_query_param("name", "John Doe") \
.build()
print("Constructed URL:", url)
解释:
-
UrlBuilder
类:- 定义用于构建URL的类。
- 包含
scheme
、host
、port
、path
和queryParams
属性,用于存储URL的各个组成部分。 - 提供
set_scheme
、set_host
、set_port
、set_path
和add_query_param
方法,用于设置URL的各个组成部分。 - 提供
build
方法,用于构建完整的URL字符串。
-
build
方法:- 将URL的各个组成部分拼接成完整的URL字符串。
- 使用
urllib.parse.quote
函数对查询参数值进行编码,确保URL格式正确。
-
使用示例:
- 创建一个
UrlBuilder
实例。 - 使用
set_scheme
、set_host
、set_port
、set_path
和add_query_param
方法设置URL的各个组成部分。 - 使用
build
方法构建完整的URL字符串。 - 打印构建的URL字符串。
- 创建一个
运行代码:
-
保存代码:
- 将Python代码保存为
url_builder.py
文件。
- 将Python代码保存为
-
运行代码:
- 打开终端或命令提示符,并导航到保存代码的目录。
- 运行以下命令:
python url_builder.py
这将打印构建的URL字符串。
C实现
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char *url_builder(char *scheme, char *host, int port, char *path, char **query_params, int num_query_params) {
char *url = NULL;
int url_len = 0;
// Calculate URL length
url_len += strlen(scheme) + 3; // "://"
url_len += strlen(host);
if (port > 0) {
url_len += strlen(":") + 10; // Assuming port is a maximum of 10 digits
}
url_len += strlen(path);
if (num_query_params > 0) {
url_len += strlen("?") + 1; // Assuming each query parameter is a maximum of 100 characters
for (int i = 0; i < num_query_params; i++) {
url_len += strlen(query_params[i]) + 1; // Assuming each query parameter value is a maximum of 100 characters and separated by '&'
}
}
// Allocate memory for the URL
url = malloc(url_len + 1);
if (!url) {
return NULL;
}
// Construct the URL
char *url_ptr = url;
strcpy(url_ptr, scheme);
url_ptr += strlen(scheme);
strcpy(url_ptr, "://");
url_ptr += 3;
strcpy(url_ptr, host);
url_ptr += strlen(host);
if (port > 0) {
strcpy(url_ptr, ":");
url_ptr++;
sprintf(url_ptr, "%d", port);
url_ptr += strlen(url_ptr);
}
strcpy(url_ptr, path);
url_ptr += strlen(path);
if (num_query_params > 0) {
strcpy(url_ptr, "?");
url_ptr++;
for (int i = 0; i < num_query_params; i++) {
strcpy(url_ptr, query_params[i]);
url_ptr += strlen(query_params[i]);
if (i < num_query_params - 1) {
strcpy(url_ptr, "&");
url_ptr++;
}
}
}
url_ptr[0] = '\0'; // Null-terminate the URL string
return url;
}
// Usage example
char *query_params[] = {
"id=123",
"name=John%20Doe"
};
char *url = url_builder("https", "www.example.com", 8080, "/api/users", query_params, 2);
printf("Constructed URL: %s\n", url);
free(url);
C++实现
#include <iostream>
#include <string>
#include <vector>
#include <sstream>
#include <cstdlib>
using namespace std;
string urlBuilder(string scheme, string host, int port, string path, vector<pair<string, string>> queryParams) {
stringstream url;
url << scheme << "://";
url << host;
if (port > 0) {
url << ":" << port;
}
url << path;
if (!queryParams.empty()) {
url << "?";
for (const auto& param : queryParams) {
url << param.first << "=" << param.second << "&";
}
url.seekp(-1, ios::end); // Remove trailing '&'
}
return url.str();
}
int main() {
vector<pair<string, string>> queryParams = {
{"id", "123"},
{"name", "John Doe"}
};
string url = urlBuilder("https", "www.example.com", 8080, "/api/users", queryParams);
cout << "Constructed URL: " << url << endl;
return 0;
}
代码解释
1. urlBuilder
函数:
- 该函数用于构建完整的URL字符串。
- 它接收以下参数:
scheme
: URL 的方案,例如 "https" 或 "http"。host
: URL 的主机名或IP地址。port
: URL 的端口号(可选)。path
: URL 的路径。queryParams
: 一个包含查询参数键值对的vector。
- 函数使用
stringstream
对象来构建URL字符串。 - 它将scheme、host、port和path组件依次添加到
stringstream
中。 - 如果提供了查询参数,它会遍历vector并添加每个键值对,并用 '&' 字符分隔。
- 最后,它使用
seekp
方法删除多余的 '&' 字符并返回构建的URL字符串。
2. main
函数:
- 该函数用于演示
urlBuilder
函数的使用。 - 它创建一个包含查询参数键值对的vector。
- 它调用
urlBuilder
函数并传入参数来构建URL字符串。 - 最后,它打印构建的URL字符串。
部署和测试
1. 编译代码:
- 您需要使用 C++ 编译器来编译代码。
- 具体步骤取决于您使用的编译器和操作系统。
- 一般来说,您可以使用以下命令进行编译:
g++ url_builder.cpp -o url_builder
2. 运行代码:
- 您可以使用以下命令运行编译后的可执行文件:
./url_builder
3. 测试代码:
- 您可以检查输出的URL字符串是否与预期一致。
- 您还可以尝试修改输入参数并观察输出如何变化。
注意:
- 您需要确保您的计算机上安装了 C++ 编译器和运行时环境。
- 您还可以使用其他 C++ 开发环境或 IDE 来编译和运行代码。
示例输出:
Constructed URL: https://www.example.com:8080/api/users?id=123&name=John%20Doe
标签:社招,Java,URL,self,url,host,path,port
From: https://blog.csdn.net/feng1790291543/article/details/140087084