第一步:我这里新建了一个android2.2版本的AVD..运行软件同样适用Eclispe;
第二步:新建android解决方案,这几记住在选择平台的时候就要选择我们刚才的2.2版本...因为我们在此项目中需要用json的解析,虽然在android平台下已经为我们提供了json的解析包,但是需要在android3.0以上版本我们才能适用,对此我们需要自己构建json数据的解析包,还好Google已经为我们写好了一个比较优秀开源的json数据解析包,在这个网站查看下载:点击查看,下载此包:gson-1.6.jar,将包导入到工程项目中:
第四步,我们新建学生实体类:
package com.wxl.wcftest; /** * 学生实体类 * @author * */ public class Sutdent { /** * 姓名 */ private String name; /** * 生日 */ private String dayOfbirth; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getDayOfbirth() { return dayOfbirth; } public void setDayOfbirth(String dayOfbirth) { this.dayOfbirth = dayOfbirth; } @Override public String toString() { return "Sutdent [name=" + name + ", dayOfbirth=" + dayOfbirth + "]"; } }
第五步:我们新建一个用户连接服务的管理类,里面用两种方法(POST/GET)进行服务的连接,代码解释很到位不废话
package com.wxl.wcftest; import java.io.File; import java.io.IOException; import java.util.Iterator; import java.util.List; import java.util.Map; import org.apache.http.HttpResponse; import org.apache.http.NameValuePair; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.HttpClient; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.client.params.HttpClientParams; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.params.BasicHttpParams; import org.apache.http.params.HttpConnectionParams; import org.apache.http.params.HttpParams; import org.apache.http.params.HttpProtocolParams; import org.apache.http.protocol.HTTP; import org.apache.http.util.EntityUtils; import android.util.Log; public class HttpGetAndPost { // 定义变量 private HttpParams httpParams; private HttpClient httpClient; private String baseUrl=""; public HttpGetAndPost(String _url,String _extent) { baseUrl=_url; baseUrl+=File.separatorChar+_extent; Log.i("mylog", baseUrl); } /** * Get获取 * * @param baseUrl * 域名 * @param params * 参数集合 * @return * 返回的字符串 */ public String doGet(Map params) { /* 建立HTTPGet对象 */ String paramStr = ""; Iterator iter = params.entrySet().iterator(); while (iter.hasNext()) { Map.Entry entry = (Map.Entry) iter.next(); Object key = entry.getKey(); Object val = entry.getValue(); paramStr += paramStr =File.separatorChar + key.toString() + File.separatorChar + val.toString(); Log.i("mylog1111111111", paramStr); } if (!paramStr.equals("")) { baseUrl += paramStr; Log.i("mylog", baseUrl); } HttpGet httpRequest = new HttpGet(baseUrl); String strResult = "doGetError"; try { /* 发送请求并等待响应 */ HttpResponse httpResponse = httpClient.execute(httpRequest); /* 若状态码为200 ok */ if (httpResponse.getStatusLine().getStatusCode() == 200) { /* 读返回数据 */ strResult = EntityUtils.toString(httpResponse.getEntity()); } else { strResult = "Error Response: " + httpResponse.getStatusLine().toString(); } } catch (ClientProtocolException e) { strResult = e.getMessage().toString(); e.printStackTrace(); } catch (IOException e) { strResult = e.getMessage().toString(); e.printStackTrace(); } catch (Exception e) { strResult = e.getMessage().toString(); e.printStackTrace(); } Log.v("strResult", strResult); return strResult; } /** * Post方式访问页面 * @param baseUrl * 地址 * @param params * 参数 * @return */ public String doPost(List<NameValuePair> params) { /* 建立HTTPPost对象 */ HttpPost httpRequest = new HttpPost(baseUrl); String strResult = "doPostError"; try { /* 添加请求参数到请求对象 */ httpRequest.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8)); /* 发送请求并等待响应 */ HttpResponse httpResponse = httpClient.execute(httpRequest); /* 若状态码为200 ok */ if (httpResponse.getStatusLine().getStatusCode() == 200) { /* 读返回数据 */ strResult = EntityUtils.toString(httpResponse.getEntity()); } else { strResult = "Error Response: " + httpResponse.getStatusLine().toString(); } } catch (ClientProtocolException e) { strResult = e.getMessage().toString(); e.printStackTrace(); } catch (IOException e) { strResult = e.getMessage().toString(); e.printStackTrace(); } catch (Exception e) { strResult = e.getMessage().toString(); e.printStackTrace(); } Log.v("strResult", strResult); return strResult; } public HttpClient getHttpClient() { // 创建 HttpParams 以用来设置 HTTP 参数(这一部分不是必需的) this.httpParams = new BasicHttpParams(); // 设置连接超时和 Socket 超时,以及 Socket 缓存大小 HttpConnectionParams.setConnectionTimeout(httpParams, 20 * 1000); HttpConnectionParams.setSoTimeout(httpParams, 20 * 1000); HttpConnectionParams.setSocketBufferSize(httpParams, 8192); // 设置重定向,缺省为 true HttpClientParams.setRedirecting(httpParams, true); // 设置 user agent String userAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.2) Gecko/20100115 Firefox/3.6"; HttpProtocolParams.setUserAgent(httpParams, userAgent); // 创建一个 HttpClient 实例 // 注意 HttpClient httpClient = new HttpClient(); 是Commons HttpClient // 中的用法,在 Android 1.5 中我们需要使用 Apache 的缺省实现 DefaultHttpClient httpClient = new DefaultHttpClient(httpParams); return httpClient; } }
第六步、我们写一个方法用户json数据的解析:
package com.wxl.wcftest; import java.io.StringReader; import android.util.Log; import com.google.gson.stream.JsonReader; public class JsonManger { public Sutdent parse(String jsonData) { Sutdent json=new Sutdent(); //新建jsonRead对象 JsonReader jsonReader=new JsonReader(new StringReader(jsonData)); try { while(jsonReader.hasNext()) { //开始读数据 jsonReader.beginObject(); while(jsonReader.hasNext()) { String tageName=jsonReader.nextName(); if(tageName.equals("Name")) { json.setName(jsonReader.nextString()); } else if(tageName.equals("DayOfbirth")) { json.setDayOfbirth(jsonReader.nextString()); } } } jsonReader.endObject(); } catch (Exception e) { Log.i("tageName", e.toString()); e.printStackTrace(); } return json; } }
第七步、我们view就建立一个页面来显示数据,呵呵..很简单,晒下代码:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="WCF服务提供数据解析" /> <TextView android:id="@+id/myMessage" android:layout_width="fill_parent" android:layout_height="wrap_content" /> </LinearLayout>
第八步、我们调用此服务并作解析,将解析后的数据显示到页面中的textView中:
package com.wxl.wcftest; import java.io.File; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.http.NameValuePair; import org.apache.http.message.BasicNameValuePair; import android.app.Activity; import android.os.Bundle; import android.widget.TextView; public class AndroidwcfActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); TextView myTextView=(TextView)findViewById(R.id.myMessage); //新建http对象 HttpGetAndPost myhttAndPost=new HttpGetAndPost("http://192.168.1.119:4600"+File.separatorChar +"json","Sutdent"); //定义参数 List<NameValuePair> params = new ArrayList<NameValuePair>(); params.add(new BasicNameValuePair("周润发", "1980-2-14")); //定义参数 Map params2 = new HashMap(); params2.put("周润发", "1980-2-14"); myhttAndPost.getHttpClient(); String jsonStr=myhttAndPost.doGet(params2); //新建json管理 JsonManger parseJson = new JsonManger(); Sutdent json = parseJson.parse(jsonStr); myTextView.setText("名字:"+json.getName()+" 年龄:"+json.getDayOfbirth()); } }
说明几点,为了保持服务的公用性,我将此服务发布到为了我们的服务其上,地址就是上面的192.168.1.119:4600了;
既然访问网络在android里面需要我们专门的配置权限,在AndroidManifest.xml文件中加入权限:
<uses-permission android:name="android.permission.INTERNET" />
好了,到此我们已经完成客户端的建立,我们运行下看看,是否能成功访问我们自己建立的wcf服务:
嘿嘿...成功了,至此我们已经完成了wcf数据的服务的搭建工作,当然这只是简单的文本数据信息交换,为了完成文件的
上传和下载,不免的我们要使用流传输...下一篇中我们尝试用sream和wcf服务端进行交互,来实现文件的上传和下载。
源码点此下载