android请求webservice

webservice的作用我就不多说了,自己在日常的项目中也开发过一些接口,但是客户端怎么调用自己还真是不知道,因此自己找了点资料学习了一下。也觉得很简单,其实也就是几个简单的步骤就可以了。下面是个人的一些总结

1.打开连接,需要提供的是一个webservice地址

2.设置请求方式和超时时间

3.设置请求头

4.把数据写入输出流,提交给服务器端

5.取得返回结果

不管使用的是什么方法,步骤永远不变,下面我就来写个webservice请求一下服务器端的servlet,下面是我的servlet

package org.lxh;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class LoginWebService
 */
public class LoginWebService extends HttpServlet {
	private static final long serialVersionUID = 1L;

    /**
     * Default constructor. 
     */
    public LoginWebService() {
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		this.doPost(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		String name=request.getParameter("username");
		String password=request.getParameter("password");
		if("will".equals(name)&&"123456".equals(password)){
			System.out.println("你已经登录成功");
		}
	}
	

}

下面就是客户端的webservice了,这里以android为例,下面的这段代码用于请求webservice,这里我用了servlet代替webservice


public String loginCheck(Map<String,String> parameter) throws Exception{
	  //拼接参数,这里最好使用StringBuilder
	  StringBuilder builder=new StringBuilder();
	  for(Map.Entry<String,String> entry:parameter.entrySet()){
		  //这里的参数需要编码
		  builder.append(entry.getKey()+"=").append(URLEncoder.encode(entry.getValue(),"UTF-8")+"&");
	  }
	  //除去多余的&
	  builder.deleteCharAt(builder.length()-1);
	  //封装数据,数据以byte方式传输
	  byte[] b=builder.toString().getBytes();
	  //需要请求的连接
	  URL url=new URL("http://192.168.0.104:8080/LoginService/LoginWebService");
	  //打开连接
	  HttpURLConnection conn=(HttpURLConnection)url.openConnection();
	  //设置请求方式和消息头以及超时时间
	  conn.setRequestMethod("POST");
	  conn.setConnectTimeout(5000);
	  //设置是否允许对外输出数据
	  conn.setDoOutput(true);
	  conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
	  conn.setRequestProperty("Content-Length", String.valueOf(b.length));
	  //取得输出流
	  OutputStream outPut=conn.getOutputStream();
	  outPut.write(b);
	  outPut.flush();
	  outPut.close();
	  //判断请求是否成功
	  if(conn.getResponseCode()==200){
		 // Log.i();
		  return "OK";
	  }else{
		  return "Err"; 
	  }
	 
	  
  }

这里需要注意的问题是必须添加许可,也就是运行android连接网络否则会出现连接被拒绝的异常

<uses-permission android:name="android.permission.INTERNET" /> 


下面我用了一个单元测试来查看效果下面是单元测试代码

public static final String TAG = "Test";

	public void getWebService() {
		UseHttpPost use=new UseHttpPost();
		try {
			Map<String,String> map=new HashMap<String,String>();
			map.put("username", "will");
			map.put("password", "123456");
			if("OK".equals(use.loginCheck(map))){
				Log.i(TAG, "Success");
			}else{
				Log.i(TAG, "Failure");
			}
		} catch (Exception e) {
			Log.e(TAG, e.getMessage());
		}

	}

下面来看下运行效果





到这里程序就写好了,这里其实还有一种方法请求webservice但是这种方法请求的速度比较慢,一般用于SSL.我也把代码贴出来

public String httpClient(Map<String,String> parameter) throws Exception{
	List<NameValuePair> parms=new ArrayList<NameValuePair>();
	 for(Map.Entry<String,String> entry:parameter.entrySet()){
		  //这里的参数需要编码
		 parms.add(new BasicNameValuePair(entry.getKey(),entry.getValue()));
		 
	  }
	 //得到编码后的实体数据
	 UrlEncodedFormEntity data=new UrlEncodedFormEntity(parms,"UTF-8");
	 HttpPost post=new HttpPost("http://192.168.0.104:8080/LoginService/LoginWebService");
	 post.setEntity(data);
	 //下面几句代码的功能相当于浏览器
	 DefaultHttpClient client=new DefaultHttpClient();
	 HttpResponse response=client.execute(post);
	 if(response.getStatusLine().getStatusCode()==200){
		 return "OK";
	 }else{
		 return "Err"; 
	 }
	
  }

2种f方法的参数特别是汉字就需要进行一下编码,如果服务器端出现乱码最好的方式就是加一个过滤器。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值