该篇文章主要说明使用Apache提供的HTTPClient,通过post方式,向服务器发送数据.由于有些东西在 Android - 向服务器发送数据(GET) 中提到过,就不再重复.
一,Android客户端的业务逻辑层:
package spt.http.post; import java.io.IOException; import java.net.MalformedURLException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import org.apache.http.HttpResponse; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.message.BasicNameValuePair; import android.os.Handler; import android.util.Log; /** * 用户向服务器端发送数据的类(使用post)方法. * * @author Administrator * */ public class PostSender { // 连接服务器的url. private static final String URL = "http://192.168.1.101:8080/ReceiveAndroid/ServletForPostMethod"; // 标识是否连接到服务器成功. public static final int SEND_SUCCESS = 1; public static final int SEND_FAIL = 0; private Handler handler = null; //新线程关联的Handler,用于将是否发送成功的标识Message放到消息队列中. public PostSender(Handler handler) { this.handler = handler; } /** * 往服务器发送数据. * * @param name * @param pwd */ public void send(String name, String pwd) { // 这里params要传递到另外一个方法,加final为了防止被修改. final Map<String, String> params = new HashMap<String, String>(); params.put("name", name); params.put("pwd", pwd); // 启动新的线程连接服务器. new Thread(new Runnable() { @Override public void run() { // 请求连接. try { if (postSend(params, URL, "utf-8")) handler.sendEmptyMessage(SEND_SUCCESS); else handler.sendEmptyMessage(SEND_FAIL); } catch (MalformedURLException e) { Log.d("sysout", "run:MalformedURLException" + e.getMessage()); } catch (IOException e) { Log.d("sysout", "run:IOException" + e.getMessage()); } } }).start(); } /** * 发送post请求的方法. * * @param params * 请求参数的键-值对. * @param url * @param encoding * 使用指定编码对参数值进行编码. * @return * @throws MalformedURLException * @throws IOException */ private boolean postSend(Map<String, String> params, String url, String encoding) throws MalformedURLException, IOException { // 封装请求参数的键值对. List<BasicNameValuePair> pairs = new ArrayList<BasicNameValuePair>(); for (Entry<String, String> param : params.entrySet()) { pairs.add(new BasicNameValuePair(param.getKey(), param.getValue())); } //封装请求参数的实体. UrlEncodedFormEntity entity = new UrlEncodedFormEntity(pairs, encoding); //使用post请求. HttpPost post = new HttpPost(url); post.setEntity(entity); //使用DefaultHttpClient指定请求,以获取响应信息. DefaultHttpClient client = new DefaultHttpClient(); HttpResponse response = client.execute(post); return response.getStatusLine().getStatusCode() == 200; // 等于200表示发送成功. } }
二,服务器端的Servlet,重写doPost方法:
package spt.servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/ServletForPostMethod") public class ServletForPostMethod extends HttpServlet{ /** * */ private static final long serialVersionUID = 1L; @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("enter...post"); String name = req.getParameter("name"); String pwd = req.getParameter("pwd"); System.out.println("name=" + name); System.out.println("pwd=" + pwd); } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // System.out.println("enter...get"); // String name = req.getParameter("name"); // String pwd = req.getParameter("pwd"); // System.out.println("name=" + name); // System.out.println("pwd=" + pwd); } }
另外,途中,我连几个小时的Tomcat服务器,后来通过log过滤,发现自己的问题,所以建议多使用log捕获异常信息.我在网上看到有位网友,使用HTTP进行post连接的时候,对url的处理和get一样,都是将参数拼接在原有url的后面,我觉得很奇怪.