向指定URL发送get,post方法的请求(java)
来源:互联网 发布:淘宝新上功能兼职挣钱 编辑:程序博客网 时间:2024/06/10 15:18
使用Java发送GET、POST请求
——节选自《疯狂Java讲义》
URL的openConnection()方法将返回一个URLConnection对象,该对象表示应用程序和 URL 之间的通信链接。程序可以通过URLConnection实例向该URL发送请求、读取URL引用的资源。
通常创建一个和 URL 的连接,并发送请求、读取此 URL 引用的资源需要如下几个步骤:
(1)通过调用URL对象openConnection()方法来创建URLConnection对象。
(2)设置URLConnection的参数和普通请求属性。
(3)如果只是发送GET方式请求,使用connect方法建立和远程资源之间的实际连接即可;如果需要发送POST方式的请求,需要获取URLConnection实例对应的输出流来发送请求参数。
(4)远程资源变为可用,程序可以访问远程资源的头字段、或通过输入流读取远程资源的数据。
在建立和远程资源的实际连接之前,程序可以通过如下方法来设置请求头字段:
qsetAllowUserInteraction:设置该URLConnection的allowUserInteraction请求头字段的值。
qsetDoInput:设置该URLConnection的doInput请求头字段的值。
qsetDoOutput:设置该URLConnection的doOutput请求头字段的值。
qsetIfModifiedSince:设置该URLConnection的ifModifiedSince请求头字段的值。
qsetUseCaches:设置该URLConnection的useCaches请求头字段的值。
除此之外,还可以使用如下方法来设置、或增加通用头字段:
qsetRequestProperty(String key, String value):设置该URLConnection的key请求头字段的值为value。如下代码所示:
conn.setRequestProperty("accept" , "*/*")
qaddRequestProperty(String key, String value):为该URLConnection的key请求头字段的增加value值,该方法并不会覆盖原请求头字段的值,而是将新值追加到原请求头字段中。
当远程资源可用之后,程序可以使用以下方法用于访问头字段和内容:
qObject getContent():获取该URLConnection的内容。
qString getHeaderField(String name):获取指定响应头字段的值。
qgetInputStream():返回该URLConnection对应的输入流,用于获取URLConnection响应的内容。
qgetOutputStream():返回该URLConnection对应的输出流,用于向URLConnection发送请求参数。
注意:如果既要使用输入流读取URLConnection响应的内容,也要使用输出流发送请求参数,一定要先使用输出流,再使用输入流。
getHeaderField方法用于根据响应头字段来返回对应的值。而某些头字段由于经常需要访问,所以Java提供了以下方法来访问特定响应头字段的值:
qgetContentEncoding:获取content-encoding响应头字段的值。
qgetContentLength:获取content-length响应头字段的值。
qgetContentType:获取content-type响应头字段的值。
qgetDate():获取date响应头字段的值。
qgetExpiration():获取expires响应头字段的值。
qgetLastModified():获取last-modified响应头字段的值。
下面程序示范了如何向Web站点发送GET请求、POST请求,并从Web站点取得响应的示例。
public class TestGetPost
{
/**
* 向指定URL发送GET方法的请求
* @param url 发送请求的URL
* @param param 请求参数,请求参数应该是name1=value1&name2=value2的形式。
* @return URL所代表远程资源的响应
*/
public static String sendGet(String url , String param)
{
String result = "";
BufferedReader in = null;
try
{
String urlName = url + "?" + param;
URL realUrl = new URL(urlName);
//打开和URL之间的连接
URLConnection conn = realUrl.openConnection();
//设置通用的请求属性
conn.setRequestProperty("accept", "*/*");
conn.setRequestProperty("connection", "Keep-Alive");
conn.setRequestProperty("user-agent",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
//建立实际的连接
conn.connect();
//获取所有响应头字段
Map<String,List<String>> map = conn.getHeaderFields();
//遍历所有的响应头字段
for (String key : map.keySet())
{
System.out.println(key + "--->" + map.get(key));
}
//定义BufferedReader输入流来读取URL的响应
in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line;
while ((line = in.readLine())!= null)
{
result += "/n" + line;
}
}
catch(Exception e)
{
System.out.println("发送GET请求出现异常!" + e);
e.printStackTrace();
}
//使用finally块来关闭输入流
finally
{
try
{
if (in != null)
{
in.close();
}
}
catch (IOException ex)
{
ex.printStackTrace();
}
}
return result;
}
/**
* 向指定URL发送POST方法的请求
* @param url 发送请求的URL
* @param param 请求参数,请求参数应该是name1=value1&name2=value2的形式。
* @return URL所代表远程资源的响应
*/
public static String sendPost(String url,String param)
{
PrintWriter out = null;
BufferedReader in = null;
String result = "";
try
{
URL realUrl = new URL(url);
//打开和URL之间的连接
URLConnection conn = realUrl.openConnection();
//设置通用的请求属性
conn.setRequestProperty("accept", "*/*");
conn.setRequestProperty("connection", "Keep-Alive");
conn.setRequestProperty("user-agent",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
//发送POST请求必须设置如下两行
conn.setDoOutput(true);
conn.setDoInput(true);
//获取URLConnection对象对应的输出流
out = new PrintWriter(conn.getOutputStream());
//发送请求参数
out.print(param);
//flush输出流的缓冲
out.flush();
//定义BufferedReader输入流来读取URL的响应
in = new BufferedReader(
new InputStreamReader(conn.getInputStream()));
String line;
while ((line = in.readLine())!= null)
{
result += "/n" + line;
}
}
catch(Exception e)
{
System.out.println("发送POST请求出现异常!" + e);
e.printStackTrace();
}
//使用finally块来关闭输出流、输入流
finally
{
try
{
if (out != null)
{
out.close();
}
if (in != null)
{
in.close();
}
}
catch (IOException ex)
{
ex.printStackTrace();
}
}
return result;
}
//提供主方法,测试发送GET请求和POST请求
public static void main(String args[])
{
//发送GET请求
String s = TestGetPost.sendGet("http://localhost:8888/abc/login.jsp",null);
System.out.println(s);
//发送POST请求
String s1 = TestGetPost.sendPost(http://localhost:8888/abc/a.jsp,
"user=李刚&pass=abc");
System.out.println(s1);
}
}
上面程序中发送GET请求时只需将请求参数放在URL字符串之后,以?隔开,程序直接调用URLConnection对象的connect方法即可,如程序中sendGet方法中粗体字代码所示;如果程序需要发送POST请求,则需要先设置doIn和doOut两个请求头字段的值,再使用URLConnection对应的输出流来发送请求参数即可,如程序中sendPost方法中粗体字代码所示。
不管是发送GET请求,还是发送POST请求,程序获取URLConnection响应的方式完全一样:如果程序可以确定远程响应是字符流,则可以使用字符流来读取;如果程序无法确定远程响应是字符流,则使用字节流读取即可。
注意:上面程序中发送请求的两个URL是笔者在本机部署的Web应用,关于如何创建Web应用、编写JSP页面请参考笔者所著的《轻量级J2EE企业应用实战》。由于程序可以使用这种方式直接向服务器发送请求——相当于提交Web应用中的登陆表单页,这样就可以让程序不断地变换用户名、密码来提交登陆请求,直到返回登陆成功,这就是所谓的暴力破解。
-----------------------------------------------------------------
用JAVA中的URL获取网页相关信息
Java中有一个URL类,可以获取指定url的内容。
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
URL url = new URL("http://blog.csdn.net/someyuan");
BufferedReader br = new BufferedReader(new InputStreamReader(url.openStream()));
String s = null;
StringBuffer sb = new StringBuffer();
while((s = br.readLine()) != null)
{
sb.append(s+"/r/n");
}
br.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
能够显示与浏览器中所得的页面源代码。
另一个例子,可以查看头文件中的信息
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
URL url = new URL("http://blog.csdn.net/someyuan");
URLConnection uc = url.openConnection();
Map m = uc.getHeaderFields();
Iterator it = m.entrySet().iterator();
while(it.hasNext())
{
System.out.println(it.next());
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
一个URL对象生成后,其属性是不能被改变的,但是我们可以通过类URL所提供的方法来获取这些属性:
public String getProtocol() 获取该URL的协议名。
public String getHost() 获取该URL的主机名。
public int getPort() 获取该URL的端口号,如果没有设置端口,返回-1。
public String getFile() 获取该URL的文件名。
public String getRef() 获取该URL在文件中的相对位置。
public String getQuery() 获取该URL的查询信息。
public String getPath() 获取该URL的路径
public String getAuthority() 获取该URL的权限信息
public String getUserInfo() 获得使用者的信息
public String getRef() 获得该URL的锚
通过URL的方法openStream(),我们只能从网络上读取数据,如果我们同时还想输出数据,例如向服务器端的CGI程序发送一些数据,我们必须先 与URL建立连接,然后才能对其进行读写,这时就要用到类URLConnection了。CGI是公共网关接口(Common Gateway Interface)的简称,它是用户浏览器和服务器端的应用程序进行连接的接口,有关CGI程序设计,请读者参考有关书籍。
类 URLConnection也在包java.net中定义,它表示Java程序和URL在网络上的通信连接。当与一个URL建立连接时,首先要在一个 URL对象上通过方法openConnection()生成对应的URLConnection对象。例如下面的程序段首先生成一个指向地址http://blog.csdn.net/someyuan的对象,然后用openConnection()打开该URL对象上的一个连接,返回一个URLConnection对象。如果连接过程失败,将产生IOException.
Try{
URL netchinaren = new URL ("http://blog.csdn.net/someyuan");
URLConnectonn tc = netchinaren.openConnection();
}catch(MalformedURLException e){ //创建URL()对象失败
…
}catch (IOException e){ //openConnection()失败
…
}
类URLConnection提供了很多方法来设置或获取连接参数,程序设计时最常使用的是getInputStream()和getOurputStream(),其定义为:
InputSteram getInputSteram();
OutputSteram getOutputStream();
通过返回的输入/输出流我们可以与远程对象进行通信。看下面的例子:
URL url =new URL (http://blog.csdn.net/someyuan");
//创建一URL对象
URLConnectin con=url.openConnection();
//由URL对象获取URLConnection对象
DataInputStream dis=new DataInputStream (con.getInputSteam());
//由URLConnection获取输入流,并构造DataInputStream对象
PrintStream ps=new PrintSteam(con.getOutupSteam());
//由URLConnection获取输出流,并构造PrintStream对象
String line=dis.readLine(); //从服务器读入一行
ps.println("client…"); //向服务器写出字符串 "client…"
其中backwards为服务器端的CGI程序。实际上,类URL的方法openSteam()是通过URLConnection来实现的。它等价于
openConnection().getInputStream();
基于URL的网络编程在底层其实还是基于下面要讲的Socket接口的。WWW,FTP等标准化的网络服务都是基于TCP协议的,所以本质上讲URL编程也是基于TCP的一种应用.
private String catchPage(String targetUrl){
URL url;
URLConnection con;
StringBuffer sb=null;
try {
//向targetUrl发送请求
url = new URL(targetUrl);
con=url.openConnection();
//读取响应
BufferedReader reader = new BufferedReader(new InputStreamReader(con.getInputStream()));
sb=new StringBuffer();
String temp;
while((temp=reader.readLine())!=null){
sb.append(temp);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return sb.toString();
}
今天上午刚给别人写的例子
- java 向指定URL发送GET、POST方法的请求
- java 向指定 URL 发送Get\Post方法的请求
- 向指定URL发送get,post方法的请求(java)
- 向指定URL发送GET,POST方法的请求
- 向指定URL发送GET方法的请求(java)
- 向指定URL发送GET/POST请求
- 向指定URL发送POST、GET请求
- 向指定URL发送POST,GET请求
- java 实现向指定URL发送get 和 post 请求
- 向指定URL发送GET POST方法的请求 以及乱码的解决
- 向指定 URL 发送GET,POST方法的请求(传入指定url和参数,服务器返回字符串数据)
- 向指定URL发送GET方法的请求
- 向指定url发送get、post请求工具类示例
- java网络编程中向指定URL发送GET POST请求示例
- java网络编程中向指定URL发送GET POST请求示例
- 向指定URL发送GET或POST请求(调第三方接口)
- 向指定地址发送get、post请求
- 向指定服务器URL 发送POST方法的请求并用JSON表示
- WTC配置(二)
- App手机应用自建平台 无需编码技术 轻松制作
- os/os_cpu_a.s
- CSS3 Animation
- EJB事务管理--bug修改记
- 向指定URL发送get,post方法的请求(java)
- base64编码,用于url中传输的base64
- Spring :Null and empty string values
- WTC配置(三)
- Outbound Delivery trigger BADI"MB_DOCUMENT_BADI"
- MTK 编译出错
- CSS3的文字阴影—text-shadow
- 从零开始学Android (3)
- 前端小谈