GET请求需用URLEncoder.encode()对每个参数键值UTF-8编码后拼接,避免中文/特殊字符丢失;POST须设setDoOutput(true)、Content-Type及超时;HTTPS需校验证书与系统时间;响应读取应显式指定charset。

GET请求怎么发才不丢参数
URL里的中文或特殊字符(比如空格、&、=)不编码,服务端就收不到完整参数。别手拼URL,用 URLEncoder.encode() 处理每个键和值,再用 + 或 %20 拼接——但注意:+ 在 query string 里会被当成空格,所以统一用 %20 更稳。
常见错误:new URL("https://api.example.com/search?q=hello world") 直接写空格,结果服务端只收到 q=hello。
实操建议:
- 对每个参数值单独调用
URLEncoder.encode(value, "UTF-8") - 用
StringBuilder拼接 query string,键值间用=,参数间用& - 整个 URL 构造完再传给
new URL(),别在中间插字符串替换
POST请求body怎么送才被后端识别
默认情况下 HttpURLConnection 不自动设置 Content-Type,也不开启输出流,后端要么收不到 body,要么当成 text/plain 解析失败。
立即学习“Java免费学习笔记(深入)”;
常见错误:写了 conn.getOutputStream().write(...) 却忘了 setDoOutput(true),结果抛 java.net.ProtocolException: cannot write to a URLConnection if doOutput=false。
实操建议:
- 必须先调用
conn.setDoOutput(true) - 根据接口要求设
Content-Type:application/json就写conn.setRequestProperty("Content-Type", "application/json; charset=UTF-8");表单就用application/x-www-form-urlencoded - 写完 body 后记得
flush()和close(),否则部分服务端会卡住等数据
为什么连不上、超时、或返回403
不是代码写错,而是默认行为太“干净”:没 User-Agent 被当成爬虫拦截;没设超时,卡死几分钟才报错;HTTPS 证书异常直接拒绝连接。
常见错误现象:java.net.ConnectException: Connection timed out 或 javax.net.ssl.SSLHandshakeException,其实只是缺几行配置。
实操建议:
- 加
conn.setRequestProperty("User-Agent", "Mozilla/5.0")避免 403 - 必须设超时:
conn.setConnectTimeout(5000)和conn.setReadTimeout(10000) - HTTPS 场景下如果遇到证书问题,不要全局信任所有证书(那是安全漏洞),优先检查系统时间是否正确、JDK 是否支持目标 TLS 版本
响应体读取不全或乱码怎么办
用 getInputStream() 读响应,但没指定字符集,中文全变问号;或者用 readLine() 读取,遇到换行符不规范的接口就截断。
常见错误:直接 new String(bytes),依赖平台默认编码,Windows 和 Linux 结果不同。
实操建议:
- 从
conn.getContentEncoding()或响应头Content-Type提取 charset, fallback 到UTF-8 - 用
InputStreamReader包一层,显式传入 charset:new InputStreamReader(conn.getInputStream(), charset) - 别用
readLine(),改用BufferedReader.read(char[], 0, len)或直接读字节数组再转字符串
真正麻烦的是重定向、Cookie 管理、连接复用这些——HttpURLConnection 默认关着,得手动开;而一旦开了,又得自己处理 Set-Cookie 和 Location。这些细节不写进每段逻辑里,很容易上线后才发现某些请求莫名失败。










