HttpURLConnection的使用

HttpURLConnection的使用  html

 

/*java

* URL请求的类别分为二类,GET与POST请求。两者的区别在于: json

* a:) get请求能够获取静态页面,也能够把参数放在URL字串后面,传递给servlet, 缓存

* b:) post与get的不一样之处在于post的参数不是放在URL字串里面,而是放在http请求的正文内。服务器

*/网络

// url对象表示的是一个指定的资源app

URL url = new URL("http://localhost:8080/TestHttpURLConnectionPro.do");tcp

// url对象的openConnection() 方法返回一个HttpURLConnection 对象,这个对象表示应用程序和url之间的通讯链接函数

HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();post

// 设置是否向httpUrlConnection输出,由于这个是post请求,参数要放在

// http正文内,所以须要设为true, 默认状况下是false;

urlConn.setDoOutput(true);

// 设置是否从httpUrlConnection读入,默认状况下是true;

urlConn.setDoInput(true);

// Post 请求不能使用缓存

urlConn.setUseCaches(false);

// 设定传送的内容类型是可序列化的java对象

// (若是不设此项,在传送序列化对象时,当WEB服务默认的不是这种类型时可能抛java.io.EOFException)

urlConn.setRequestProperty("Content-type","application/x-java-serialized-object");

// 设定请求的方法为"POST",默认是GET

urlConn.setRequestMethod("POST");

//创建和远程实际资源之间的实际链接,上面的这些属性要在connect()方法调用以前设置

urlConn.connect();

// 此处getOutputStream会隐含的进行connect (即:如同调用上面的connect()方法,若是是使用post请求

//能够不写urlConn.connect();

OutputStream outStrm = urlConn.getOutputStream();

// 如今经过输出流对象构建对象输出流对象,以实现输出可序列化的对象。

ObjectOutputStream oos = new ObjectOutputStream(outStrm);

// 向对象输出流写出数据,这些数据将存到内存缓冲区中

oos.writeObject(new String("我是测试数据"));

// 刷新对象输出流,将任何字节都写入潜在的流中(些处为ObjectOutputStream)

oos.flush();

// 关闭流对象。此时,不能再向对象输出流写入任何数据,先前写入的数据存在于内存缓冲区中,

// 再调用下边的getInputStream()函数时才把准备好的http请求正式发送到服务器

oos.close();

// 调用HttpURLConnection链接对象的getInputStream()函数,

// 将内存缓冲区中封装好的完整的HTTP请求电文发送到服务端。

InputStream inStrm = urlConn.getInputStream(); // <===注意,实际发送请求的代码段就在这里

//----------------------------------

/*

* Post传参的方法

*/

OutputStream os = urlConn.getOutputStream();

    String param = new String();

    param = "CorpID=123&LoginName=qqq&name=" + URLEncoder.encode("汉字","GBK"); ;

    os.write(param.getBytes());

    

//----------------------------------

    /*

     * 超时设置,防止 网络异常的状况下,可能会致使程序僵死而不继续往下执行

     */

    

    //JDK 1.5之前的版本,只能经过设置这两个系统属性来控制网络超时:

    //链接主机的超时时间(单位:毫秒)

    System.setProperty("sun.net.client.defaultConnectTimeout", "30000"); 

    //从主机读取数据的超时时间(单位:毫秒)

    System.setProperty("sun.net.client.defaultReadTimeout", "30000"); 

    //在JDK 1.5之后能够这样来设置超时时间

    HttpURLConnection urlCon = (HttpURLConnection)url.openConnection();

    urlCon.setConnectTimeout(30000);

    urlCon.setReadTimeout(30000);

    

//----------------------------------

    /*

     * 总结:

     * HttpURLConnection的connect()函数,实际上只是创建了一个与服务器的tcp链接,并无实际发送http请求。

     * 不管是post仍是get,http请求实际上直到HttpURLConnection的getInputStream()这个函数里面才正式发送出去。

     * 

     * 对HttpURLConnection对象的一切配置都必需要在connect()函数执行以前完成。

     * 而对outputStream的写操做,又必需要在inputStream的读操做以前。

     * 这些顺序其实是由http请求的格式决定的。

     * 

     * 在http头后面紧跟着的是http请求的正文,正文的内容是经过outputStream流写入的,

     * 实际上outputStream不是一个网络流,充其量是个字符串流,往里面写入的东西不会当即发送到网络,

* 而是存在于内存缓冲区中,待outputStream流关闭时,根据输入的内容生成http正文。

* 至此,http请求的东西已经所有准备就绪。在getInputStream()函数调用的时候,就会把准备好的http请求

* 正式发送到服务器了,而后返回一个输入流,用于读取服务器对于这次http请求的返回信息。因为http

* 请求在getInputStream的时候已经发送出去了(包括http头和正文),所以在getInputStream()函数

* 以后对connection对象进行设置(对http头的信息进行修改)或者写入outputStream(对正文进行修改)

* 都是没有意义的了,执行这些操做会致使异常的发生。

     * 

     */

 

 

*****************************urlconnection  get请求实例*******************

一、请求端代码

 

try{

// 请求地址

String parm="http://localhost:8080/music/user/delete.do?id=110&name=name";

// 建立url

URL url= new URL(parm);

// 使用httpurlconnection 进行请求的发送

HttpURLConnection con = (HttpURLConnection)url.openConnection();

// 设置相关属性,若是是post请求 请求参数在正文中因此容许输出流,若是是get        请求不用输出了由于参数是在url以后

con.setDoOutput(false);

// 响应数据的接受,因此咱们要容许输入流

con.setDoInput(true);

// 设置是否要缓存

con.setUseCaches(false);

//Java对象的序列化,进行流的传递

//con.setRequestProperty(URLEncoder.encode("Content-type","UTF-8"),URLEncoder.encode("application/x-java-serialized-object","UTF-8"));

    // 设置请求方式

con.setRequestMethod("GET");

//上面这些都是请求的一些属性的配置,也就是规则的定制

//创建一个tcp链接

con.connect();

// 接收请求响应数据

InputStream inStrm = con.getInputStream();

byte[] buffer= new byte[1024];

inStrm.read(buffer);

 // 编码设置

String body= new String(buffer,"UTF-8");

System.out.println("返回内容"+body.toString());

}catch(Exception e){

e.printStackTrace();

}

 

二、服务器端代码

// 完整的请求路径:url=http://localhost:8080/music/user/delete.do

@RequestMapping(value="/delete.do")

public void  delete(String id,String name,HttpServletResponse response,HttpServletRequest request){

System.out.println("请求到达 delete");

//userService.delUser(id);

String yid= id;

String yname=name;

System.out.println("请求参数id"+yid);

System.out.println("请求参数name:"+name);

try {

            // 请求响应数据

OutputStream output= response.getOutputStream();

response.setCharacterEncoding("UTF-8");

response.setContentType("text/html");

// 这里传递一个json 格式数据

JSONObject  json= new JSONObject();

json.put("id", 10);

json.put("name", "name");

String jstring= json.toString();

byte [] b= jstring.getBytes("UTF-8");

output.write(b);

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

 

*****************************urlconnection  post请求实例*******************

一、请求代码:

try{

// 建立url

URL url= new URL("http://localhost:8080/music/user/delete.do");

// 使用httpurlconnection 进行请求的发送

HttpURLConnection con = (HttpURLConnection)url.openConnection();

// 设置相关属性,若是是post请求 请求参数在正文中因此容许输出流,若是是get        请求不用输出了由于参数是在url以后

con.setDoOutput(true);

// 响应数据的接受,因此咱们要容许输入流

con.setDoInput(true);

// 设置是否要缓存

con.setUseCaches(false);

//Java对象的序列化,进行流的传递

//con.setRequestProperty(URLEncoder.encode("Content-type","UTF-8"),URLEncoder.encode("application/x-java-serialized-object","UTF-8"));

    // 设置请求方式

con.setRequestMethod("POST");

//上面这些都是请求的一些属性的配置,也就是规则的定制

//创建一个tcp链接

con.connect();

// 执行 tcp的链接上面的connect() 能够不执行

OutputStream outStrm = con.getOutputStream();

    //如今经过输出流对象构建对象输出流对象,以实现输出可序列化的对象。

ObjectOutputStream oos = new ObjectOutputStream(outStrm);

// 请求参数,post请求的参数在实体中因此使用这种方式

String param = new String();

// 请求参数这里 id前面没有& id 不到这是为何?、

param ="&id=123&name=王海东";

byte [] b=param.getBytes("UTF-8");

// 将请求参数写到缓存中

oos.writeObject(b);

//刷新流

oos.flush();

// 关闭流,释放资源

oos.close();

// 接收请求响应数据,其实http在这是才发送

InputStream inStrm = con.getInputStream();

byte[] buffer= new byte[1024];

inStrm.read(buffer);

 // 编码设置

String body= new String(buffer,"UTF-8");

System.out.println("返回内容"+body.toString());

}catch(Exception e){

e.printStackTrace();

}

 

2、服务器代码:

@RequestMapping(value="/delete.do")

public void  delete(String id,String name,HttpServletResponse response,HttpServletRequest request){

System.out.println("请求到达 delete");

//userService.delUser(id);

String yid= id;

String yname=name;

System.out.println("请求参数id"+yid);

System.out.println("请求参数name:"+name);

try { 

             // 响应输出流

OutputStream output= response.getOutputStream();

response.setCharacterEncoding("UTF-8");

response.setContentType("text/html");

// 这里传递一个json 格式数据

JSONObject  json= new JSONObject();

json.put("id", 10);

json.put("name", "name");

String jstring= json.toString();

byte [] b= jstring.getBytes("UTF-8");

output.write(b);

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

相关文章
相关标签/搜索