继HttpClient类后,再一个HttpUtil用于访问http/https类,简化操作。

别再手写HttpClient了!用Hutool的HttpUtil,5分钟搞定Java接口调用(附完整工具类) 本文介绍了Hutool的HttpUtil工具类如何简化Java中的HTTP接口调用,替代传统繁琐的HttpClient。通过极简的API设计、文件传输处理和高阶配置,HttpUtil大幅提升了开发效率,并提供了完整的工具类封装和Spring Boot集成实践,帮助开发者快速实现生产级HTTP请求管理。 阅读详情

HttpUtil

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp2
{
    public static class HttpUtil
    {
        public static string GetHtml(string url, Encoding coding, bool allowAutoRedirect, CookieAutoContainer cookies=null, Dictionary<string, string> headers = null)
        {
            HttpWebRequest request = GetRequest(url);

            InitRequest(request, cookies, headers);
            request.AllowAutoRedirect = allowAutoRedirect;

            HttpWebResponse response = request.GetResponse() as HttpWebResponse;
            if (cookies != null)
            {
                cookies.UpdateCookie(response.Headers["Set-Cookie"]);
            }
            StreamReader sr = new StreamReader(response.GetResponseStream(), coding);
            return sr.ReadToEnd();
        }

        public static byte[] GetImage(string url, bool allowAutoRedirect,CookieAutoContainer cookies = null, Dictionary<string, string> headers = null)
        {
            HttpWebRequest request = GetRequest(url);

            InitRequest(request, cookies, headers);
            request.AllowAutoRedirect = allowAutoRedirect;

            HttpWebResponse response = request.GetResponse() as HttpWebResponse;
            if (cookies != null)
            {
                cookies.UpdateCookie(response.Headers["Set-Cookie"]);
            }
            return StreamToBytes(response.GetResponseStream());
        }


        private static byte[] StreamToBytes(Stream stream)
        {
            MemoryStream tmp = new MemoryStream();
            byte[] buff = new byte[1024];
            int len = stream.Read(buff, 0, 1024);
            while (len > 0)
            {
                tmp.Write(buff, 0, len);
                len = stream.Read(buff, 0, 1024);
            }

            tmp.Seek(0, SeekOrigin.Begin);
            byte[] data= tmp.ToArray();
            tmp.Close();
            tmp.Dispose();
            return data;
        }




        private static void InitRequest(HttpWebRequest request, CookieAutoContainer cookies, Dictionary<string, string> headers)
        {
            if (cookies != null)
            {
                request.Headers["Cookie"] = cookies.GetCookieHeader(null);
            }

            if (headers != null)
            {
                foreach (var item in headers)
                {
                    if (item.Key.ToLower() == "host")
                    {
                        request.Host = item.Value;
                        continue;
                    }

                    if (item.Key.ToLower() == "referer")
                    {
                        request.Referer = item.Value;
                        continue;
                    }

                    if (item.Key.ToLower() == "accept")
                    {
                        request.Accept = item.Value;
                        continue;
                    }

                    if (item.Key.ToLower() == "accept")
                    {
                        request.Accept = item.Value;
                        continue;
                    }
                    request.Headers[item.Key] = item.Value;
                }
            }
        }


        private static HttpWebRequest GetRequest(string url)
        {
            HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
            request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.104 Safari/537.36 Core/1.53.4882.400 QQBrowser/9.7.13059.400";
            request.KeepAlive = true;
            request.Proxy = null;
            return request;
        }

        public static void InitHttp(bool enableHttps=true,int limit=512)
        {
            if (enableHttps == true)
            {
                ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
            }
            ServicePointManager.DefaultConnectionLimit = limit;
        }
    }
}

CookieAutoContainer  Cookie自动化容器,解决Net类库CookieContainner无法获取httponly cookie的问题。

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Text.RegularExpressions;

namespace ConsoleApp2
{
    /// <summary>
    /// Cookie自动管理容器
    /// </summary>
    public class CookieAutoContainer
    {
        /// <summary>
        /// Cookie字典
        /// </summary>
        private Dictionary<string,CookieModel> cookies;

        public CookieAutoContainer()
        {
            this.cookies = new Dictionary<string, CookieModel>();
        }


        public void UpdateMsgListCookie(string cookie)
        {
            //ms_tk
            Regex re = new Regex(@"ms_tk=([\w+ \-]+)");
            CookieModel ms_tk = new CookieModel() { Name = "ms_tk", Value = re.Match(cookie).Groups[1].Value };
            this.AddCookie(ms_tk);

            //qun_t1
            re = new Regex(@"qun_t1=([\w+ \-]+)");
            CookieModel qun_t1 = new CookieModel() { Name = "qun_t1", Value = re.Match(cookie).Groups[1].Value };
            this.AddCookie(qun_t1);

            //qun_tl
            re = new Regex(@"qun_tl=([\w+ \-]+)");
            CookieModel qun_tl = new CookieModel() { Name = "qun_tl", Value = re.Match(cookie).Groups[1].Value };
            this.AddCookie(qun_tl);

            //qun_t0
            re = new Regex(@"qun_t0=([\w+ \-]+)");
            CookieModel qun_t0 = new CookieModel() { Name = "qun_t0", Value = re.Match(cookie).Groups[1].Value };
            this.AddCookie(qun_t0);

            //qun_to
            re = new Regex(@"qun_to=([\w+ \-]+)");
            CookieModel qun_to = new CookieModel() { Name = "qun_to", Value = re.Match(cookie).Groups[1].Value };
            this.AddCookie(qun_to);
        }

        #region 使用指定的匹配正则更新Cookie字符串到容器中
        /// <summary>
        /// 使用指定的匹配正则更新Cookie字符串到容器中
        /// </summary>
        /// <param name="re"></param>
        /// <param name="cookieStr"></param>
        public void UpdateCookieByRegex(Regex re,string cookieStr)
        {
            if (re.IsMatch(cookieStr) == true)
            {
                CookieModel cookie = new CookieModel() { Name = re.Match(cookieStr).Groups[1].Value, Value = re.Match(cookieStr).Groups[2].Value,Path= re.Match(cookieStr).Groups[3].Value,Domain= re.Match(cookieStr).Groups[4].Value,Expires= re.Match(cookieStr).Groups[5].Value };
                this.AddCookie(cookie);
            }
        }
        #endregion

        #region 更新Cookie字符串到容器中
        /// <summary>
        /// 更新Cookie字符串到容器中
        /// </summary>
        /// <param name="cookie"></param>
        public List<CookieModel> UpdateCookie(string cookie)
        {
            if (cookie == null || cookie.Length < 2)
            {
                return null;
            }
            List<CookieModel> list = this.StringToCookieModel(cookie);
            foreach (CookieModel cm in list)
            {
                this.AddCookie(cm);
            }
            return list;
        }
        #endregion

        #region 获取当前Cookie容器中存放的Cookie数量
        /// <summary>
        /// 获取当前Cookie容器中存放的Cookie数量
        /// </summary>
        /// <returns></returns>
        public int GetCookieCount()
        {
            return this.cookies.Count;
        }
        #endregion

        #region 添加或更新一个Cookie
        /// <summary>
        /// 添加一个Cookie
        /// </summary>
        /// <param name="cm"></param>
        public void AddCookie(CookieModel cm)
        {
            if (this.cookies.Keys.Contains(cm.Name) == true)
            {
                CookieModel ck = this.cookies[cm.Name];
                ck.Value = cm.Value;
                ck.Path = cm.Path;
                ck.Domain = cm.Domain;
                ck.Expires = cm.Expires;
                return;
            }
            this.cookies.Add(cm.Name, cm);
            return;
        }
        #endregion

        #region 获取指定的Cookie头
        /// <summary>
        /// 获取指定的Cookie头
        /// </summary>
        /// <param name="arr">指定的Cookie</param>
        /// <returns></returns>
        public string GetCookieHeader(List<string> arrKeys)
        {
            StringBuilder sb = new StringBuilder();
            if (arrKeys != null)
            {
                foreach (string keystr in arrKeys)
                {
                    if (this.cookies.Keys.Contains(keystr) == true)
                    {
                        CookieModel cm = this.cookies[keystr];
                        sb.Append(cm.Name + "=" + cm.Value + "; ");
                    }
                }
            }
            else
            {
                foreach (KeyValuePair<string,CookieModel> kv in this.cookies)
                {
                    CookieModel cm = kv.Value;
                    sb.Append(cm.Name + "=" + cm.Value + "; ");
                }
            }
            string tmp = sb.ToString();
            try
            {
                tmp = tmp.Substring(0, tmp.LastIndexOf(';'));
            }
            catch (Exception ex) { }
            return tmp;
        }
        #endregion

        #region 获取指定的Cookie实例
        /// <summary>
        /// 获取指定的Cookie实例
        /// </summary>
        /// <param name="arr">指定的Cookie</param>
        /// <returns></returns>
        public List<CookieModel> GetCookieModel(List<string> arrKeys)
        {
            List<CookieModel> list = new List<CookieModel>();
            if (arrKeys != null)
            {
                foreach (string keystr in arrKeys)
                {
                    if (this.cookies.Keys.Contains(keystr) == true)
                    {
                        list.Add(this.cookies[keystr]);
                    }
                }
            }
            
            return list;
        }
        #endregion

        #region 返回一个Cookie
        /// <summary>
        /// 返回一个Cookie
        /// </summary>
        /// <param name="name"></param>
        /// <returns></returns>
        public CookieModel GetCookie(string name)
        {
            return this.cookies[name];
        }
        #endregion

        #region 解析Cookie字符串到Cookie实体类
        /// <summary>
        /// 解析Cookie字符串到Cookie实体类
        /// </summary>
        /// <param name="cookieStr"></param>
        /// <returns></returns>
        private List<CookieModel> StringToCookieModel(string cookieStr)
        {
            Regex re = new Regex(@"([\w \- \s]+)=([\w \. \* \- \s : / % = |]+)");
            if (re.IsMatch(cookieStr) == true)
            {
                List<CookieModel> list = new List<CookieModel>();
                MatchCollection matchs = re.Matches(cookieStr);
                CookieModel cm = null;
                foreach (Match m in matchs)
                {
                    if (m.Groups[1].Value.ToLower().Trim() == "domain")
                    {
                        cm.Domain = m.Groups[2].Value.Trim();
                        continue;
                    }

                    if (m.Groups[1].Value.ToLower().Trim() == "path")
                    {
                        cm.Path = m.Groups[2].Value.Trim();
                        continue;
                    }

                    if (m.Groups[1].Value.ToLower().Trim() == "expires")
                    {
                        cm.Expires = m.Groups[2].Value.Trim();
                        continue;
                    }

                    cm = new CookieModel();
                    cm.Name = m.Groups[1].Value.Trim();
                    cm.Value = m.Groups[2].Value.Trim();
                    list.Add(cm);
                }
                return list;
            }
            return null;
        }
        #endregion

        #region 遍历CookieContainer
        /// <summary>
        /// 遍历CookieContainer
        /// </summary>
        /// <param name="cc"></param>
        /// <returns></returns>
        public List<Cookie> GetAllCookies(CookieContainer cc)
        {
            List<Cookie> lstCookies = new List<Cookie>();

            Hashtable table = (Hashtable)cc.GetType().InvokeMember("m_domainTable",
            System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.GetField |
            System.Reflection.BindingFlags.Instance, null, cc, new object[] { });
            foreach (object pathList in table.Values)
            {
                SortedList lstCookieCol = (SortedList)pathList.GetType().InvokeMember("m_list",
                System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.GetField
                | System.Reflection.BindingFlags.Instance, null, pathList, new object[] { });
                foreach (CookieCollection colCookies in lstCookieCol.Values)
                    foreach (Cookie c in colCookies) lstCookies.Add(c);
            }

            return lstCookies;
        }
        #endregion

        #region 获取所有的Cookie
        /// <summary>
        /// 获取所有的Cookie
        /// </summary>
        /// <returns></returns>
        public List<CookieModel> GetCookies()
        {
            List<CookieModel> list = new List<CookieModel>();
            foreach (KeyValuePair<string, CookieModel> kv in this.cookies)
            {
                list.Add(kv.Value);
            }
            return list;
        }
        #endregion

    }

    #region Cookie实体类
    /// <summary>
    /// Cookie实体类
    /// </summary>
    public class CookieModel
    {
        public string Name { get; set; }
        public string Value { get; set; }
        public string Domain { get; set; }
        public string Path { get; set; }
        public string Expires { get; set; }
    }
    #endregion
}



httpUtil httpclient 登陆携带cookie访问下一个连接 Java,通过 httpclient 获取 cookie 模拟登录 ,登录后携带cookie发起下一个请求 立即下载

相关推荐

HttpUtil-ssl请求工具

请求http工具 支持ssl,请求参数支持json数据和map数据,能自动转换编码),不必担心返回数据乱码

HttpUtil 工具类,支持调用 HTTPS 协议的接口

import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; import java.security.KeyManagementException; import java.security.KeyStoreException; import java.security.NoSuchAlgori

CoreyXuu的博客 2436

httpUtil工具类

http连接请求,可以支持请求get,post方式请求表单,支持上传文件

http与https连接工具类整理

由于项目是模块开发的采用的分布式架构 所以各模块之间需要用http连接频繁调用所以整理出来了经常用的httpUtil类 Httputil(用于http连接) package cn.com.polycis.config.util; import org.springframework.util.StringUtils; import java.io.BufferedReader; import ...

a1324835795的博客 641

别再让PyCharm吃光你的C盘!保姆级教程:安全迁移config、plugins和remote sources到D盘

本文提供了一份详细的PyCharm配置与缓存文件迁移指南,帮助开发者将config、plugins和remote sources等占用大量C盘空间的文件安全转移到D盘。通过修改data.properties文件和正确迁移顺序,确保PyCharm功能不受影响,同时释放宝贵的系统盘空间。

weixin_28836989的博客 423

RK3588开发板量产前必做:24小时DDR压力测试到底在测什么?(附ArmSoM-W3测试脚本解析)

本文深入解析RK3588开发板量产前的24小时DDR压力测试,揭示其核心价值与技术原理。通过memtester、stressapptest和变频测试的组合使用,全面验证DDR内存稳定性。特别介绍ArmSoM-W3测试脚本的创新设计,包括并行测试架构和异常熔断机制,为开发者提供可靠的量产测试方案。

weixin_30325487的博客 454

Http请求带cookie

package com.zhubu.course.util.http;import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.URL; import java.net.URL

半拾 2269

嵌套交叉验证的‘双循环’哲学:为什么你的模型评估总是不准?

本文深入探讨了嵌套交叉验证(Nested Cross-Validation)在机器学习模型评估中的关键作用,揭示了传统交叉验证方法存在的偏差问题。通过双重循环设计,嵌套交叉验证有效隔离数据,提供无偏评估,显著提升模型在真实场景中的性能预测准确性。文章还提供了工程实践中的优化策略和量化分析,帮助开发者在计算成本与评估精度之间找到平衡。

b3n4m5q6w7的博客 225

Java 中对Http 进行 Cookie操作

首先Cookie是我们后端向前端传输数据的时候设置的一些数据字段,但是Cookie的作用并不是用来传输数据,传输数据的工作交给Json,Cookie更多的是用作验证 当用户登录之后,我们会向用户的前端Cookie里设置 token 之类的字段用于后续判断用户的身份,那么为什么可以要用Cookie来判断身份呢?因为Cookie不是只能由后端传输的前端而已,它是保存在用户本地的,前端与后端通过 Ht...

LinzhiQQQ的博客 1688

《数据结构》04-树4 是否同一棵二叉搜索树

题目 给定一个插入序列就可以唯一确定一棵二叉搜索树。然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到。例如分别按照序列{2, 1, 3}和{2, 3, 1}插入初始为空的二叉搜索树,都得到一样的结果。于是对于输入的各种插入序列,你需要判断它们是否能生成一样的二叉搜索树。 输入格式: 输入包含若干组测试数据。每组数据的第1行给出两个正整数N (≤10)和L,分别是每个序列插入元素的个数和需要...

叫我皮卡丘 2012

微信内置浏览器抓包全攻略:从ADB配置到Chrome调试(附常见问题解决)

本文提供了一套完整的微信内置浏览器抓包与调试解决方案。从ADB工具的深度配置与稳定性连接开始,详细讲解了如何开启X5内核调试开关,并利用Chrome DevTools建立远程连接。文章重点剖析了Network面板进行网络请求抓取、性能分析和问题定位的实战技巧,并附带了设备连接失败、无网络请求等常见问题的排查指南,帮助开发者高效解决微信H5页面调试难题。

gitlab7runner的博客 543

一个 httpUtil 通用 工具类(支持http 和https 协议无证书)

httpUtil 通用工具类(支持http 和https 协议无证书)

u014212540的博客 550

2023年美高赛HiMCM:A题蒲公英 思路

蒲公英,通常称为蒲公英,是一种原产于欧亚大陆的植物,现在在世界各地都可以找到[1]。这种植物很容易通过其亮黄色的花朵(图1)和独特的“马勃”种子头(图2)来识别。该头部的每颗种子都附着在一个类似降落伞的结构上,称为“冠毛”,有利于风的传播[2]。如果处于“马勃”阶段的单个蒲公英毗邻一块开阔的一公顷土地,请创建一个数学模型来预测蒲公英在 1、2、3、6 和 12个月内的传播情况。确保您的模型考虑了各种气候条件(例如温带、干旱和热带气候)对蒲公英生长的影响。2. 蒲 公英、人类和其他植物之间的关系很复杂。

斌擎科技 7402

Java HTTP 接口调用三大神器实战:HttpClient+RestTemplate+Hutool HttpUtil 全解析

本文详细介绍了Apache HttpClient工具的使用方法。作为Java生态中最底层的HTTP客户端工具,HttpClient支持所有HTTP方法,提供请求头自定义、超时配置、连接池管理等高级功能,适用于复杂HTTP需求和非Spring项目。文章包含Maven依赖配置、核心API详解(如HttpGet、HttpPost等类)及完整使用步骤,并提供了GET请求的代码示例,涵盖从创建客户端到解析响应的全过程。特别强调资源关闭的重要性,避免连接泄露。该工具适合需要精细控制HTTP细节的开发场景。

qq_49474843的博客 2058

multisim14.3无法访问数据库...如何解决?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 4455

如何从 VMware 官网下载最新版本的 VMware Workstation

如何从 VMware 官网下载 VMware Workstation

XiaoqiangClub的博客 5898

HttpClient4.5实现http与https请求,解决之前方法过时问题

前言最近项目正在筹备上线,发现 HttpClient 中的很多类和方法都已经过时了,虽然并不影响功能的实现,但是看着确实让人捉急,所以,索性抽了点时间把它给改了。今天就来分享一下。。。之前的代码先看看之前的代码吧:以下是之前的过时代码(部分,完整代码在文章末会贴出git地址)private static void sslClient(HttpClient httpClient) { ...

朱哲的博客 2万+

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

httpf发送 json_Java用HttpClient4发送http/https协议get/post请求,发送map,json,xml,txt数据...

刚写出来的,还未经测试,HttpUtil.javaimport java.io.IOException;import java.io.UnsupportedEncodingException;import java.util.ArrayList;import java.util.List;import java.util.Map;import net.sf.json.JSONObject;impo...

weixin_39640767的博客 161

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Springboot2.5集成HttpClient依赖,封装HTTP请求类并配置连接池

先看需要引入的依赖: <!--Http服务器的访问功能--> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpasyncclient</artifactId> </dependency> <!-- http通信 --> <dependency> <groupId>o

我思故我在的博客空间 6064

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

httpclient4.5.2 Post请求支持http和https

先导入所需的jar包,pom.xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> ...

weixin_30664615的博客 341

Apache HttpComponents 工具类 [ HttpUtil ]

pom.xml &lt;dependency&gt; &lt;groupId&gt;org.apache.httpcomponents&lt;/groupId&gt; &lt;artifactId&gt;httpclient&lt;/artifactId&gt; &lt;versio...

weixin_33989058的博客 1155

OkHttp和HttpClient支持https访问,多证书加载

项目中通过okhttp请求RESTful接口,使用Httpclient来进行代理访问,目前都需要支持https的访问,证书文件路径已经提供,具体配置如下:   ps:亲测https访问是可以的,由于代码在公司内网,只能以图片方式展示 证书路径:(多个证书以逗号隔开)   okhttp配置:   httpclient代理配置:      httpclient支持https配...

zhousheng193的专栏 2340

HttpClient 发送请求封装

该类主要用于发送 HTTP 请求,并支持一些高级功能,例如代理设置和内容压缩。

qq165285727的专栏 294

java httpclient put_一个封装的使用Apache HttpClient进行Http请求(GET、POST、PUT等)的类。详解...

importcom.qunar.payment.gateway.front.channel.mpgs.po.HttpReqEntity;importorg.apache.http.HttpHeaders;importorg.apache.http.auth.AuthScope;importorg.apache.http.auth.UsernamePasswordCredentials;import...

weixin_35763448的博客 344

记一个httputil

`` import java.io.; import java.net.; import java.security.KeyManagementException; import java.security.KeyStoreException; import java.security.NoSuchAlgorithmException; import java.security.cert.CertificateException; import java.security.cert.X509Certific

qq_48053850的博客 161

httpclient请求https

测试类: package com.ali.yunos.tvmaps.web.proxy.service.impl;   import java.util.HashMap;   import org.apache.http.HttpHost; import org.apache.http.protocol.HttpContext;   import com.ali.yunos.tv...

xj8844的博客 619
上一篇: EasyPR中文车牌识别(开源项目)
下一篇: Net Core WebApi 使用Swagger 文档
IT回忆录
博客等级 码龄16年 42粉丝 100原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值