JAVA访问网页

分别测试使用get和post方法访问网页,可以收到服务器的请求,并写入到html文件中。

import java.io.*;
import java.net.*;
import java.util.*;
public class TestGetPostPage {
// param:请求参数,格式应该满足name1=value1&name2=value2的形式。
public static String sendGet(String url, String param) {
String result = "";
if (param != null) {
url = url + "?" + param;
}
try {
URL realUrl = new URL(url);
// 打开和URL之间的连接
HttpURLConnection conn = getHttpURLConnection(realUrl);
// 打印头信息
printHeader(conn);
// 获取响应
result = getResponse(conn);
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
// param:请求参数,格式应该满足name1=value1&name2=value2的形式。
public static String sendPost(String url, String param) {
String result = "";
try {
URL realUrl = new URL(url);
HttpURLConnection conn = getHttpURLConnection(realUrl);
// 发送POST请求必须设置如下两行
conn.setDoOutput(true);
conn.setDoInput(true);
{// Post发送参数:
// 获取HttpURLConnection 对象对应的输出流
PrintWriter out = new PrintWriter(conn.getOutputStream());
// 发送请求参数
out.print(param);
out.close();
}
// 获取响应
result = getResponse(conn);
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
// 提供主方法,测试发送GET请求和POST请求
public static void main(String args[]) {
String url = "http://www.shicimingju.com/book/xiyouji.html";
// "https://zhuanlan.zhihu.com/hulaoshi";
String param = null;
// 也可以自己写个Servlet测试是否接收到参数
// url = "http://localhost:8080/TestJavaWeb/AHServlet";
// param = "uname=tiger";
// ----------------------------
String s;
// 发送GET请求
s = TestGetPostPage.sendGet(url, param);
write("http_get.html", s);
System.out.println("-----------------------------------------------");
// 发送POST请求
s = TestGetPostPage.sendPost(url, param);
write("http_post.html", s);
}
private static HttpURLConnection getHttpURLConnection(URL realUrl) {
StringBuilder sb = new StringBuilder();
sb.append("Mozilla/5.0 (Windows NT 10.0; Win64; x64)");
sb.append(" AppleWrbKit/537.36(KHTML, like Gecko)");
sb.append(" Chrome/72.0.3626.119 Safari/537.36");
HttpURLConnection conn = null;
try {
// 打开和URL之间的连接
conn = (HttpURLConnection) realUrl.openConnection();
// 设置通用的请求属性
conn.setRequestProperty("accept", "*/*");
conn.setRequestProperty("connection", "Keep-Alive");
conn.setRequestProperty("user-agent", sb.toString());
} catch (IOException e) {
e.printStackTrace();
}
return conn;
}
private static String getResponse(HttpURLConnection conn) {
// 读取URL的响应
String result = "";
try (InputStream is = conn.getInputStream();
InputStreamReader isr = new InputStreamReader(is, "utf-8");
BufferedReader in = new BufferedReader(isr)) {
String line;
while ((line = in.readLine()) != null) {
result += "\n" + line;
}
} catch (Exception e) {
System.out.println("Err:getResponse()");
e.printStackTrace();
} finally {
conn.disconnect();
}
System.out.println("getResponse():" + result.length());
return result;
}
private static void printHeader(HttpURLConnection conn) {
System.out.println("---↓↓↓响应头字段---");
Map<String, List<String>> map = conn.getHeaderFields();
for (String key : map.keySet()) {
System.out.println(key + "--->" + map.get(key));
}
System.out.println("---↑↑↑响应头字段---");
}
private static void write(String fileName, String text) {
File f = new File(fileName);
try (FileOutputStream fos = new FileOutputStream(f);
OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");
BufferedWriter bw = new BufferedWriter(osw);) {
bw.write(text);
} catch (IOException e) {
e.printStackTrace();
}
}
}

还可以自己写个Servlet测试服务器端是否接收到参数:

import java.io.*;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
@WebServlet("/AHServlet")
public class AHServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String parameter = request.getParameter("uname");
System.out.println("Get : " + parameter);
resp(response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String parameter = request.getParameter("uname");
System.out.println("Post : " + parameter);
resp(response);
}
private void resp(HttpServletResponse response) throws IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("https://www.bilibili.com/video/av48272174/?p=2");
out.flush();
out.close();
}
}

*JAVA多线程下载网络文件

[参见]: https://www.cnblogs.com/tigerlion/p/10661367.html

URLEncoder和URLDecoder

在使用百度搜索关键字的时候,往往会在地址栏看到如下内容:

https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=2&tn=baiduhome_pg&wd=%E8%99%8E%E8%80%81%E7%8B%AE

有的浏览器直接看不到这段内容,地址栏中直接显示输入的关键字。这是因为浏览器对其进行了修饰,避免神秘代码对用户造成困扰,一般IE不会做这种修饰。

这里的“%E8%99%8E%E8%80%81%E7%8B%AE”就是你输入的关键字,但是进行了编码。

编码,可以使用URLDecoder.decode(...)方法

解码,可以使用URLEncoder.encode(...)方法

encoder:编码器。

decoder:解码器。

URL:Uniform Resource Locator,统一资源定位符。互联网上的每个文件都有一个唯一的

URL。

普通字符串 ←→ application/x-www-form-rulencoded MIME字符串

效果在于转换汉字等。

import java.net.*;
public class _12URLDecoderTest {
public static void main(String[] args) throws Exception {
// 将application/x-www-form-urlencoded字符串
// 转换成普通字符串
String keyWord = URLDecoder.decode("%E8%99%8E%E8%80%81%E7%8B%AE", "UTF-8");
System.out.println(keyWord);
// 将普通字符串转换成
// application/x-www-form-urlencoded字符串
String urlStr = URLEncoder.encode("无字真经", "GBK");
System.out.println(urlStr);
urlStr = URLEncoder.encode("无字真经", "UTF-8");
System.out.println(urlStr);
}
}

运行结果:

虎老狮
%CE%DE%D7%D6%D5%E6%BE%AD
%E6%97%A0%E5%AD%97%E7%9C%9F%E7%BB%8F

Java基础教程——模拟浏览器发送请求的更多相关文章

  1. 使用HttpClient配置代理服务器模拟浏览器发送请求调用接口测试

    在调用公司的某个接口时,直接通过浏览器配置代理服务器可以请求到如下数据: 请求url地址:http://wwwnei.xuebusi.com/rd-interface/getsales.jsp?cid ...

  2. Java基础教程——模拟B/S结构的服务器

    浏览器发送请求,用Java模拟写个简单的服务器,浏览器可以收到响应. 执行下列代码(设置static final int TEST = 1), 使用浏览器访问:http://127.0.0.1:888 ...

  3. telnet客户端模拟浏览器发送请求

    telnet 客户端 telnet客户端能够发出请求去连接服务器(模拟浏览器) 使用telnet之前,需要开启telnet客户端 1.进入控制面板 2.进入程序和功能,选择打开或关闭windows功能 ...

  4. 20200726_java爬虫_使用HttpClient模拟浏览器发送请求

    浏览器获取数据: 打开浏览器 ==> 输入网址 ==> 回车查询 ==> 返回结果 ==> 浏览器显示结果数据 HttpClient获取数据: 创建HttpClient ==& ...

  5. java模拟浏览器发送请求

    package test; import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.IOExcep ...

  6. htmlunit爬虫工具使用--模拟浏览器发送请求,获取JS动态生成的页面内容

    Htmlunit是一款模拟浏览抓取页面内容的java框架,具有js解析引擎(rhino),可以解析页面的js脚本,得到完整的页面内容,特殊适合于这种非完整页面的站点抓取. 下载地址: https:// ...

  7. Java基础教程:网络编程

    Java基础教程:网络编程 基础 Socket与ServerSocket Socket又称"套接字",网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个s ...

  8. Java基础教程:JDBC编程

    Java基础教程:JDBC编程 1.什么是JDBC JDBC 指 Java 数据库连接,是一种标准Java应用编程接口( JAVA API),用来连接 Java 编程语言和广泛的数据库. JDBC A ...

  9. Java基础教程(25)--I/O

    一.I/O流   I/O流表示输入源或输出目标.流可以表示许多不同类型的源和目标,例如磁盘文件.设备.其他程序等.   流支持许多不同类型的数据,包括字节.原始数据类型.字符和对象等.有些流只传递数据 ...

随机推荐

  1. CentOS 7 搭建 Ceph 集群(nautilus 版本)

    搭建 Ceph 分布式集群( nautilus 版本 ) 一.服务器环境说明 主机名 角色 IP地址 ceph-admin ceph-deploy 192.168.92.21 ceph-node1 m ...

  2. drf 路由生成

    前言 在drf中,我们写接口可以通过继承modelViewSet从而达到非常快速的功能实现,这十分的方便,但是modelViewSet由于需要根据不同的参数来对应不同的处理,所以我们写的url最少都需 ...

  3. LWJGL3的内存管理,简介及目录

    LWJGL3的内存管理,简介及目录 LWJGL3 (Lightweight Java Game Library 3),是一个支持OpenGL,OpenAl,Opengl ES,Vulkan等的Java ...

  4. Photoshop CC 习惯设置

    安装后,一般设置: 1.编辑--首选项--常规 2.一般更改内容为: 性能 内存使用情况在50%-80%之间 暂存盘:除去C盘意外的其他盘 单位和标尺:以px为单位 其他根据喜好设定!

  5. ant-design-vue 快速避坑指南

    ant-design-vue是蚂蚁金服 Ant Design 官方唯一推荐的Vue版UI组件库,它其实是Ant Design的Vue实现,组件的风格与Ant Design保持同步,组件的html结构和 ...

  6. 【Java】线程的创建方式

    1.继承Thread类方式 这种方式适用于执行特定任务,并且需要获取处理后的数据的场景. 举例:一个用于累加数组内数据的和的线程. public class AdditionThread extend ...

  7. MSSQL 指定分隔符号 生成数据集

    DECLARE @xml VARCHAR(MAX)='磨毛:1 缩率:2 干磨:3 湿摩:4 水洗牢度:5 手感:6 防水:7 PH:8 日晒:9' SET @xml= '<root>'+ ...

  8. java.sql.SQLException: Error: Error: could not match input

    impala执行sql,输出后我在控制台粘贴执行OK,奇怪了. java.sql.SQLException: Error: Error: could not match input 原因竟然是myba ...

  9. 第三方库文件Joi对数据进行验证的方法以及解决Joi.validate is not a function的问题

    Joi:javaScript对象的规则描述语言和验证器 1.npm install joi@14.3.1 2.建立joi.js文件 3.导入第三方包joi const Joi = require('j ...

  10. exec 家族库函数以及系统调用(execl,execle,execlp and execv,execvp,execve)

    (1)exec函数说明 fork函数是用于创建一个子进程,该子进程几乎是父进程的副本,而有时我们希望子进程去执行另外的程序,exec函数族就提供了一个在进程中启动另一个程序执行的方法.它可以根据指定的 ...