Android POST方式提交数据

android虽然内置了apache的HttpClient组件来实现客户端向服务器端提交数据,为了便于理解其底层原理,下面例子是通过URL获得Connection,并获得其输出流向服务器发送数据

1.新建一个web项目TestAndroid,我用到了struts2,引入相应的jar包,只需几个核心包就够了,多了容易报错,它们分别是
commons-logging-1.0.4.jar
freemarker-2.3.15.jar
ognl-2.7.3.jar
struts2-core-2.1.8.1.jar
xwork-core-2.1.6.jar
commons-fileupload-1.2.1.jar

2.新建一个action

package com.lamp.action;

public class LoginAction{
private String id = null;
private String name = null;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String execute() throws Exception {
System.out.println(this.id + this.name);
return "success";
}
}



3.在struts.xml中对action进行相应配置

<package name="lamp" extends="struts-default">
<action name="login" class="com.lamp.action.LoginAction">
<result name="success">/WEB-INF/page/success.jsp</result>
<result name="error">/WEB-INF/page/error.jsp</result>
</action>
</package>


4.最后在web.xml中对struts进行启动配置

<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
</filter>

<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>


至此web配置完成

5.新建一个android工程,并编写一个工具类实现向服务器端发送数据

package com.lamp.util;

import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Map;

public class NetTool {

/**
*
* @param urlPath 请求路径
* @param params Map中key为请求参数,value为请求参数的值
* @param encoding 编码方式
* @return
* @throws Exception
*/

//通过post向服务器端发送数据,并获得服务器端输出流
public static InputStream getInputStreamByPost(String urlPath,Map<String,String> params,String encoding) throws Exception{
StringBuffer sb = new StringBuffer();
for(Map.Entry<String,String> entry:params.entrySet()){
sb.append(entry.getKey()).append("=").append(URLEncoder.encode(entry.getValue(), encoding));
sb.append("&");
}
String data = sb.deleteCharAt(sb.length()-1).toString();
URL url = new URL(urlPath);
//打开连接
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
//设置提交方式
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setRequestMethod("POST");
//post方式不能使用缓存
conn.setUseCaches(false);
conn.setInstanceFollowRedirects(true);
//设置连接超时时间
conn.setConnectTimeout(6*1000);
//配置本次连接的Content-Type,配置为application/x-www-form-urlencoded
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
//维持长连接
conn.setRequestProperty("Connection", "Keep-Alive");
//设置浏览器编码
conn.setRequestProperty("Charset", "UTF-8");
DataOutputStream dos = new DataOutputStream(conn.getOutputStream());
//将请求参数数据向服务器端发送
dos.writeBytes(data);
dos.flush();
dos.close();
if(conn.getResponseCode() == 200){
//获得服务器端输出流
return conn.getInputStream();
}
return null;
}

//通过输入流获得字节数组
public static byte[] readStream(InputStream is) throws Exception {
byte[] buffer = new byte[1024];
ByteArrayOutputStream bos = new ByteArrayOutputStream();
int len = 0;
while((len=is.read(buffer)) != -1){
bos.write(buffer, 0, len);
}
is.close();
return bos.toByteArray();
}

}



6.编写一个测试类

package com.lamp.activity;


import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;

import android.test.AndroidTestCase;
import android.util.Log;

import com.lamp.util.NetTool;

public class TestPostData extends AndroidTestCase {
private static final String TAG = "TestPostData";
public void test() throws Exception {
//请求参数键-值对
Map<String,String> map = new HashMap<String,String>();
map.put("id", "123456");
map.put("name", "李四");
//服务器请求路径
String urlPath = "http://ip地址:8080/TestAndroid/login";
InputStream is = NetTool.getInputStreamByPost(urlPath, map, "UTF-8");
byte[] data = NetTool.readStream(is);
Log.i(TAG, new String(data));
}

}



记得要在AndroidManifest.xml文件中注册访问网络权限以及单元测试所需的配置

<!-- 注册访问网络权限 -->
<uses-permission android:name="android.permission.INTERNET"/>


首先将建立的web项目在应用服务器中部署并运行起来,然后在android工程中运行单元测试我们可以看到在web端得到了客户端发送过来的数据,而且客户端也得到了服务器端发送过来的数据
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值