您的位置:首页 > 移动开发 > Android开发

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

2015-04-14 19:56 344 查看
接上篇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<NameValuePair> params=new ArrayList<NameValuePair>();
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的数据体。

[b]****************[/b]通信方式总结[b]**********[/b]

这些天研究了socket和http通信的原理,发现正在联网传递的代码也就几行而已。socket中的输入输出流,web服务器端的request.getInputStream与response.getWriter操作。根据传输内容分简单字符串和类的实例等不同来调用不同的类。

实在是java关于网络传输的部分太不熟悉了,导致android通信部分学习的很慢。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android 服务器