使用SoapObject登入网站获取通行证

使用的第三方jar:ksoap2-android-assembly-3.0.0-jar-with-depend.jar

-------------------------------------

简单的需求:

 输入用户名和密码,取得token;

-------------------------------------

一个简单的登入界面:

public class MainActivity extends Activity {

	protected static final String TAG = "MainActivity";
	private EditText et_user_name;
	private EditText et_user_password;
	private Button bt_login;
	private String mobileAppVersion = "V1.0";
	private Context context = this;
	private WebServices webServices = null;
	private String str_user_name = null;
	private String str_user_password = null;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		initView();
	}

	private void initView() {
		et_user_name = (EditText) findViewById(R.id.user_name);
		et_user_password = (EditText) findViewById(R.id.user_password);
		bt_login = (Button) findViewById(R.id.user_login);

		bt_login.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View arg0) {
				str_user_name = et_user_name.getText().toString().trim();
				str_user_password = et_user_password.getText().toString()
						.trim();

				Log.i(TAG, "onClick::::::str_user_name: " + str_user_name
						+ "####" + "str_user_password: " + str_user_password);

				new LoginAsy().execute(); // 联网登入异步加载

				/*
				 * // 执行此操作不能再主线程中 LoginResult loginResult =
				 * webServices.userLogin(context, str_user_name,
				 * mobileAppVersion, str_user_password);
				 * 
				 * if (loginResult != null) {
				 * 
				 * String token = loginResult.getToken();
				 * 
				 * Log.i(TAG, "token========>" + token); }
				 */

			}
		});

	}

	class LoginAsy extends AsyncTask<String, String, String> {

		@Override
		protected String doInBackground(String... params) {
			webServices = new WebServices();
			try {

				Log.i(TAG, "LoginAsy:::::::str_user_name: " + str_user_name
						+ "####" + "str_user_password: " + str_user_password);
				LoginResult loginResult = webServices.userLogin(context,
						str_user_name, mobileAppVersion, str_user_password);

				if (loginResult != null) {
					String token = loginResult.getToken();
					Log.i(TAG, "token========>" + token);
				}
			} catch (Exception e) {
				Log.i(TAG, e.toString());
			}
			return null;
		}
	}
}


userLogin
登入执行的功能要联网后执行的动作,就不能再主线程执行。最初没有整明白这点原因,就直接写在主线程中。一直查找原因到WebServices.userLogin里面 

查到transport.call(SOAPACTION, envelope, null); 死活就是不执行。无任何结果,也不爆出异常错误信息。这句不执行就没有的到数据。

网上疯狂的度资料,原来先人们也有过遇到这个坑的,折腾半天,浪费好多时间。


public LoginResult userLogin(Context context, String loginKey,
			String mobileAppVersion, String password) {

		String methodName = "userLogin";
		LoginResult logResult = null;

		try {

			SoapObject soapObject = new SoapObject(NAMESPACE, methodName);
			if (loginKey != null) {
				soapObject.addProperty("loginKey", loginKey);
			}
			if (mobileAppVersion != null) {
				soapObject.addProperty("mobileAppVersion", mobileAppVersion);
			}
			if (password != null) {
				password = MD5.getMD5Str(password);
				soapObject.addProperty("password", password);
			}
			/*soap v1.1*/
			SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
					SoapEnvelope.VER11);
			envelope.setOutputSoapObject(soapObject);
			envelope.bodyOut = soapObject;
			envelope.dotNet = false;
			HttpTransportSE transport = new HttpTransportSE(ENDPOINT, timeout);
			transport.call(SOAPACTION, envelope, null);
			Log.i(TAG, "transport ++++++++++++ transport.call"); // 未执行的原因是,调用此类不能在主线程中执行~

			if (envelope.getResponse() != null) {
				logResult = new LoginResult();
				/*返回的数据*/
				Log.i(TAG, envelope.getResponse().toString());

				SoapObject so = (SoapObject) envelope.getResponse();
				logResult.setCode(Integer.valueOf(so.getProperty("code")
						.toString()));
				logResult.setMessage(so.getProperty("message").toString());
				if (logResult.getCode() == 0) {
					logResult.setCc(so.getProperty("cc").toString());
					logResult.setUserName(so.getProperty("userName").toString());
					logResult.setToken(so.getProperty("token").toString());
					logResult.setServerSystemTime(Long.getLong(so.getProperty(
							"serverSystemTime").toString()));
				}
			}

		} catch (Exception e) {
			// TODO: handle exception
		}

		return logResult;
	}

下面是MD5的算法:

package com.example.test01;

import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class MD5 {

	public static String getMD5Str(String str) {


        MessageDigest messageDigest = null;

        try

        {

            messageDigest = MessageDigest.getInstance("MD5");

            messageDigest.reset();

            messageDigest.update(str.getBytes("UTF-8"));

        } catch (NoSuchAlgorithmException e)

        {

            System.out.println("NoSuchAlgorithmException caught!");

            System.exit(-1);

        } catch (UnsupportedEncodingException e)

        {

            e.printStackTrace();

        }

 

        byte[] byteArray = messageDigest.digest();

 

        StringBuffer md5StrBuff = new StringBuffer();

 

        for (int i = 0; i < byteArray.length; i++)

        {

            if (Integer.toHexString(0xFF & byteArray[i]).length() == 1)

                md5StrBuff.append("0").append(Integer.toHexString(0xFF & byteArray[i]));

            else

                md5StrBuff.append(Integer.toHexString(0xFF & byteArray[i]));

        }

        return md5StrBuff.toString();

    
	}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值