通过HttpClient请求webService 


由于服务端是用webService开发的,android要调用webService服务获取数据,这里采用的是通过HttpClient发送post请求,获取webService数据。


 


服务端使用的webService框架是axis2,请求数据之前,要封装一个xml格式,再通过post请求,获取服务端数据。


请求的xml格式如下所示: 



​1​

​<​​​​soap:Envelope​​ ​​xmlns:soap​​​​=​​​​"http://www.w3.org/2003/05/soap-envelope"​​​​xmlns:sam​​​​=​​​​"http://user.service.xxx.com"​​​​>​


​2​

​<​​​​soap:Header​​​​/>​


​3​

​<​​​​soap:Body​​​​>​


​4​

​<​​​​sam:getUserInfo​​​​>​


​5​

​<​​​​sam:userName​​​​>sunlightcs</​​​​sam:userName​​​​>​


​6​

​</​​​​sam:getUserInfo​​​​>​


​7​

​</​​​​soap:Body​​​​>​


​8​

​</​​​​soap:Envelope​​​​>​


其中:getUserInfo是方法名,userName是参数名,当然,还可以加多个参数。


 


 


下面的代码是向webService发送请求,获取数据,返回的数据是xml形式的,android只要解析xml数据,就可以获得想要的数据了。 




​01​

​import​​ ​​java.io.IOException;​


​02​

​import​​ ​​java.io.OutputStream;​


​03​

​import​​ ​​java.io.OutputStreamWriter;​


​04​

​import​​ ​​java.io.Writer;​


​05​

 


​06​

​import​​ ​​org.apache.http.HttpResponse;​


​07​

​import​​ ​​org.apache.http.client.HttpClient;​


​08​

​import​​ ​​org.apache.http.client.methods.HttpPost;​


​09​

​import​​ ​​org.apache.http.entity.ContentProducer;​


​10​

​import​​ ​​org.apache.http.entity.EntityTemplate;​


​11​

​import​​ ​​org.apache.http.impl.client.DefaultHttpClient;​


​12​

​import​​ ​​org.apache.http.util.EntityUtils;​


​13​

 


​14​

 


​15​

​public​​ ​​class​​ ​​ClientTest {​


​16​

 


​17​

​public​​ ​​static​​ ​​void​​ ​​main(String[] args) {​


​18​

​ClientTest.httpClientPost();​


​19​

​}​


​20​

 


​21​

​private​​ ​​static​​ ​​void​​ ​​httpClientPost() {​


​22​

​HttpClient client = ​​​​new​​ ​​DefaultHttpClient();​


​23​

​HttpPost post = ​​​​new​​​​HttpPost(​​​​"http://localhost:8080/xxx/services/userService"​​​​);​


​24​

 


​25​

​try​​ ​​{​


​26​

​ContentProducer cp = ​​​​new​​ ​​ContentProducer() {​


​27​

​public​​ ​​void​​ ​​writeTo(OutputStream outstream) ​​​​throws​​​​IOException {​


​28​

​Writer writer = ​​​​new​​ ​​OutputStreamWriter(outstream,​​​​"UTF-8"​​​​);​


​29​

 


​30​

​/**​


​31​

​* 获取请求的xml格式数据​


​32​

​*/​


​33​

​String requestXml = getRequestXml();​


​34​

​writer.write(requestXml);​


​35​

​writer.flush();​


​36​

​}​


​37​

​};​


​38​

 


​39​

​post.setEntity(​​​​new​​ ​​EntityTemplate(cp));​


​40​

​HttpResponse response = client.execute(post);​


​41​

 


​42​

​//打印返回的xml数据​


​43​

​System.out.println(EntityUtils.toString(response.getEntity()));​


​44​

​} ​​​​catch​​ ​​(IOException e) {​


​45​

​e.printStackTrace();​


​46​

​}​


​47​

​}​


​48​

 


​49​

 


​50​

​private​​ ​​static​​ ​​String getRequestXml(){​


​51​

​StringBuilder sb = ​​​​new​​ ​​StringBuilder(​​​​"<soap:Envelope xmlns:soap=\"http://www.w3.org/2003/05/soap-envelope\" xmlns:sam=\"http://user.service.xxx.com\">"​​​​);​


​52​

​sb.append(​​​​"<soap:Header/>"​​​​);​


​53​

​sb.append(​​​​"<soap:Body>"​​​​);​


​54​

​sb.append(​​​​"<sam:getUserInfo>"​​​​);​


​55​

​sb.append(​​​​"<sam:userName>sunlightcs</sam:userName>"​​​​);​


​56​

​sb.append(​​​​"</sam:getUserInfo>"​​​​);​


​57​

​sb.append(​​​​"</soap:Body>"​​​​);​


​58​

​sb.append(​​​​"</soap:Envelope>"​​​​);​


​59​

 


​60​

​return​​ ​​sb.toString();​


​61​

​}​


​62​

 


​63​

​}​


返回的数据格式如下: 



​1​

​<?​​​​xml​​ ​​version​​​​=​​​​'1.0'​​ ​​encoding​​​​=​​​​'UTF-8'​​​​?>​


​2​

​<​​​​soapenv:Envelope​​ ​​xmlns:soapenv​​​​=​​​​"http://www.w3.org/2003/05/soap-envelope"​​​​>​


​3​

​<​​​​soapenv:Body​​​​>​


​4​

​<​​​​ns:getUserInfoResponse​​ ​​xmlns:ns​​​​=​​​​"http://user.service.xxx.com"​​​​>​


​5​

​<​​​​ns:return​​​​>xxx</​​​​ns:return​​​​>​


​6​

​</​​​​ns:getUserInfoResponse​​​​>​


​7​

​</​​​​soapenv:Body​​​​>​


​8​

​</​​​​soapenv:Envelope​​​​>​

其中,<ns:return>内的"xxx"可以是json数据,android只需解析标签<ns:return>里的json数据即可。