Android - 向服务器发送数据(POST) - HTTPClient.
该篇文章主要说明使用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的后面,我觉得很奇怪.
Android - 向服务器发送数据(POST) - HTTPClient.的更多相关文章
- Android - 向服务器发送数据(GET).
在此,使用HTTP协议,通过GET请求,向服务器发送请求,这种方式适合于数据量小,数据安全性要求不高的情况下. 一,服务器端,使用Servlet. 在服务器端,定义一个HttpServlet的子类,以 ...
- 使用post()方法以POST方式从服务器发送数据
使用post()方法以POST方式从服务器发送数据 与get()方法相比,post()方法多用于以POST方式向服务器发送数据,服务器接收到数据之后,进行处理,并将处理结果返回页面,调用格式如下: $ ...
- C语言Socket-单工通信(客户端向服务器发送数据)
服务端(server) #include <stdio.h> #include <winsock2.h> #pragma comment(lib,"ws2_32.li ...
- Android使用HttpClient以Post、Get请求服务器发送数据的方式(普通和json)
讲这个之前,我们先来说说get和post两种请求的区别吧!!! 1. GET提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连,如EditPosts.jsp?name=te ...
- Android使用HttpUrlConnection请求服务器发送数据详解
HttpUrlConnection是java内置的api,在java.net包下,那么,它请求网络同样也有get请求和post请求两种方式.最常用的Http请求无非是get和post,get请求可以获 ...
- Android 给服务器发送网络请求
今天听得有点蒙,因为服务器的问题,这边建立服务器的话,学长用的是Idea建立的Spring之类的方法去搞服务器. 然后就是用Android去给这个服务器发送请求,大致效果还是懂的,就是像网站发送请求, ...
- node中一个基本的HTTP客户端向本地的HTTP服务器发送数据
上一篇讲到了node可以轻松的向其他请求数据. 这一篇就来讲讲向本地服务器的数据交互. HTTP服务器代码,s.js var http=require("http"); var s ...
- android DatagramSocket send 发送数据出错
安卓4.0以后好像不能在主线程里面使用 socket 所以不管是发送数据还是接收数据需要新开一个了线程: 以下代码是我点击发送是代码: new Thread(new Runnable() { @Ove ...
- Android解析服务器Json数据实例
Json数据信息如下: { "movies": [ { "movie": "Avengers", "year": 201 ...
随机推荐
- c#生成注册码的两种方法(mac地址与IP地址)
using System; using System.Management; using System.Security.Cryptography; using System.IO; using Sy ...
- 【Node】fs
var fs = require('fs') // fs 文件系统 var stdin = process.stdin var stdout = process.stdout var stats = ...
- Unity3D之Character Controller(CC)与GameObject的碰撞方法
先来一部分网上常见的内容(略整理): --------------------分隔线---------------------- Unity3d中参与碰撞的物体分2种类型: 一.发起碰撞的物体. 二. ...
- (转载)AS3.0实例学习 熟悉新的事件机制和addChild的运用
(转载)http://www.jb51.net/article/13139.htm 首先声明:本人大菜鸟一个,刚接触AS3不久,许多理念还没来得及灌输,这些case都是从网上down的,但因为解说是英 ...
- LCD framebuffer驱动设计文档
内容提要:1. android display相关的名词2. 调试LCD驱动需要注意的步骤3. 关于帧缓冲区及I/O内存---------------------------------------- ...
- Android基于XMPP Smack Openfire下学习开发IM(六)总结
不管学习什么都应该总结 这里我把关于Xmpp的一些方法整理到一个工具类中了 我就分享给大家 XmppConnection.java package com.techrare.utils; import ...
- 【LeetCode】Binary Tree Level Order Traversal II
Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from left ...
- OGG 单表初始化操作步骤
有时候ogg两端数据不一致,且数据量较大,手工修改比较复杂的情况下,我们需要对这些表进行初始化.初始化的大概思路是: 1. 停止两端OGG 2. 如果业务不可以停很长时间,就需要配置目标端进程,暂停这 ...
- iOS UITextField 输入字数限制的实现
首先你的ViewController需要实现 UITextFieldDelegate 代理, 其次,需要字数限制的UITextField实例的代理要设置成 self(ViewController) 然 ...
- Java三大主流框架概述(转载)
转自:http://www.douban.com/note/320140839/ Struts.Hibernate和Spring是我们Java开发中的常用关键,他们分别针对不同的应用场景给出最合适的解 ...