<?php
/*接口盒子:提供各种免费API接口,集群服务器保障服务稳定。
官网:https://www.apihz.cn/ ,服务QQ群:500700444 ,服务QQ号:2813858888
PHP通用GET/POST请求教程
*/
//-----------------配置参数-----------------
$config = array(
'url' => 'https://cn.apihz.cn/api/time/getapi.php', //请求地址,替换为实际地址
'type' => 1, // 请求方式 0=GET,1=POST //如果有参数内容较大,必须使用POST。
'data' => array( //请求参数
'id' => '88888888',//开发者ID
'key' => '88888888',//开发者KEY
'type' => 20, // 其他参数按格式增加
),
// curl配置参数
'curl_options' => array(
// 超时设置
'connect_timeout' => 10, // 连接超时时间(秒)
'timeout' => 30, // 整体超时时间(秒)
// SSL设置
'ssl_verify_peer' => false, // 是否验证对等证书
'ssl_verify_host' => false, // 是否验证主机名
// 其他设置
'follow_location' => true, // 是否跟随重定向
'return_transfer' => true, // 是否返回结果而不直接输出
'encoding' => '', // 响应的编码格式,如gzip
// 代理设置
'proxy' => '', // 代理服务器地址,如'http://127.0.0.1:8080'
'proxy_type' => CURLPROXY_HTTP, // 代理类型
'proxy_auth' => array( // 代理认证
'username' => '',
'password' => ''
),
),
// 请求头
'headers' => array(
'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.5845.97 Safari/537.36',
'null' => null,//其他请求头按格式增加
),
// Cookie
'cookie' => '',
// 其他
'user_agent' => '', // 单独设置User-Agent,优先级高于headers中的
);
//-----------------执行请求-----------------
$res = getpost($config);//返回内容
$datas = json_decode($res, true);//对返回内容进行JSON解析
if (json_last_error() === JSON_ERROR_NONE) {
if($datas['code'] == 200){
echo $datas['msg'];//返回状态码请求成功,取出对应的数据,执行自己的业务逻辑。
}else{
echo $datas['msg'];//返回状态码请求失败,取出对应的数据,执行自己的业务逻辑。
}
}else{
echo json_encode(array(
'code' => 400,
'msg' => '解析JSON返回数据失败!'
), JSON_UNESCAPED_UNICODE);
}
//-----------------封装函数-----------------
function getpost($config) {
// 验证必要参数
if (empty($config['url'])) {
return json_encode(array(
'code' => 400,
'msg' => '请求地址不能为空!'
), JSON_UNESCAPED_UNICODE);
}
// 初始化cURL
$curl = curl_init();
if ($curl === false) {
return json_encode(array(
'code' => 400,
'msg' => '初始化失败,请重试!'
), JSON_UNESCAPED_UNICODE);
}
// 设置请求地址
$url = $config['url'];
// 处理请求参数
if (!empty($config['data']) && is_array($config['data'])) {
if ($config['type'] == 0) {
// GET请求:将参数拼接到URL
$query_string = http_build_query($config['data']);
$url .= (strpos($url, '?') === false ? '?' : '&') . $query_string;
} else {
// POST请求:设置POST数据
$post_string = http_build_query($config['data']);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $post_string);
}
}
// 设置基本选项
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, $config['curl_options']['return_transfer'] ?? true);
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, $config['curl_options']['connect_timeout'] ?? 10);
curl_setopt($curl, CURLOPT_TIMEOUT, $config['curl_options']['timeout'] ?? 30);
// SSL设置
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, $config['curl_options']['ssl_verify_peer'] ?? false);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, $config['curl_options']['ssl_verify_host'] ?? false);
// 重定向设置
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, $config['curl_options']['follow_location'] ?? true);
// 编码设置
if (!empty($config['curl_options']['encoding'])) {
curl_setopt($curl, CURLOPT_ENCODING, $config['curl_options']['encoding']);
}
// 代理设置
if (!empty($config['curl_options']['proxy'])) {
curl_setopt($curl, CURLOPT_PROXY, $config['curl_options']['proxy']);
curl_setopt($curl, CURLOPT_PROXYTYPE, $config['curl_options']['proxy_type'] ?? CURLPROXY_HTTP);
// 代理认证
if (!empty($config['curl_options']['proxy_auth']['username'])) {
$auth = $config['curl_options']['proxy_auth']['username'] . ':' .
($config['curl_options']['proxy_auth']['password'] ?? '');
curl_setopt($curl, CURLOPT_PROXYUSERPWD, $auth);
}
}
// 设置请求头
$headers = $config['headers'] ?? array();
// 如果单独设置了User-Agent,添加到请求头
if (!empty($config['user_agent'])) {
$headers[] = 'User-Agent: ' . $config['user_agent'];
}
if (!empty($headers)) {
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
}
// 设置Cookie
if (!empty($config['cookie'])) {
curl_setopt($curl, CURLOPT_COOKIE, $config['cookie']);
}
// 如果是POST请求但没有明确指定Content-Type,默认使用application/x-www-form-urlencoded
if ($config['type'] == 1) {
$hasContentType = false;
foreach ($headers as $header) {
if (stripos($header, 'Content-Type:') !== false) {
$hasContentType = true;
break;
}
}
if (!$hasContentType && is_array($config['data'])) {
curl_setopt($curl, CURLOPT_HTTPHEADER, array_merge($headers, array(
'Content-Type: application/x-www-form-urlencoded'
)));
}
}
// 执行请求
$response = curl_exec($curl);
// 错误处理
if ($response === false) {
$error = curl_error($curl);
$errno = curl_errno($curl);
curl_close($curl);
return json_encode(array(
'code' => 400,
'msg' => '请求失败: [{$errno}] {$error}'
), JSON_UNESCAPED_UNICODE);
}
// 获取HTTP状态码
$httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
// 获取请求信息(可选,可用于调试)
$info = array(
'http_code' => $httpCode,
'total_time' => curl_getinfo($curl, CURLINFO_TOTAL_TIME),
'connect_time' => curl_getinfo($curl, CURLINFO_CONNECT_TIME),
'effective_url' => curl_getinfo($curl, CURLINFO_EFFECTIVE_URL),
);
curl_close($curl);
// 可以根据需要返回info信息
// return array('info' => $info, 'response' => $response);
return $response;
}
?>
import java.io.*;
import java.net.*;
import java.util.HashMap;
import java.util.Map;
import java.util.List;
import java.util.ArrayList;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.security.cert.X509Certificate;
import java.net.Authenticator;
import java.net.PasswordAuthentication;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.google.gson.GsonBuilder;
/**
* 接口盒子:提供各种免费API接口,集群服务器保障服务稳定。
* 官网:https://www.apihz.cn/ ,服务QQ群:500700444 ,服务QQ号:2813858888
* Java通用GET/POST请求工具
* 此代码需要Gson库来处理JSON,请在项目中添加以下Maven依赖
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.9.0</version>
</dependency>
*/
public class HttpRequestTool {
//-----------------配置类-----------------
public static class RequestConfig {
private String url; // 请求地址
private int type = 1; // 请求方式 0=GET,1=POST
private Map data; // 请求参数
private CurlOptions curlOptions; // curl配置参数
private Map headers;// 请求头
private String cookie; // Cookie
private String userAgent; // 单独设置User-Agent
// 构造函数
public RequestConfig() {
this.data = new HashMap<>();
this.curlOptions = new CurlOptions();
this.headers = new HashMap<>();
}
// Getter和Setter方法
public String getUrl() { return url; }
public void setUrl(String url) { this.url = url; }
public int getType() { return type; }
public void setType(int type) { this.type = type; }
public Map getData() { return data; }
public void setData(Map data) { this.data = data; }
public void addData(String key, Object value) { this.data.put(key, value); }
public CurlOptions getCurlOptions() { return curlOptions; }
public void setCurlOptions(CurlOptions curlOptions) { this.curlOptions = curlOptions; }
public Map getHeaders() { return headers; }
public void setHeaders(Map headers) { this.headers = headers; }
public void addHeader(String key, String value) { this.headers.put(key, value); }
public String getCookie() { return cookie; }
public void setCookie(String cookie) { this.cookie = cookie; }
public String getUserAgent() { return userAgent; }
public void setUserAgent(String userAgent) { this.userAgent = userAgent; }
}
//-----------------CURL选项类-----------------
public static class CurlOptions {
private int connectTimeout = 10; // 连接超时时间(秒)
private int timeout = 30; // 整体超时时间(秒)
private boolean sslVerifyPeer = false; // 是否验证对等证书
private boolean sslVerifyHost = false; // 是否验证主机名
private boolean followLocation = true; // 是否跟随重定向
private String encoding = ""; // 响应的编码格式
private String proxy = ""; // 代理服务器地址
private int proxyType = 0; // 代理类型 0=HTTP, 1=SOCKS4, 2=SOCKS5
private ProxyAuth proxyAuth; // 代理认证
// Getter和Setter方法
public int getConnectTimeout() { return connectTimeout; }
public void setConnectTimeout(int connectTimeout) { this.connectTimeout = connectTimeout; }
public int getTimeout() { return timeout; }
public void setTimeout(int timeout) { this.timeout = timeout; }
public boolean isSslVerifyPeer() { return sslVerifyPeer; }
public void setSslVerifyPeer(boolean sslVerifyPeer) { this.sslVerifyPeer = sslVerifyPeer; }
public boolean isSslVerifyHost() { return sslVerifyHost; }
public void setSslVerifyHost(boolean sslVerifyHost) { this.sslVerifyHost = sslVerifyHost; }
public boolean isFollowLocation() { return followLocation; }
public void setFollowLocation(boolean followLocation) { this.followLocation = followLocation; }
public String getEncoding() { return encoding; }
public void setEncoding(String encoding) { this.encoding = encoding; }
public String getProxy() { return proxy; }
public void setProxy(String proxy) { this.proxy = proxy; }
public int getProxyType() { return proxyType; }
public void setProxyType(int proxyType) { this.proxyType = proxyType; }
public ProxyAuth getProxyAuth() { return proxyAuth; }
public void setProxyAuth(ProxyAuth proxyAuth) { this.proxyAuth = proxyAuth; }
}
//-----------------代理认证类-----------------
public static class ProxyAuth {
private String username = "";
private String password = "";
public ProxyAuth() {}
public ProxyAuth(String username, String password) {
this.username = username;
this.password = password;
}
public String getUsername() { return username; }
public void setUsername(String username) { this.username = username; }
public String getPassword() { return password; }
public void setPassword(String password) { this.password = password; }
}
//-----------------响应结果类-----------------
public static class ResponseResult {
private int code;
private String msg;
private Object data;
private Map info; // 请求信息,用于调试
public ResponseResult(int code, String msg) {
this.code = code;
this.msg = msg;
}
public ResponseResult(int code, String msg, Object data) {
this.code = code;
this.msg = msg;
this.data = data;
}
// Getter和Setter方法
public int getCode() { return code; }
public void setCode(int code) { this.code = code; }
public String getMsg() { return msg; }
public void setMsg(String msg) { this.msg = msg; }
public Object getData() { return data; }
public void setData(Object data) { this.data = data; }
public Map getInfo() { return info; }
public void setInfo(Map info) { this.info = info; }
}
//-----------------主执行方法-----------------
public static void main(String[] args) {
// 创建配置对象
RequestConfig config = new RequestConfig();
// 设置请求地址
config.setUrl("https://cn.apihz.cn/api/time/getapi.php");
// 设置请求方式 0=GET,1=POST
config.setType(1);
// 设置请求参数
Map data = new HashMap<>();
data.put("id", "88888888"); // 开发者ID
data.put("key", "88888888"); // 开发者KEY
data.put("type", 20); // 其他参数按格式增加
config.setData(data);
// 设置CURL选项
CurlOptions curlOptions = new CurlOptions();
curlOptions.setConnectTimeout(10); // 连接超时时间(秒)
curlOptions.setTimeout(30); // 整体超时时间(秒)
curlOptions.setSslVerifyPeer(false); // 不验证SSL证书
curlOptions.setSslVerifyHost(false); // 不验证主机名
curlOptions.setFollowLocation(true); // 跟随重定向
curlOptions.setProxy(""); // 代理服务器地址
curlOptions.setProxyType(0); // HTTP代理
// 设置代理认证(如果需要)
ProxyAuth proxyAuth = new ProxyAuth("", "");
curlOptions.setProxyAuth(proxyAuth);
config.setCurlOptions(curlOptions);
// 设置请求头
Map headers = new HashMap<>();
headers.put("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.5845.97 Safari/537.36");
// 其他请求头按格式增加
config.setHeaders(headers);
// 设置Cookie
config.setCookie("");
// 执行请求
String result = getPost(config);
// 解析JSON响应
Gson gson = new GsonBuilder().setPrettyPrinting().create();
try {
JsonObject jsonObject = JsonParser.parseString(result).getAsJsonObject();
int code = jsonObject.get("code").getAsInt();
String msg = jsonObject.get("msg").getAsString();
if (code == 200) {
System.out.println("请求成功: " + msg);
// 返回状态码请求成功,取出对应的数据,执行自己的业务逻辑
} else {
System.out.println("请求失败: " + msg);
// 返回状态码请求失败,取出对应的数据,执行自己的业务逻辑
}
} catch (Exception e) {
// JSON解析失败
ResponseResult errorResponse = new ResponseResult(400, "解析JSON返回数据失败!");
System.out.println(gson.toJson(errorResponse));
}
}
//-----------------封装GET/POST请求函数-----------------
public static String getPost(RequestConfig config) {
// 验证必要参数
if (config.getUrl() == null || config.getUrl().trim().isEmpty()) {
return createErrorResponse(400, "请求地址不能为空!");
}
HttpURLConnection connection = null;
BufferedReader reader = null;
StringBuilder response = new StringBuilder();
Map requestInfo = new HashMap<>();
try {
// 构建URL
String url = config.getUrl();
// 处理GET请求参数
if (config.getType() == 0 && config.getData() != null && !config.getData().isEmpty()) {
String queryString = buildQueryString(config.getData());
url += (url.contains("?") ? "&" : "?") + queryString;
}
// 记录请求信息
long startTime = System.currentTimeMillis();
requestInfo.put("effective_url", url);
// 创建URL对象
URL urlObj = new URL(url);
// 设置代理
if (config.getCurlOptions() != null &&
config.getCurlOptions().getProxy() != null &&
!config.getCurlOptions().getProxy().trim().isEmpty()) {
String proxyStr = config.getCurlOptions().getProxy();
Proxy proxy = createProxy(proxyStr, config.getCurlOptions().getProxyType());
// 设置代理认证
if (config.getCurlOptions().getProxyAuth() != null) {
setupProxyAuth(config.getCurlOptions().getProxyAuth());
}
connection = (HttpURLConnection) urlObj.openConnection(proxy);
} else {
connection = (HttpURLConnection) urlObj.openConnection();
}
// 设置请求方法
if (config.getType() == 0) {
connection.setRequestMethod("GET");
} else {
connection.setRequestMethod("POST");
}
// 设置超时
if (config.getCurlOptions() != null) {
connection.setConnectTimeout(config.getCurlOptions().getConnectTimeout() * 1000);
connection.setReadTimeout(config.getCurlOptions().getTimeout() * 1000);
} else {
connection.setConnectTimeout(10000); // 默认10秒
connection.setReadTimeout(30000); // 默认30秒
}
// SSL证书验证设置
if (config.getCurlOptions() != null && !config.getCurlOptions().isSslVerifyPeer()) {
disableSSLVerification();
}
// 设置请求头
setupHeaders(connection, config);
// 设置Cookie
if (config.getCookie() != null && !config.getCookie().trim().isEmpty()) {
connection.setRequestProperty("Cookie", config.getCookie());
}
// 处理POST请求参数
if (config.getType() == 1 && config.getData() != null && !config.getData().isEmpty()) {
// 设置可输出
connection.setDoOutput(true);
// 获取输出流并写入数据
try (OutputStream os = connection.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(os, "UTF-8")) {
String postData = buildQueryString(config.getData());
osw.write(postData);
osw.flush();
}
}
// 记录连接时间
requestInfo.put("connect_time", System.currentTimeMillis() - startTime);
// 获取响应码
int responseCode = connection.getResponseCode();
requestInfo.put("http_code", responseCode);
// 读取响应
InputStream inputStream;
if (responseCode >= 200 && responseCode < 300) {
inputStream = connection.getInputStream();
} else {
inputStream = connection.getErrorStream();
}
if (inputStream != null) {
reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
String line;
while ((line = reader.readLine()) != null) {
response.append(line);
}
}
// 记录总时间
requestInfo.put("total_time", System.currentTimeMillis() - startTime);
// 关闭连接
connection.disconnect();
} catch (SocketTimeoutException e) {
return createErrorResponse(400, "请求超时: " + e.getMessage());
} catch (ConnectException e) {
return createErrorResponse(400, "连接失败: " + e.getMessage());
} catch (MalformedURLException e) {
return createErrorResponse(400, "URL格式错误: " + e.getMessage());
} catch (IOException e) {
return createErrorResponse(400, "IO异常: " + e.getMessage());
} catch (Exception e) {
return createErrorResponse(400, "请求异常: " + e.getMessage());
} finally {
// 关闭资源
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (connection != null) {
connection.disconnect();
}
}
return response.toString();
}
//-----------------辅助方法-----------------
/**
* 构建查询字符串
*/
private static String buildQueryString(Map data) {
if (data == null || data.isEmpty()) {
return "";
}
StringBuilder queryString = new StringBuilder();
for (Map.Entry entry : data.entrySet()) {
if (queryString.length() > 0) {
queryString.append("&");
}
try {
queryString.append(URLEncoder.encode(entry.getKey(), "UTF-8"));
queryString.append("=");
queryString.append(URLEncoder.encode(entry.getValue().toString(), "UTF-8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
return queryString.toString();
}
/**
* 设置请求头
*/
private static void setupHeaders(HttpURLConnection connection, RequestConfig config) {
// 设置User-Agent
if (config.getUserAgent() != null && !config.getUserAgent().trim().isEmpty()) {
connection.setRequestProperty("User-Agent", config.getUserAgent());
} else if (config.getHeaders() != null && config.getHeaders().containsKey("User-Agent")) {
connection.setRequestProperty("User-Agent", config.getHeaders().get("User-Agent"));
} else {
// 默认User-Agent
connection.setRequestProperty("User-Agent",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36");
}
// 设置其他请求头
if (config.getHeaders() != null) {
for (Map.Entry entry : config.getHeaders().entrySet()) {
if (!"User-Agent".equals(entry.getKey())) {
connection.setRequestProperty(entry.getKey(), entry.getValue());
}
}
}
// 如果是POST请求,检查是否设置了Content-Type
if (config.getType() == 1) {
boolean hasContentType = false;
if (config.getHeaders() != null) {
for (String key : config.getHeaders().keySet()) {
if (key != null && key.toLowerCase().contains("content-type")) {
hasContentType = true;
break;
}
}
}
if (!hasContentType && config.getData() != null && !config.getData().isEmpty()) {
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
}
}
}
/**
* 禁用SSL验证
*/
private static void disableSSLVerification() {
try {
// 创建信任所有证书的TrustManager
TrustManager[] trustAllCerts = new TrustManager[] {
new X509TrustManager() {
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
public void checkClientTrusted(X509Certificate[] certs, String authType) {
}
public void checkServerTrusted(X509Certificate[] certs, String authType) {
}
}
};
// 安装信任管理器
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, new java.security.SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
// 设置主机名验证器
HttpsURLConnection.setDefaultHostnameVerifier((hostname, session) -> true);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 创建代理对象
*/
private static Proxy createProxy(String proxyStr, int proxyType) {
try {
String[] parts = proxyStr.split(":");
String host = parts[0];
int port = Integer.parseInt(parts[1]);
Proxy.Type type = Proxy.Type.HTTP;
if (proxyType == 1) {
type = Proxy.Type.SOCKS;
}
return new Proxy(type, new InetSocketAddress(host, port));
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* 设置代理认证
*/
private static void setupProxyAuth(ProxyAuth proxyAuth) {
if (proxyAuth != null && proxyAuth.getUsername() != null &&
!proxyAuth.getUsername().trim().isEmpty()) {
Authenticator.setDefault(new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(
proxyAuth.getUsername(),
proxyAuth.getPassword().toCharArray()
);
}
});
}
}
/**
* 创建错误响应
*/
private static String createErrorResponse(int code, String message) {
ResponseResult result = new ResponseResult(code, message);
Gson gson = new Gson();
return gson.toJson(result);
}
}
import requests
import json
import time
from typing import Dict, Any, Optional, Union
"""
接口盒子:提供各种免费API接口,集群服务器保障服务稳定。
官网:https://www.apihz.cn/ ,服务QQ群:500700444 ,服务QQ号:2813858888
Python通用GET/POST请求教程
"""
# -----------------配置参数-----------------
config = {
'url': 'https://cn.apihz.cn/api/time/getapi.php', # 请求地址,替换为实际地址
'type': 1, # 请求方式 0=GET,1=POST //如果有参数内容较大,必须使用POST
'data': { # 请求参数
'id': '88888888', # 开发者ID
'key': '88888888', # 开发者KEY
'type': 20, # 其他参数按格式增加
},
# requests配置参数
'request_options': {
# 超时设置
'timeout': 30, # 整体超时时间(秒)
'connect_timeout': 10, # 连接超时时间(秒),Python中通常合并处理
# SSL设置
'verify': False, # 是否验证SSL证书
'ssl_verify_peer': False, # 是否验证对等证书
'ssl_verify_host': False, # 是否验证主机名
# 其他设置
'allow_redirects': True, # 是否跟随重定向
'stream': False, # 是否流式传输
# 代理设置
'proxies': None, # 代理服务器设置,如{'http': 'http://127.0.0.1:8080', 'https': 'http://127.0.0.1:8080'}
'proxy_auth': None, # 代理认证,如('username', 'password')
},
# 请求头
'headers': {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.5845.97 Safari/537.36',
# 其他请求头按格式增加
},
# Cookie
'cookies': None, # 可以是字符串或字典
# 编码
'encoding': None, # 响应编码,如'utf-8', 'gbk'等
# 其他
'user_agent': '', # 单独设置User-Agent,优先级高于headers中的
}
# -----------------封装函数-----------------
def getpost(config: Dict[str, Any]) -> Union[str, Dict[str, Any]]:
"""
通用GET/POST请求函数
Args:
config: 配置字典,包含请求参数
Returns:
响应内容字符串或错误字典
"""
# 验证必要参数
if not config.get('url'):
return json.dumps({
'code': 400,
'msg': '请求地址不能为空!'
}, ensure_ascii=False)
# 准备请求参数
url = config['url']
method = 'POST' if config.get('type', 0) == 1 else 'GET'
params = {}
data = {}
# 处理请求参数
request_data = config.get('data', {})
if request_data and isinstance(request_data, dict):
if method == 'GET':
params = request_data
else:
data = request_data
# 处理请求头
headers = config.get('headers', {}).copy() # 复制避免修改原配置
# 如果单独设置了User-Agent,覆盖headers中的
if config.get('user_agent'):
headers['User-Agent'] = config['user_agent']
# 如果是POST请求但没有明确指定Content-Type,默认使用application/x-www-form-urlencoded
if method == 'POST' and 'Content-Type' not in headers and data:
headers['Content-Type'] = 'application/x-www-form-urlencoded'
# 处理cookies
cookies = config.get('cookies')
if isinstance(cookies, str):
# 将字符串cookies转换为字典
cookies_dict = {}
for cookie in cookies.split(';'):
if '=' in cookie:
key, value = cookie.strip().split('=', 1)
cookies_dict[key] = value
cookies = cookies_dict
# 处理代理
request_options = config.get('request_options', {})
proxies = request_options.get('proxies')
# 处理代理认证
proxy_auth = request_options.get('proxy_auth')
if proxy_auth and proxies:
# 如果代理地址是字符串,转换为包含认证的格式
for proxy_type in ['http', 'https']:
if proxy_type in proxies and isinstance(proxies[proxy_type], str):
proxy_url = proxies[proxy_type]
if proxy_url.startswith('http://'):
proxy_url = proxy_url.replace('http://', f'http://{proxy_auth[0]}:{proxy_auth[1]}@')
proxies[proxy_type] = proxy_url
# 准备请求参数
request_kwargs = {
'url': url,
'method': method,
'headers': headers,
'params': params,
'data': data,
'cookies': cookies,
'timeout': (request_options.get('connect_timeout', 10), request_options.get('timeout', 30)),
'verify': request_options.get('verify', False),
'allow_redirects': request_options.get('allow_redirects', True),
'stream': request_options.get('stream', False),
'proxies': proxies,
}
# 移除空值参数
request_kwargs = {k: v for k, v in request_kwargs.items() if v is not None}
try:
# 发送请求
response = requests.request(**request_kwargs)
# 处理编码
if config.get('encoding'):
response.encoding = config['encoding']
# 返回响应
return response.text
except requests.exceptions.Timeout as e:
return json.dumps({
'code': 400,
'msg': f'请求超时: {str(e)}'
}, ensure_ascii=False)
except requests.exceptions.ConnectionError as e:
return json.dumps({
'code': 400,
'msg': f'连接错误: {str(e)}'
}, ensure_ascii=False)
except requests.exceptions.RequestException as e:
return json.dumps({
'code': 400,
'msg': f'请求失败: {str(e)}'
}, ensure_ascii=False)
except Exception as e:
return json.dumps({
'code': 400,
'msg': f'未知错误: {str(e)}'
}, ensure_ascii=False)
# -----------------执行请求-----------------
if __name__ == '__main__':
# 执行请求
res = getpost(config)
# 尝试解析JSON响应
try:
if isinstance(res, str):
datas = json.loads(res)
else:
datas = res
if isinstance(datas, dict):
if datas.get('code') == 200:
print(datas.get('msg', '请求成功')) # 返回状态码请求成功,取出对应的数据,执行自己的业务逻辑
else:
print(datas.get('msg', '请求失败')) # 返回状态码请求失败,取出对应的数据,执行自己的业务逻辑
else:
# 如果不是JSON,直接输出
print(res)
except json.JSONDecodeError:
# JSON解析失败
if isinstance(res, str):
print(json.dumps({
'code': 400,
'msg': '解析JSON返回数据失败!',
'raw_response': res[:200] # 只显示前200个字符
}, ensure_ascii=False))
else:
print(json.dumps({
'code': 400,
'msg': '解析JSON返回数据失败!'
}, ensure_ascii=False))
except Exception as e:
print(json.dumps({
'code': 400,
'msg': f'处理响应时出错: {str(e)}'
}, ensure_ascii=False))
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json.Linq;
namespace ApiHzCSharpDemo
{
/// <summary>
/// API盒子:提供各种免费API接口,集群服务器保障服务稳定。
/// 官网:https://www.apihz.cn/ ,服务QQ群:500700444 ,服务QQ号:2813858888
/// C#通用GET/POST请求教程
/// </summary>
class Program
{
/// <summary>
/// API请求配置类
/// </summary>
public class ApiConfig
{
/// <summary>
/// 请求地址
/// </summary>
public string Url { get; set; } = "https://cn.apihz.cn/api/time/getapi.php";
/// <summary>
/// 请求方式 0=GET,1=POST
/// 如果有参数内容较大,必须使用POST
/// </summary>
public int RequestType { get; set; } = 1;
/// <summary>
/// 请求参数
/// </summary>
public Dictionary<string, object> Data { get; set; } = new Dictionary<string, object>()
{
{ "id", "88888888" }, // 开发者ID
{ "key", "88888888" }, // 开发者KEY
{ "type", 20 } // 其他参数按格式增加
};
/// <summary>
/// HttpClient配置参数
/// </summary>
public HttpClientOptions HttpClientOptions { get; set; } = new HttpClientOptions();
/// <summary>
/// 请求头
/// </summary>
public Dictionary<string, string> Headers { get; set; } = new Dictionary<string, string>()
{
{ "User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.5845.97 Safari/537.36" }
// 其他请求头按格式增加
};
/// <summary>
/// Cookie
/// </summary>
public string Cookie { get; set; } = "";
/// <summary>
/// 单独设置User-Agent,优先级高于Headers中的
/// </summary>
public string UserAgent { get; set; } = "";
}
/// <summary>
/// HttpClient配置参数类
/// </summary>
public class HttpClientOptions
{
/// <summary>
/// 超时时间(秒)
/// </summary>
public int Timeout { get; set; } = 30;
/// <summary>
/// SSL设置
/// </summary>
public SslOptions SslOptions { get; set; } = new SslOptions();
/// <summary>
/// 代理设置
/// </summary>
public ProxyOptions ProxyOptions { get; set; } = new ProxyOptions();
/// <summary>
/// 是否自动处理重定向
/// </summary>
public bool AllowAutoRedirect { get; set; } = true;
}
/// <summary>
/// SSL配置类
/// </summary>
public class SslOptions
{
/// <summary>
/// 是否验证SSL证书
/// 注意:在生产环境中应设置为true以确保安全
/// </summary>
public bool ValidateCertificate { get; set; } = false;
}
/// <summary>
/// 代理配置类
/// </summary>
public class ProxyOptions
{
/// <summary>
/// 代理服务器地址,如"http://127.0.0.1:8080"
/// </summary>
public string Address { get; set; } = "";
/// <summary>
/// 代理认证用户名
/// </summary>
public string Username { get; set; } = "";
/// <summary>
/// 代理认证密码
/// </summary>
public string Password { get; set; } = "";
}
/// <summary>
/// 返回结果类
/// </summary>
public class ApiResult
{
public int Code { get; set; }
public string Msg { get; set; }
public object Data { get; set; }
}
static async Task Main(string[] args)
{
//-----------------配置参数-----------------
var config = new ApiConfig
{
Url = "https://cn.apihz.cn/api/time/getapi.php", // 请求地址,替换为实际地址
RequestType = 1, // 请求方式 0=GET,1=POST
Data = new Dictionary<string, object>
{
{ "id", "88888888" }, // 开发者ID
{ "key", "88888888" }, // 开发者KEY
{ "type", 20 } // 其他参数按格式增加
}
};
//-----------------执行请求-----------------
try
{
// 使用异步方法执行请求
var response = await GetPostAsync(config);
// 对返回内容进行JSON解析
var result = ParseApiResponse(response);
if (result.Code == 200)
{
Console.WriteLine(result.Msg); // 返回状态码请求成功,取出对应的数据,执行自己的业务逻辑
}
else
{
Console.WriteLine(result.Msg); // 返回状态码请求失败,取出对应的数据,执行自己的业务逻辑
}
}
catch (Exception ex)
{
Console.WriteLine($"请求发生异常: {ex.Message}");
}
}
/// <summary>
/// 解析API响应
/// </summary>
/// <param name="response">响应字符串</param>
/// <returns>解析后的ApiResult对象</returns>
public static ApiResult ParseApiResponse(string response)
{
try
{
// 尝试解析JSON
var json = JObject.Parse(response);
return new ApiResult
{
Code = json["code"]?.Value<int>() ?? 400,
Msg = json["msg"]?.Value<string>() ?? "响应格式不正确",
Data = json["data"]
};
}
catch
{
// 解析失败
return new ApiResult
{
Code = 400,
Msg = "解析JSON返回数据失败!",
Data = null
};
}
}
/// <summary>
/// 封装的GET/POST请求函数(异步版本)
/// </summary>
/// <param name="config">请求配置</param>
/// <returns>响应字符串</returns>
public static async Task<string> GetPostAsync(ApiConfig config)
{
// 验证必要参数
if (string.IsNullOrEmpty(config.Url))
{
var errorResult = new
{
code = 400,
msg = "请求地址不能为空!"
};
return Newtonsoft.Json.JsonConvert.SerializeObject(errorResult);
}
// 创建HttpClientHandler配置
var handler = new HttpClientHandler();
// 设置SSL验证
if (!config.HttpClientOptions.SslOptions.ValidateCertificate)
{
// 注意:在生产环境中不应禁用SSL验证
handler.ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) => true;
}
// 设置代理
if (!string.IsNullOrEmpty(config.HttpClientOptions.ProxyOptions.Address))
{
handler.Proxy = new System.Net.WebProxy(config.HttpClientOptions.ProxyOptions.Address);
if (!string.IsNullOrEmpty(config.HttpClientOptions.ProxyOptions.Username))
{
handler.Proxy.Credentials = new System.Net.NetworkCredential(
config.HttpClientOptions.ProxyOptions.Username,
config.HttpClientOptions.ProxyOptions.Password
);
}
}
// 设置Cookie
if (!string.IsNullOrEmpty(config.Cookie))
{
// 可以在这里解析Cookie字符串并添加到handler
// 简化处理,实际使用中可能需要更复杂的Cookie处理
}
// 设置是否允许重定向
handler.AllowAutoRedirect = config.HttpClientOptions.AllowAutoRedirect;
// 创建HttpClient
using var httpClient = new HttpClient(handler)
{
Timeout = TimeSpan.FromSeconds(config.HttpClientOptions.Timeout)
};
// 设置请求头
if (!string.IsNullOrEmpty(config.UserAgent))
{
httpClient.DefaultRequestHeaders.UserAgent.ParseAdd(config.UserAgent);
}
else if (config.Headers.ContainsKey("User-Agent"))
{
httpClient.DefaultRequestHeaders.UserAgent.ParseAdd(config.Headers["User-Agent"]);
}
// 添加其他请求头
foreach (var header in config.Headers)
{
if (header.Key != "User-Agent" && header.Key != "Content-Type")
{
try
{
httpClient.DefaultRequestHeaders.Add(header.Key, header.Value);
}
catch
{
// 忽略无法添加的请求头
}
}
}
// 处理请求参数
string fullUrl = config.Url;
HttpContent content = null;
if (config.Data != null && config.Data.Count > 0)
{
if (config.RequestType == 0) // GET请求
{
// 将参数拼接到URL
var queryString = new System.Text.StringBuilder();
bool isFirst = true;
foreach (var param in config.Data)
{
if (isFirst)
{
queryString.Append($"?{Uri.EscapeDataString(param.Key)}={Uri.EscapeDataString(param.Value.ToString())}");
isFirst = false;
}
else
{
queryString.Append($"&{Uri.EscapeDataString(param.Key)}={Uri.EscapeDataString(param.Value.ToString())}");
}
}
fullUrl += queryString.ToString();
}
else // POST请求
{
// 创建表单数据
var formData = new List<KeyValuePair<string, string>>();
foreach (var param in config.Data)
{
formData.Add(new KeyValuePair<string, string>(param.Key, param.Value.ToString()));
}
content = new FormUrlEncodedContent(formData);
// 如果没有明确指定Content-Type,默认使用application/x-www-form-urlencoded
if (!config.Headers.ContainsKey("Content-Type"))
{
content.Headers.ContentType = new MediaTypeHeaderValue("application/x-www-form-urlencoded");
}
}
}
try
{
HttpResponseMessage response;
if (config.RequestType == 0) // GET请求
{
response = await httpClient.GetAsync(fullUrl);
}
else // POST请求
{
response = await httpClient.PostAsync(config.Url, content);
}
// 确保响应成功
response.EnsureSuccessStatusCode();
// 读取响应内容
var responseContent = await response.Content.ReadAsStringAsync();
return responseContent;
}
catch (HttpRequestException ex)
{
var errorResult = new
{
code = 400,
msg = $"HTTP请求失败: {ex.Message}"
};
return Newtonsoft.Json.JsonConvert.SerializeObject(errorResult);
}
catch (TaskCanceledException ex)
{
var errorResult = new
{
code = 400,
msg = $"请求超时: {ex.Message}"
};
return Newtonsoft.Json.JsonConvert.SerializeObject(errorResult);
}
catch (Exception ex)
{
var errorResult = new
{
code = 400,
msg = $"请求失败: {ex.Message}"
};
return Newtonsoft.Json.JsonConvert.SerializeObject(errorResult);
}
}
/// <summary>
/// 封装的GET/POST请求函数(同步版本)
/// </summary>
/// <param name="config">请求配置</param>
/// <returns>响应字符串</returns>
public static string GetPost(ApiConfig config)
{
// 调用异步方法并同步等待结果
return GetPostAsync(config).GetAwaiter().GetResult();
}
}
}