鼎捷那边给的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 {
}