java中http请求

1 篇文章 0 订阅

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">最近在做爬虫项目,在浏览器下获取到可以返回json数据的连接,但是使用java.net自带的请求,请求的只有网页源代码,没有json数据,但是在浏览器上可以直接返回json数据。</span>

String urlpath = "http://www.xxxx.xxx/xxx?status=2&xxx=xxxx&xxxx=2&xxxx=120"
URL url = new URL(urlpath);
BufferedReader Rbuff = new BufferedReader(new InputStreamReader(url.openStream()));
使用该方法返回的只有网页的内容,却不是想要的结果,难道是根本不能返回。但是另一个同学写的爬虫算法直接调用的是apache的第三方的库,使用上述连接之后,可以正确的返回的json数据,好吧,当时一脸的懵逼。难道是我写的太简单了,看来一个java钟该方法的源代码,URL().openStream()相当于调用URL().openConection().getInputStream()方法,只是集成度更高。上述的区别就是:我的程序在这里仅仅是对服务器发出了请求,在浏览器中发送了自己的请求。

查阅了一下浏览器发送http请求的参数:

HTTP协议比较复杂,下面是一个HTT请求的例子:
  
   Host:rss.sina.com.cn
  User-Agent:Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14
  Accept:text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
  Accept-Language:zh-cn,zh;q=0.5
  Accept-Encoding:gzip,deflate
  Accept-Charset:gb2312,utf-8;q=0.7,*;q=0.7
  Keep-Alive:300
  Connection:keep-alive
  Cookie:userId=C5bYpXrimdmsiQmsBPnE1Vn8ZQmdWSm3WRlEB3vRwTnRtW <-- Cookie
  If-Modified-Since:Sun, 01 Jun 2008 12:05:30 GMT
  Cache-Control:max-age=0

可以看出在浏览器中发出请求的时候会将User-Agent这个参数也是就浏览器的类型参数一起发送。进行修改如下:

<span style="white-space:pre">	</span>URL url = new URL(path);
        HttpURLConnection urlConnection = (HttpURLConnection)url.openConnection();
        urlConnection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) ...");
       // urlConnection.setRequestMethod("GET");
        BufferedReader Rbuff = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
添加User-Agent这个参数,可以正确获取json数据。对于有如下的解释,对网站的设置不太懂。

对于有些爬虫来说,这个设置是必要的,譬如有很多网站会对请求头中的 Referer 进行检查,以此来防爬或者防盗链。又譬如有些网站还会对 User-Agent 进行检查,根据这个字段来过滤一些非浏览器的请求。如果请求头设置不对的话,很可能是爬不下正确的数据的。

在这里讲一下http post与get请求的设置:

java中默认的http请求方式是get(这个可以使用urlConnection.getRequestMethod())进行验证。但是为了更明显,通常会使用urlConnection.setRequestMethod()对请求方式进行定义。get会将请求参数设置在head中,但是这种方式是明文的,所以当存在用户名与密码使用get方式发送的时候,如果被拦截会造成密码与账户的泄露,其实get请求方式并没有字数的限制,对于get进行字数限制的是浏览器head对表头有字数的限制。

对于post的请求方式是向服务器发送一段信息,可以使用setDoOutput(true)表示向服务器发送信息。使用如下的方式对输送的信息进行转化成流的形式。

con.setRequestMethod("POST");
con.setDoOutput(true);
DataOutputStream wr = new DataOutputStream(con.getOutputStream());
wr.writeBytes(parameter);
wr.flush();
wr.close();

socket网络编程:

其传输协议分为udp协议与tcp协议,其中tcp数据的传输是需要建立连接的,也就是需要三次握手。而udp数据的传输是不要建立连接的,直接将包丢过去,可以从此看出这两种协议的可靠性,tcp相对于udp更加可靠。

其中:

TCP传输数据的过程:

(客户端与服务器都可以进行数据的发送与接收,因此下面有关于客户端与服务器可以互换的,不需要太过于争辩)

Sever(接收):

1.创建一个socket。

2.绑定本地IP地址与端口。

3.进行对端口的监听。

4.接收来自客户端的连接,在这里会有一个线程堵塞的过程,因此需要开辟新线程。

5.接收数据流(数据的来源一般就是对socket直接流的截取)。

6.读取数据流并进行字符转换。

7.关闭监听与socket

client

1.创建一个socket。

2.绑定本地ip与端口。

3.连接另一端的IP地址与端口。

4.传输数据

5.关闭端口与socket

UPD数据传输的过程

Sever:

1.创建一个socket。

2.绑定本地IP地址与端口。

3.绑定另一端的IP地址与端口。

4.循环读取数据

5关闭socket

client:

1.创建一个socket。

2.绑定本地IP地址与端口。

3.绑定另一端的IP地址与端口。

4.发送数据

5关闭socket


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值