鼎捷那邊給的T100接口開發的資料:https://download.csdn.net/download/qq_31776219/11275333
需求如下:在android端輸入用戶名和密碼,會請求到T100后台接口。
先在T100,創建接口,webservice name就是我們的接口名字
程序代號就是代碼檔
然后下載程序檔下來寫接口代碼:
具體代碼如下:
{<section id="cwssp010.description" >}
#應用 a00 樣板自動產生(Version:2)
#+ Version..: T100-ERP-1.01.00(SD版次:1,PR版次:1) Build-000000
#+
#+ Filename...: cwssp010
#+ Description:
#+ Creator....: A1480(2019-07-04 15:29:28)
#+ Modifier...: 00000() -SD/PR-
{</section>}
{<section id="cwssp010.global" >}
#應用 m00 樣板自動產生(Version:4)
IMPORT os
IMPORT xml
#add-point:增加匯入項目
IMPORT util
#end add-point
SCHEMA ds
GLOBALS "../../cfg/top_global.inc"
GLOBALS "../../cfg/top_ws.inc" #TIPTOP Service Gateway 使用的全域變數檔
#add-point:自定義模組變數(Module Variable)
#end add-point
#add-point:自定義客戶專用模組變數(Module Variable)
#end add-point
{</section>}
{<section id="cwssp010.main" >}
#+ 作業開始
MAIN
DEFINE l_request_str STRING
DEFINE l_output_str STRING
#add-point:main段define
#end add-point
#add-point:main段define
#end add-point
#定義在其他link的程式則無效
WHENEVER ERROR CALL cl_err_msg_log
#add-point:初始化前定義
#end add-point
#依模組進行系統初始化設定(系統設定)
CALL cl_ap_init("cwss","")
#呼叫服務前置處理程序
CALL awsp900_01_preprocess()
#呼叫服務函式,中介程式主要處理段
IF g_status.code = "0" THEN
CALL cwssp010_process()
END IF
#呼叫服務後置處理程序
CALL awsp900_01_postprocess()
#離開作業
CALL cl_ap_exitprogram("0")
END MAIN
{</section>}
{<section id="cwssp010.process" >}
#+ 實際處理服務程式邏輯的FUNCTION內容
PRIVATE FUNCTION cwssp010_process()
#add-point: 服務邏輯主要處理段的ADP
DEFINE l_username LIKE gzxd_t.gzxd001 #存儲用戶名
DEFINE l_password LIKE gzxd_t.gzxd002 #存儲密碼
DEFINE l_dept LIKE ooag_t.ooag003 #存儲部門
DEFINE l_n LIKE type_t.num5#存儲是否有該用戶名
DEFINE l_str LIKE gzxd_t.gzxd001 #存儲截取后的工號a1480->A1480
DEFINE l_password_decode LIKE gzxd_t.gzxd002#存儲解密后的密碼
DEFINE l_return RECORD #返回部門、登錄成功與否的標志
l_gzxaowndp LIKE gzxa_t.gzxaowndp,
l_flag String,
l_ooag011 LIKE ooag_t.ooag011 #存儲真實姓名
END RECORD
DEFINE l_node_m xml.DomNode
DEFINE l_node xml.DomNode
DEFINE l_json util.JSONObject
DEFINE r_str STRING
INITIALIZE l_username TO NULL
INITIALIZE l_password TO NULL
#獲取Android端傳入的參數
LET l_username = awsp900_01_getParameter("username")
LET l_password = awsp900_01_getParameter("password")
LET l_node_m = awsp900_01_addMasterRecord(NULL, "M1")
LET l_node = awsp900_01_addDetail("gzxd_t")
INITIALIZE l_return.* TO NULL
SELECT count(*) INTO l_n FROM gzxd_t WHERE gzxd001= l_username AND gzxdent=g_enterprise;
IF l_n=1 THEN #說明存在該用戶
SELECT gzxd002 INTO l_password_decode FROM gzxd_t WHERE gzxd001=l_username AND gzxdent=g_enterprise #查出該用戶的密碼
LET l_password_decode=cl_hashkey_user_decode(l_password_decode)#對數據庫密文密碼進行解碼
IF l_password_decode=l_password THEN #如果解碼后的密碼與Android端傳入的密碼相等,校驗成功flag=1,失敗flag=0
LET l_return.l_flag=1
LET l_str = cl_replace_str(l_username,'a','A')
SELECT ooag011 INTO l_return.l_ooag011 FROM ooag_t WHERE ooagent=g_enterprise AND ooag001 = l_str
#登錄成功后,返回該用戶所屬的部門(由於Android端已經有用戶名和密碼,就只需傳回部門和標志即可)
SELECT gzxaowndp into l_return.l_gzxaowndp FROM gzxa_t WHERE gzxastus='Y' AND gzxaent=g_enterprise AND gzxa001=l_username
ELSE
LET l_return.l_flag=0
END IF
ELSE#不存在該用戶
LET l_return.l_flag=0
END IF
CALL awsp900_01_buildDetailRecord(l_node,util.JSONObject.fromFGL(l_return))
#end add-point
END FUNCTION
{</section>}
{<section id="cwssp010.other_function" >}
#add-point:自定義元件(Function)
#end add-point
{</section>}
這是請求T100的接口的request xml文件
但如果要請求接口,上面的xml格式還要改一下
替換完就是下面這樣的代碼:
<request type="sync" key="c45061457e12f4dcdb10defa1f13bc99">
<host prod="T100MOBILE" ver="2" ip="192.168.66.156" lang="zh_CN" timezone="+8" timestamp="201907290aa90954792" acct="a1480"/>
<service prod="T100" name="appUserLogin" srvver="1.0111" id="topaatst"/>
<payload>
<param key="data" type="XML">
<![CDATA[<Request>
<RequestContent>
<Parameter>
<Record>
<Field name="username" value="a1480"/>
<Field name="password" value="aaaaa"/>
</Record>
</Parameter>
<Document/>
</RequestContent>
</Request>
]]>
</param>
</payload>
</request>
先測試一下我們的接口,用SOAP UI去測
這是測試區的接口:
http://你的ip/wtoptst/ws/r/awsp900?wsdl
把上面轉換好的xml放到問好那里就可以啦
小問題:
出現獲取app最新版本失敗,是我acct那里沒寫工號,也有可能是別的問題。
下面是PDA端的開發:
登錄頁面:
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".activity.LoginActivity"
>
<!--登錄activity-->
<com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/AppTheme.NoActionBar.AppBarOverlay">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/colorPrimary"
app:popupTheme="@style/AppTheme.NoActionBar.PopupOverlay" />
</com.google.android.material.appbar.AppBarLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/login_bg"
android:orientation="vertical"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<!-- <ImageView
android:id="@+id/imageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:src="@drawable/login_logo" />-->
<!-- <EditText
android:id="@+id/et_name"
android:layout_width="match_parent"
android:layout_height="45dp"
android:layout_marginTop="30dp"
android:hint="用戶名"
android:paddingLeft="10dp"
android:singleLine="true" />-->
<com.gaomeng.km.view.ClearEditText
android:id="@+id/et_name"
android:layout_width="match_parent"
android:layout_height="45dp"
android:layout_marginTop="30dp"
android:hint="用戶名"
android:paddingLeft="10dp"
android:singleLine="true"
android:drawableRight="@drawable/delete_selector"
/>
<com.gaomeng.km.view.ClearEditText
android:id="@+id/et_password"
android:layout_width="match_parent"
android:layout_height="45dp"
android:hint="密碼"
android:paddingLeft="10dp"
android:password="true"
android:singleLine="true" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginRight="10dp"
android:orientation="vertical">
<CheckBox
android:id="@+id/keep_password"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right"
android:checked="true"
android:text="記住密碼"
android:textColor="@color/black" />
</LinearLayout>
<Button
android:id="@+id/btnLogin"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/btn_bg2"
android:text="登錄"
android:textColor="@android:color/white" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:textColor="@color/black" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="Powered By 資訊室"
android:textColor="@color/black" />
</LinearLayout>
</androidx.coordinatorlayout.widget.CoordinatorLayout>
loginactiviry.java
package com.gaomeng.km.activity;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Switch;
import android.widget.Toast;
import androidx.appcompat.widget.Toolbar;
import com.gaomeng.km.R;
import com.gaomeng.km.activity.base.BaseActivity;
import com.gaomeng.km.util.ShareUtils;
import com.gaomeng.km.view.CustomDialog;
import com.jaeger.library.StatusBarUtil;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import static com.gaomeng.km.util.StaticClass.WSDL_URI;
/**
* @ProjectName: km
* @Package: com.gaomeng.km
* @ClassName: LoginActivity
* @Description: 主界面登錄Activity
* @Author: yeweizheng
* @CreateDate: 2019/7/26 16:30
* @UpdateUser: yeweizheng
* @UpdateDate: 2019/7/26 16:30
* @UpdateRemark: tstasada lsc/2019
* @Version: 1.0
*/
public class LoginActivity extends BaseActivity {
public static boolean LOGIN_FLAG = true;
EditText etName;
EditText etPassword;
CheckBox keepPassword;
Button btnLogin;
Switch activity_login_sw;
private String result;
private CustomDialog dialog;
private int mStatusBarColor;
private Thread.UncaughtExceptionHandler mDefaultExceptionHandler;
final Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 1:
Toast.makeText(getApplicationContext(), "網絡請求失敗,請檢查wifi是否連接成功", Toast.LENGTH_SHORT).show();
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
initView();
}
private void initView() {
etName = findViewById(R.id.et_name);
etPassword = findViewById(R.id.et_password);
keepPassword = findViewById(R.id.keep_password);
btnLogin = findViewById(R.id.btnLogin);
mStatusBarColor = getResources().getColor(R.color.colorPrimary);
StatusBarUtil.setColor(LoginActivity.this, mStatusBarColor);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
//自動登錄
String loginName = ShareUtils.getString(getApplicationContext(), "name", null);
String loginPassword = ShareUtils.getString(getApplicationContext(), "password", null);
if (loginName != null && loginPassword != null) {
Intent intent = new Intent(LoginActivity.this,
MainActivity.class);
startActivity(intent);
finish();
}
btnLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//1、獲取輸入框的值
String name = etName.getText().toString().trim();
String password = etPassword.getText().toString().trim();
//2.判斷是否為空
if (!TextUtils.isEmpty(name) & !TextUtils.isEmpty(password)) {
dialog.show();
QueryTestTask queryTestTask = new QueryTestTask();
queryTestTask.execute(name, password);
}
}
});
//ShareUtils.getBoolean(this, "keeppass", true);
boolean isKeep = true;
keepPassword.setChecked(isKeep);
dialog = new CustomDialog(this, 100, 100, R.layout.dialog_loding, R.style.Theme_dialog, Gravity.CENTER, R.style.pop_anim_style);
dialog.setCancelable(false);
if (isKeep) {
String name = ShareUtils.getString(this, "name", "");
String password = ShareUtils.getString(this, "password", "");
etName.setText(name);
etPassword.setText(password);
}
}
/**
* 登錄校驗
* param:username password 用戶名 密碼
* return:l_gzxaowndp l_flag 部門 登錄成功、失敗標志
*/
public String getLoginInfo(String username, String password) throws IOException {
StringBuilder xml = new StringBuilder();
xml.append("<soapenv:Envelope\n" +
"\txmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\"\n" +
"\txmlns:tip=\"http://www.digiwin.com.cn/tiptop/TIPTOPServiceGateWay\">\n" +
"\t<soapenv:Header />\n" +
"\t<soapenv:Body>\n" +
"\t\t<tip:invokeSrv>\n" +
"\t\t\t<request><request type=\"sync\" key=\"c45061457e12f4dcdb10defa1f13bc99\">\n" +
"<host prod=\"T100MOBILE\" ver=\"2\" ip=\"192.168.66.156\" lang=\"zh_CN\" timezone=\"+8\" timestamp=\"201907290aa90954792\" acct=\"a0724\"/>\n" +
"<service prod=\"T100\" name=\"appUserLogin\" srvver=\"1.0111\" id=\"topaatst\"/>\n" +
"<payload>\n" +
" <param key=\"data\" type=\"XML\">\n" +
" <![CDATA[<Request><RequestContent><Parameter><Record><Field name=\"username\" value=\"");
xml.append(username);
xml.append("\"/><Field name=\"password\" value=\"");
xml.append(password);
xml.append("\"/></Record></Parameter><Document/></RequestContent></Request>]]></param>\n" +
" </payload>\n" +
"</request></request>\n" +
"\t\t</tip:invokeSrv>\n" +
"\t</soapenv:Body>\n" +
"</soapenv:Envelope>");
byte[] xmlbyte = xml.toString().getBytes("UTF-8");
URL url = new URL(WSDL_URI);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(5000);
conn.setDoOutput(true);// 允許輸出
conn.setDoInput(true);
conn.setUseCaches(false);// 不使用緩存
conn.setDefaultUseCaches(false);
conn.setRequestMethod("POST");
/* conn.setRequestProperty("Connection", "Keep-Alive");// 維持長連接
conn.setRequestProperty("Charset", "UTF-8");*/
conn.setRequestProperty("SOAPAction", "");
/* conn.setRequestProperty("Content-Length",
String.valueOf(xmlbyte.length));*/
conn.setRequestProperty("Content-Type", "text/xml; charset=UTF-8");
// conn.setRequestProperty("X-ClientType", "2");//發送自定義的頭信息
conn.getOutputStream().write(xmlbyte);
conn.getOutputStream().flush();
conn.getOutputStream().close();
String l_flag = "0";
if (conn.getResponseCode() == 200) {
InputStream is = conn.getInputStream();// 獲取返回數據
// 使用輸出流來輸出字符(可選)
ByteArrayOutputStream out = new ByteArrayOutputStream();
byte[] buf = new byte[1024];
int len;
while ((len = is.read(buf)) != -1) {
out.write(buf, 0, len);
}
String string = out.toString("UTF-8");
if (!TextUtils.isEmpty(string)) {
Log.i("yeweizheng", string);
//部門
String l_gzxaowndp = string.substring(string.indexOf("l_gzxaowndp", 1), string.length());
l_gzxaowndp = l_gzxaowndp.substring(l_gzxaowndp.indexOf("=", 1) + 2, l_gzxaowndp.indexOf("/", 1) - 1);
System.out.println(l_gzxaowndp);
//標志
l_flag = string.substring(string.indexOf("l_flag", 1), string.length());
l_flag = l_flag.substring(l_flag.indexOf("=", 1) + 2, l_flag.indexOf("/", 1) - 1);
System.out.println(l_flag);
//System.out.println(string);
Log.i("yeweizheng", string);
//String endString = l_gzxaowndp + "\n" + bcme004 + "\n" + bcme010 + "\n" + bcme017 + "\n" + bcmeud002 + "\n" + bcmeud001 + "\n";
String l_ooag011 = string.substring(string.indexOf("l_ooag011", 1), string.length());
l_ooag011 = l_ooag011.substring(l_ooag011.indexOf("=", 1) + 2, l_ooag011.indexOf("/", 1) - 1);
System.out.println(l_ooag011);
ShareUtils.putString(getApplicationContext(), "l_ooag011", l_ooag011);
out.close();
}
} else {
Message msg = mHandler.obtainMessage();
msg.what = 1;
mHandler.sendMessage(msg);
}
return l_flag;
}
/**
* 異步任務處理網絡請求、更新UI主線程
*/
class QueryTestTask extends AsyncTask<String, Integer, String> {
@Override
protected String doInBackground(String... params) {
try {
result = getLoginInfo(params[0], params[1]);
} catch (Exception e) {
e.printStackTrace();
}
//將結果返回給onPostExecute方法
return result;
}
//此方法用於在主線程改變UI
@Override
protected void onPostExecute(String result) {
if (TextUtils.isEmpty(result)) {
dialog.dismiss();
Message msg = mHandler.obtainMessage();
msg.what = 1;
mHandler.sendMessage(msg);
} else {
if (result.equals("1")) {
dialog.dismiss();
Toast.makeText(getApplicationContext(), "登錄成功!", Toast.LENGTH_SHORT).show();
ShareUtils.putString(getApplicationContext(), "name", etName.getText().toString().trim());
ShareUtils.putString(getApplicationContext(), "password", etPassword.getText().toString().trim());
Intent intent = new Intent();
intent.setClass(LoginActivity.this, MainActivity.class);
startActivity(intent);
finish();
} else {
dialog.dismiss();
Toast.makeText(getApplicationContext(), "用戶名或密碼錯誤!", Toast.LENGTH_LONG).show();
}
}
}
}
}
baseactivity.java
package com.gaomeng.km.activity.base;
import androidx.appcompat.app.AppCompatActivity;
/**
* @ProjectName: km
* @Package: com.gaomeng.km.activity
* @ClassName: BaseActivity
* @Description:所有Activity的基類,用於處理一些公共事件,如數據統計,獲取上下文
* @Author: yeweizheng
* @CreateDate: 2019/7/30 8:42
* @UpdateUser: yeweizheng
* @UpdateDate: 2019/7/30 8:42
* @UpdateRemark:
* @Version: 1.0
*/
public class BaseActivity extends AppCompatActivity {
}