REST service 之登录注册

来源:互联网 发布:买火车票什么软件好 编辑:程序博客网 时间:2024/06/10 17:02

上一篇讲到搭建环境和如何编写一个简单的rest service,这次写一个实用的登录注册例子。

先从简单的开始,没有验证只加一个方法 ,关于@get这些东西是java的注解,想要深入了解的可以看之前的文章。

@GET@Path("/Login/{account}/{password}")@Produces(MediaType.TEXT_XML)public String Login(@PathParam("account") String user,@PathParam("password") String password) {return "<User>" + "<Login>" + "success" + "</Login>" + "</User>";}

那么其实现在的service主要是为了给android客户端进行服务,重点在于如何在手机上调用这个服务。

写了一个简单的登录程序

package com.example.jsonandroid;import java.io.IOException;import org.apache.http.HttpEntity;import org.apache.http.HttpResponse;import org.apache.http.client.ClientProtocolException;import org.apache.http.client.HttpClient;import org.apache.http.client.methods.HttpGet;import org.apache.http.impl.client.DefaultHttpClient;import org.apache.http.util.EntityUtils;import org.json.JSONException;import org.json.JSONObject;import android.app.Activity;import android.app.AlertDialog;import android.app.AlertDialog.Builder;import android.content.DialogInterface;import android.os.Bundle;import android.os.StrictMode;import android.util.Log;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;public class MainActivity extends Activity {/** Called when the activity is first created. */// 模拟器自己把自己当成localhost了,服务器应该为10.0.2.2private static String url = "http://192.168.191.1:8080/JsonWeb/login.action?";private final String url_constant = "http://192.168.191.1:8080/RESTfulWS/rest/UserInfoService/Login/Pavithra/12312";private EditText txUserName;private EditText txPassword;private Button btnLogin;@Overridepublic void onCreate(Bundle savedInstanceState) {// /在Android2.2以后必须添加以下代码// 本应用采用的Android4.0// 设置线程的策略StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectDiskReads().detectDiskWrites().detectNetwork() // or// .detectAll()// for// all// detectable// problems.penaltyLog().build());// 设置虚拟机的策略StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectLeakedSqlLiteObjects()// .detectLeakedClosableObjects().penaltyLog().penaltyDeath().build());super.onCreate(savedInstanceState);// 设置页面布局setContentView(R.layout.main);// 设置初始化视图initView();// 设置事件监听器方法setListener();}/** * 创建初始化视图的方法 */private void initView() {btnLogin = (Button) findViewById(R.id.btnLogin);txUserName = (EditText) findViewById(R.id.UserName);txPassword = (EditText) findViewById(R.id.textPasswd);}/** * 设置事件的监听器的方法 */private void setListener() {btnLogin.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {String userName = txUserName.getText().toString();Log.v("userName = ", userName);String password = txPassword.getText().toString();Log.v("passwd = ", password);loginRemoteService(userName, password);}});}/** * 获取Struts2 Http 登录的请求信息 *  * @param userName * @param password */public void loginRemoteService(String userName, String password) {String result = null;try {// 创建一个HttpClient对象HttpClient httpclient = new DefaultHttpClient();// 远程登录URL// 下面这句是原有的// processURL=processURL+"userName="+userName+"&password="+password;url = url_constant + "userName=" + userName + "&password="+ password;Log.d("远程URL", url);// 创建HttpGet对象HttpGet request = new HttpGet(url_constant);// 请求信息类型MIME每种响应类型的输出(普通文本、html 和 XML,json)。允许的响应类型应当匹配资源类中生成的 MIME// 类型// 资源类生成的 MIME 类型应当匹配一种可接受的 MIME 类型。如果生成的 MIME 类型和可接受的 MIME 类型不// 匹配,那么将// 生成 com.sun.jersey.api.client.UniformInterfaceException。例如,将可接受的// MIME 类型设置为 text/xml,而将// 生成的 MIME 类型设置为 application/xml。将生成 UniformInterfaceException。request.addHeader("Accept", "text/xml");// 获取响应的结果HttpResponse response = httpclient.execute(request);// 获取HttpEntityHttpEntity entity = response.getEntity();// 获取响应的结果信息String json = EntityUtils.toString(entity, "UTF-8");// JSON的解析过程Toast.makeText(MainActivity.this, json, 2000).show();if (json != null) {JSONObject jsonObject = new JSONObject(json);result = jsonObject.get("message").toString();}if (result == null) {json = "登录失败请重新登录";}// 创建提示框提醒是否登录成功AlertDialog.Builder builder = new Builder(MainActivity.this);builder.setTitle("提示").setMessage(json).setPositiveButton("确定",new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog,int which) {dialog.dismiss();}}).create().show();} catch (ClientProtocolException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (JSONException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}
通过测试登录成功

这里有几个点,现在android不允许将访问网络的线程放在主线程中了。第二,建议用json的数据格式,手机端处理速度快。第三 服务端应该规范化包名,或采用strust2 或者Spring 架构。

当然这一切都是简陋版 的。只是验证一下当前 的技术路径是否可用。然后我们就开始规范路径和代码了



0 0
原创粉丝点击