android利用post方式与web服务器通信

 接上篇get方式,本文介绍post方式与服务器通信。调用两种类来实现post。
 一个与get方法一样调用Url与HttpUrlConnection类,利用输入输出流方式,利用ObjectInputStream()函数进行**对象**读写。
 另一个利用HttpPost(url)与HttpResponse类来实现。
 先介绍第一种,对象写入后台一本书的信息,book类(定义很简单)。
 android客户端:记得**设置**相应参数(post)
     Book book = new Book();
        book.setBookName("Android高级编程");
        book.setAuthor("Reto Meier");
        book.setPages(398);
        book.setPrice(59.00);
        URL url = null;
        ObjectOutputStream oos = null;

                        try {
            url = new URL("http://10.0.2.2:8080/ServerTest/TestServlet");
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setDoInput(true);
            connection.setDoOutput(true);
            connection.setConnectTimeout(10000);
            connection.setReadTimeout(10000);
            connection.setRequestMethod("POST");
            oos = new ObjectOutputStream(connection.getOutputStream());
            oos.writeObject(book);
            InputStreamReader read = new InputStreamReader(connection.getInputStream());
            BufferedReader br = new BufferedReader(read);
            String line = br.readLine();
            //String line = "";
            //while ((line = br.readLine()) != null) {
            //  Log.d("TAG", "line is " + line);
            //}//估计是为了确保读取全部信息
            System.out.println("获得信息:"+line);
            br.close();
            connection.disconnect();
        } catch (Exception e) {
            System.out.println("错误信息:"+e.getMessage());
            e.printStackTrace();
        } finally {

        }

服务器端:

public class TestServlet extends HttpServlet {

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        ObjectInputStream ois = null;
        try {
            ois = new ObjectInputStream(request.getInputStream());
            Book book = (Book) ois.readObject();
            System.out.println("书名是: " + book.getBookName());
            System.out.println("作者是: " + book.getAuthor());
            System.out.println("价格是: " + book.getPrice());
            System.out.println("页数是: " + book.getPages());
            PrintWriter out = response.getWriter();
            //out.print("success");//客户端接受为“android”
            out.write("success!");//客户端接受为“android!”很神奇吧~~
            out.flush();
            out.close();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            ois.close();
        }
    }
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

    }
}

方法一总结:基本跟java中的socket通信完全一样,前台两行代码,new url ,getConnection,然后操作输入输出流。后台利用response,request获得输入输出流。
第二种方式直接利用HttpPost类,不需再另外设置post方法。使用org.apache.http.*的一些类实现编码和参数设置。

try{
            HttpPost request=new HttpPost(URL);
            List params=new ArrayList();
            params.add(new BasicNameValuePair("username","lg"));
            params.add(new BasicNameValuePair("password","123"));
            request.setEntity(new UrlEncodedFormEntity(params,HTTP.UTF_8));
            HttpResponse response=new DefaultHttpClient().execute(request);
            String msg=EntityUtils.toString(response.getEntity());
            System.out.println("返回消息:"+msg);
        }catch(Exception e){
            e.printStackTrace();
        }

服务器端代码跟get方式的后台程序完成相同,只不过在doPost()方法实现。
方法二总结:利用NameValuePair类来设置类似java中map的方式来绑定键值数据,再利用Entity来设置实体传递对象。利用DefaultHttpClient类来实现联网操作,返回HttpResponse的数据体。
****************通信方式总结**********
这些天研究了socket和http通信的原理,发现正在联网传递的代码也就几行而已。socket中的输入输出流,web服务器端的request.getInputStream与response.getWriter操作。根据传输内容分简单字符串和类的实例等不同来调用不同的类。
实在是java关于网络传输的部分太不熟悉了,导致android通信部分学习的很慢。

你可能感兴趣的:(android开发,android,服务器)