Android访问WCF服务(使用json实现参数传递)
16lz
2021-12-09
经过多日努力, 终于勉强弄明白了Android访问WCF服务的方法.
服务端实现
一, 实现服务.
操作契约
[csharp] view plain copy- [ServiceContract]
- publicinterfaceIService
- {
- [OperationContract]
- [WebInvoke(
- BodyStyle=WebMessageBodyStyle.WrappedRequest,
- ResponseFormat=WebMessageFormat.Json,
- RequestFormat=WebMessageFormat.Json)]
- stringgetMsg();
- [OperationContract]
- [WebInvoke(
- BodyStyle=WebMessageBodyStyle.WrappedRequest,
- ResponseFormat=WebMessageFormat.Json,
- RequestFormat=WebMessageFormat.Json)]
- stringsetMsg(stringmsg);
- [OperationContract]
- [WebInvoke(
- BodyStyle=WebMessageBodyStyle.WrappedRequest,
- ResponseFormat=WebMessageFormat.Json,
- RequestFormat=WebMessageFormat.Json)]
- DatagetData();
- [OperationContract]
- [WebInvoke(
- BodyStyle=WebMessageBodyStyle.WrappedRequest,
- ResponseFormat=WebMessageFormat.Json,
- RequestFormat=WebMessageFormat.Json)]
- DatasetData(Datadata);
- }
以上的服务包含了不带参数和带参数访问的形式. 其中Data类的定义如下
[csharp] view plain copy- [DataContract]
- publicclassData
- {
- [DataMember(Name="Name")]
- publicstringName{get;set;}
- [DataMember(Name="age")]
- publicintage{get;set;}
- [DataMember(Name="msg")]
- publicstringmsg{get;set;}
- [DataMember(Name="array")]
- publicstring[]array{get;set;}
- }
实现服务类
[csharp] view plain copy- usingSystem;
- usingSystem.Collections.Generic;
- usingSystem.Linq;
- usingSystem.Runtime.Serialization;
- usingSystem.ServiceModel;
- usingSystem.Text;
- namespaceHost
- {
- //注意:使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的类名“Service”。
- publicclassService:IService
- {
- #regionIServiceMembersgetMsg
- publicstringgetMsg()
- {
- Console.WriteLine("getMsgservicehasbeanstatred!");
- returnstring.Format("现在服务器时间{0}",DateTime.Now);
- }
- #endregion
- #regionIServiceMemberssetMsg
- publicstringsetMsg(stringmsg)
- {
- Console.WriteLine("setMsgservicehasbeanstarted!");
- returnstring.Format("现在服务器时间{0},消息内容{1}",DateTime.Now,msg);
- }
- #endregion
- #regionIServiceMembersgetData
- publicDatagetData()
- {
- Console.WriteLine("getDataservicehasbeanstarted!");
- Datadata=newData();
- data.Name="MushService";
- data.age=20;
- data.msg="Thisisadataformservice_HelloData";
- data.array=newstring[3]{"string1","string2","string3"};
- returndata;
- }
- #endregion
- #regionIServiceMemberssetData
- publicDatasetData(Datadata)
- {
- Console.WriteLine("setDataservicehasbeanstarted!");
- data.msg="ThisMSGhasbeanchangedbyservice!!!";
- returndata;
- }
- #endregion
- }
- }
二, 配置服务
在配置文件的behaviors结点下增加如下内容
[html] view plain copy- <endpointBehaviors>
- <behaviorname="json">
- <enableWebScript/>
- </behavior>
- </endpointBehaviors>
修改默认终结点配置
[html] view plain copy- <endpointbinding="webHttpBinding"contract="Host.IService"behaviorConfiguration="json">
- <identity>
- <dnsvalue="localhost"/>
- </identity>
- </endpoint>
三, 实现自我寄宿
- staticvoidMain(string[]args)
- {
- using(ServiceHosthost=newServiceHost(typeof(Host.Service)))
- {
- host.Open();
- Console.WriteLine("Hostisstarted!!!PressanyENTERtostop.");
- Console.ReadLine();
- host.Close();
- }
- }
Android客户端实现
在Android客户端需要按照数据契约规定的数据类型实现一个数据类
[java] view plain copy- publicclassData{
- privateStringName;
- privateintage;
- privateStringmsg;
- privateString[]array;
- publicStringgetName(){
- returnName;
- }
- publicvoidsetName(Stringname){
- Name=name;
- }
- publicintgetAge(){
- returnage;
- }
- publicvoidsetAge(intage){
- this.age=age;
- }
- publicStringgetMsg(){
- returnmsg;
- }
- publicvoidsetMsg(Stringmsg){
- this.msg=msg;
- }
- publicString[]getArray(){
- returnarray;
- }
- publicvoidsetArray(String[]array){
- this.array=array;
- }
- }
然后结合实际情况编写事物层代码
以下给出一个带参访问web服务的常见用法
[java] view plain copy- /**
- *@paramurl服务的完整地址
- *@paramdata数据对象
- *@paramcontentTypeRequest的ContentType
- *@return返回的json字符串
- */
- publicStringdoPost(Stringurl,Datadata,StringcontentType){
- StringstrResp="";
- HttpPostrequest=newHttpPost(url);
- request.setHeader("Accept","application/json");
- request.setHeader("Content-type","application/json");
- //组织json
- JSONStringervehicle;
- try{
- vehicle=newJSONStringer().object().key("data").object()
- .key("Name").value(data.getName()).key("age").value(data.getAge())
- .key("array").value(data.getArray()).key("msg").value(data.getMsg())
- .endObject().endObject();
- StringEntityentity=newStringEntity(vehicle.toString());
- request.setEntity(entity);
- //向WCF服务发送请求
- DefaultHttpClienthttpClient=newDefaultHttpClient();
- HttpResponseresponse=httpClient.execute(request);
- //判断是否成功
- if(response.getStatusLine().getStatusCode()==HttpURLConnection.HTTP_OK)
- strResp=EntityUtils.toString(response.getEntity());
- Log.d("WebInvoke","Saving:"
- +response.getStatusLine().getStatusCode());
- }catch(Exceptione){
- //TODOAuto-generatedcatchblock
- e.printStackTrace();
- }
- //Reloadplatenumbers
- returnstrResp;
- }
判断访问web服务是否成功通过
[java] view plain copy- response.getStatusLine().getStatusCode()==HttpURLConnection.HTTP_OK
即可
源码下载:
WCF服务端.
Android客户端.
http://blog.csdn.net/btyh17mxy/article/details/7993111
更多相关文章
- 基于Apache mina 的android 客户端tcp长连接实现
- Android基于基于布局嵌套的页面导航实现
- 浅析android通过jni控制service服务程序的简易流程
- struts2中获取request、response,与android客户端进行交互
- Android网络通信(2):HTTP通信
- 《Android和PHP最佳实践》官方站
- 基于MQTT实现Android消息推送(Push)
- 浅谈Java中Collections.sort对List排序的两种方法
- python list.sort()根据多个关键字排序的方法实现