package com.siwuxie095.post; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; public class TestPost { /** * 先创建一个URL,打开连接, * 将 URLConnection 转换成 HttpURLConnection * 设置连接的所有参数:字符集、可以输入输出、请求方法 * 接着获取输出流,将向服务器传输的数据一次性写出 * 写出之后再获取输入流,再从输入流中读取数据 * * @param args */ public static void main(String[] args) { //调用线程:ReadByPost 使用匿名对象 new ReadByPost().start(); } } //创建一个线程:ReadByPost class ReadByPost extends Thread{ //复写 run()方法 @Override public void run() { try { //创建一个URL对象,属于 java.net 包中的 //传入一个网络连接的地址 //使用Post方法来读取Http数据,传入的URL地址和Get方法不同 // //(1)「http://fanyi.youdao.com/openapi.do」 是真实的URL,单纯的网址 //(2)而问号?后面的 「keyfrom=siwuxie095...要翻译的文本」 都是向服务器传输的数据, // 使用网络连接的输出流进行输出 // //整合在一起就是一个整体的URL,不过这里传入(1) //有异常抛出,使用 try catch 捕获 URL url=new URL("http://fanyi.youdao.com/openapi.do"); //使用openConnection()方法打开链接 //返回值是URLConnection类型,因为是使用Post方法, //需要创建一个HttpURLConnection 接收返回值 //HttpURLConnection 继承自URLConnection,需要强制类型转换 //同样是 java.net 包中的类 //有异常抛出,用 try catch 捕获 HttpURLConnection connection=(HttpURLConnection) url.openConnection(); //为 connection 设置参数: //(注意:将所有参数设置完毕后再做其他操作) //设置编码为 UTF-8 connection.addRequestProperty("encoding", "UTF-8"); //使用 setDoInput() 传入 true,则当前的 connection 就能从网络获取数据 connection.setDoInput(true); //同样将 setDoOutput()也设置为 true,就可以向服务器传输数据 connection.setDoOutput(true); //将 connection 的访问方式设置为Post connection.setRequestMethod("POST"); //connection建立连接之后,要先获取输出流和再获取输出流 //获取输出流,创建OutputStream接收返回值 OutputStream os=connection.getOutputStream(); //包装 OutputStreamWriter osw=new OutputStreamWriter(os); //再包装 BufferedWriter bw=new BufferedWriter(osw); //先对服务器进行输出(向服务器传输数据,发送请求) //使用BufferedWriter的write()方法,这里传入(2),前面加不加 问号 ? 均可 //指定doctype的类型为 XML,翻译:welcome bw.write("keyfrom=siwuxie095-test&key=2140200403&type=data&" + "doctype=xml&version=1.1&q=welcome"); //强制输出 flush bw.flush(); //获取输入流,创建InputStream接收返回值 InputStream is=connection.getInputStream(); //包装 InputStreamReader isr=new InputStreamReader(is); //再包装 BufferedReader br=new BufferedReader(isr); //接着读取数据(读取从服务器返回的XML数据) String line; StringBuilder builder=new StringBuilder(); //如果line不为空,将其填充到builder中 while ((line=br.readLine())!=null) { builder.append(line); } //读取完毕,关闭流 bw.close(); br.close(); osw.close(); isr.close(); os.close(); is.close(); //输出读取到的数据 System.out.println(builder.toString()); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } |