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方法的参数特别是汉字就需要进行一下编码,如果服务器端出现乱码最好的方式就是加一个过滤器。