ANDROID访问PB webservice 参数传达到PBWS一直都是null空值

WMERP 2018-10-22 11:43:12
使用PB12.6做的WEBSERVICE ,在android studio 2.2.3中使用Ksoap2 3.30进行访问。
测试程序:
pbws端:
string f_get_common_sql_test(string SSQL)

string ls_json ,stype
sailjson ljson,ljson1,ljson_data
ljson = create sailjson
ljson1 = create sailjson
ljson_data= create sailjson
long i
stype="TEST"
if isnull(ssql) or ssql='' then ssql="NULL1"+string(now(),"hh:mm:ss")

ljson_data = ljson.addobject('header')
ljson_data.setattribute( 'account','123456789')
ljson_data.setattribute( 'type', '1')
ljson_data.setattribute( 'pwd', '123456')
ljson_data.setattribute( stype, ssql)
for i=1 to 3

ljson_data = ljson.addarrayitem('data')

ljson_data.setattribute( 'account','123456789')
ljson_data.setattribute( 'type', '1')
ljson_data.setattribute( 'pwd', '123456')

next
ls_json = ljson.getformatjson('')
ls_json=gf_replaceall(ls_json,"c__sailjson","")
return ls_json

发布后在浏览器访问都正常

f_get_common_sql_test

Test

To test the operation using the HTTP POST protocol, click the 'Invoke' button.
Parameter Value
ssql:
Invoke

SOAP 1.1

The following is a sample SOAP 1.1 request and response. The placeholders shown need to be replaced with actual values.

POST /wm_ws/n_wm_ws.asmx HTTP/1.1
Host: localhost
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://tempurl.org/f_get_common_sql_test"

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<f_get_common_sql_test xmlns="http://tempurl.org">
<ssql>string</ssql>
</f_get_common_sql_test>
</soap:Body>
</soap:Envelope>
HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<f_get_common_sql_testResponse xmlns="http://tempurl.org">
<f_get_common_sql_testResult>string</f_get_common_sql_testResult>
</f_get_common_sql_testResponse>
</soap:Body>
</soap:Envelope>
SOAP 1.2

The following is a sample SOAP 1.2 request and response. The placeholders shown need to be replaced with actual values.

POST /wm_ws/n_wm_ws.asmx HTTP/1.1
Host: localhost
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
<soap12:Body>
<f_get_common_sql_test xmlns="http://tempurl.org">
<ssql>string</ssql>
</f_get_common_sql_test>
</soap12:Body>
</soap12:Envelope>
HTTP/1.1 200 OK
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
<soap12:Body>
<f_get_common_sql_testResponse xmlns="http://tempurl.org">
<f_get_common_sql_testResult>string</f_get_common_sql_testResult>
</f_get_common_sql_testResponse>
</soap12:Body>
</soap12:Envelope>
HTTP POST

The following is a sample HTTP POST request and response. The placeholders shown need to be replaced with actual values.

POST /wm_ws/n_wm_ws.asmx/f_get_common_sql_test HTTP/1.1
Host: localhost
Content-Type: application/x-www-form-urlencoded
Content-Length: length

ssql=string
HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<string xmlns="http://tempurl.org">string</string>


android端:

package wm.wmb.pbws;
//wm.wmb.pbws.PbwsTestActivity
import android.content.Context;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.StrictMode;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.textservice.TextServicesManager;
import android.widget.EditText;
import android.widget.Toast;

import com.google.android.gms.appindexing.Action;
import com.google.android.gms.appindexing.AppIndex;
import com.google.android.gms.appindexing.Thing;
import com.google.android.gms.common.api.GoogleApiClient;

import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.PropertyInfo;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;

import wm.wmb.R;

public class PbwsTestActivity extends AppCompatActivity {
private String ls_result="";
private SoapObject soapObject;
private String result;

/**
* ATTENTION: This was auto-generated to implement the App Indexing API.
* See https://g.co/AppIndexing/AndroidStudio for more information.
*/
private GoogleApiClient client;

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

}


// 执行输入校验

public void getStringSql(View v) throws Exception{
String ls_rtn;
//启动后台异步线程进行连接webService操作,并且根据返回结果在主线程中改变UI
QuerySqlTask querySqlTask = new QuerySqlTask(this);
//启动后台任务
querySqlTask.execute("select part_id,source from part where part_id like 'KC%'");

}


public String getRemoteInfo(String ls_sql) throws Exception{
String WSDL_URI = "http://192.168.1.168/wm_ws/n_wm_ws.asmx?wsdl";//wsdl 的uri ?wsdl
String namespace = "http://tempurl.org/";//namespace
String methodName = "f_get_common_sql_test";//要调用的方法名称
SoapObject request = new SoapObject(namespace, methodName);
String SOAP_ACTION = "http://tempurl.org/f_get_common_sql_test";
// 设置需调用WebService接口需要传入的参数
PropertyInfo pi = new PropertyInfo();
pi.setName("SSQL");
pi.setValue("select part_id,source from part where part_id like 'KC%'");
pi.setType(ls_sql.getClass());
request.addProperty(pi);

//创建SoapSerializationEnvelope 对象,同时指定soap版本号(之前在wsdl中看到的)
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapSerializationEnvelope.VER11);
envelope.bodyOut = request;//由于是发送请求,所以是设置bodyOut
envelope.dotNet = true;//由于是.net开发的webservice,所以这里要设置为true
envelope.setOutputSoapObject(request);
HttpTransportSE httpTransportSE = new HttpTransportSE(WSDL_URI,300000);
httpTransportSE.call(SOAP_ACTION, envelope);//调用SOAP_ACTION
// 获取返回的数据
SoapObject object = (SoapObject) envelope.bodyIn;
// 获取返回的结果
result = object.getProperty(0).toString();
return result;
}

class QuerySqlTask extends AsyncTask<String ,Integer,String> {
private Context context;
QuerySqlTask(Context context) {
this.context = context;
}

/**
* 运行在UI线程中,在调用doInBackground()之前执行
*/
@Override
protected void onPreExecute() {
Toast.makeText(context,"开始执行",Toast.LENGTH_SHORT).show();
}
/**
* 后台运行的方法,可以运行非UI线程,可以执行耗时的方法
*/
@Override
protected String doInBackground(String... params) {
// 查询手机号码(段)信息*/

try {
result = getRemoteInfo(params[0]);

} catch (Exception e) {
e.printStackTrace();
}
//将结果返回给onPostExecute方法
return result;
}

/**
* 运行在ui线程中,在doInBackground()执行完毕后执行
*/
@Override
protected void onPostExecute(String string) {
Toast.makeText(context,"执行完毕",Toast.LENGTH_SHORT).show();
EditText editText=(EditText) findViewById(R.id.edt_pbws_test);
editText.setText(string);

}

/**
* 在publishProgress()被调用以后执行,publishProgress()用于更新进度
*/
//@Override
// protected void onProgressUpdate(Integer... values) {
// tv.setText(""+values[0]);
// }
}

}

执行结果:



以上显示传入的参数都是空值,百度都未扎到能解决的方法,各位大侠救场!!
...全文
894 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
WMERP 2019-04-09
  • 打赏
  • 举报
回复
我现在是想这样的,PB做webservice,同时改动PB的服务器端C/S作为应用层级,这样手机或者网页端发送简单的数据请求ws直接响应回复,如果发送的复杂的统计报表,再由Ws发送请求给值守应用,应用层按照要求执行报表统计后(多线程时部分大量数据统计的就会限制打开),然后按照每次请求的KEY生成结果放入到结果全局临时表,WS端再返回或者手机端根据KEY刷新后显示,PB,WS和java混编
WMERP 2019-04-09
  • 打赏
  • 举报
回复
很多都有啊,在百度网盘里面都有,你要的话我可以百度网盘共享给你
pcwe2002 2019-04-09
  • 打赏
  • 举报
回复
android一般都是通过webapi调用,ksoap比较少,可以试试pb开发后台服务,支持pb断点调试,pb9或者以上版本都支持。 https://blog.csdn.net/pcwe2002/article/details/54603128
PackChen 2019-03-23
  • 打赏
  • 举报
回复
引用 3 楼 WMERP 的回复:
可以了,被自己试出来了。WEBSERVICE是PB2017 开发的,WIN764-iis,代码如下:
public class PbwsSoap {

private String ls_result="";
private SoapObject soapObject;
private String result;
private String url;
private ProInfo proInfo;
public PbwsSoap(String lurl) {
this.url= lurl;
}
public String getInfoBySql(String methodnm, ArrayList<String> parmnames,ArrayList<String> parmvalues,int returnno) throws Exception{
String WSDL_URI = url+"wm_ws/n_wm_ws.asmx?WSDL";//wsdl 的uri ?wsdl
String namespace = "wmerp";//namespace
String methodName = methodnm;//"f_get_common_sql_test";//要调用的方法名称
SoapObject request = new SoapObject(namespace, methodName);
// 设置需调用WebService接口需要传入的参数
//request.addProperty("SSQL",lstr);
PropertyInfo pi;
for(int i=0;i<parmnames.size();i++) {
pi=new PropertyInfo();
pi.setName(parmnames.get(i).toString());
pi.setValue(parmvalues.get(i).toString());
request.addProperty(pi);
}
//创建SoapSerializationEnvelope 对象,同时指定soap版本号(之前在wsdl中看到的)
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapSerializationEnvelope.VER12);
envelope.bodyOut = request;//由于是发送请求,所以是设置bodyOut
envelope.dotNet = true;//由于是.net开发的webservice,所以这里要设置为true
envelope.setOutputSoapObject(request);
HttpTransportSE httpTransportSE = new HttpTransportSE(WSDL_URI);
httpTransportSE.call(null, envelope);//调用SOAP_ACTION
// 获取返回的数据
SoapObject object = (SoapObject) envelope.bodyIn;
// 获取返回的结果
result = object.getProperty(returnno).toString();
return result;
}
//nf_sqlquery_string(1,2,3) nf_sqlquery_jsonxml (1,2,3)
private String newstr(String str){
proInfo=new ProInfo();
return proInfo.setNewString(str);

}

public String getInfoBySql0(String methodnm, ArrayList<String> parmnames,ArrayList<String> parmvalues) throws Exception { return getInfoBySql(methodnm,parmnames,parmvalues,0); }
public String getInfoBySql1(String methodnm, ArrayList<String> parmnames,ArrayList<String> parmvalues) throws Exception { return getInfoBySql(methodnm,parmnames,parmvalues,1); }
public String getInfoBySql0( ArrayList<String> parmnames,ArrayList<String> parmvalues) throws Exception { return getInfoBySql("nf_action_system",parmnames,parmvalues,0); }
public String getInfoBySql1( ArrayList<String> parmnames,ArrayList<String> parmvalues) throws Exception { return getInfoBySql("nf_action_system",parmnames,parmvalues,1); }

public String getJsonByJson( String json) throws Exception
{ json=newstr(json);
ArrayList<String> parmnames,parmvalue;
parmnames = new ArrayList<String>();
parmvalue = new ArrayList<String>();
parmnames.add("as_json");
parmvalue.add(json);
parmnames.add("as_rtn");
parmvalue.add("");
return getInfoBySql("nf_action_system",parmnames,parmvalue,0); }

public String getJsonBySql( String newsql) throws Exception
{ newsql=newstr(newsql);
ArrayList<String> parmnames,parmvalue;
parmnames = new ArrayList<String>();
parmvalue = new ArrayList<String>();
parmnames.add("as_sql");
parmvalue.add(newsql);
parmnames.add("as_result");
parmvalue.add("");
parmnames.add("as_type");
parmvalue.add("J");
return getInfoBySql("nf_sqlquery_jsonxml",parmnames,parmvalue,0); }

public String getStringBySql( String newsql) throws Exception
{ newsql=newstr(newsql);
ArrayList<String> parmnames,parmvalue;
parmnames = new ArrayList<String>();
parmvalue = new ArrayList<String>();
parmnames.add("as_sql");
parmvalue.add(newsql);
parmnames.add("as_result");
parmvalue.add("1");
parmnames.add("as_type");
parmvalue.add("R");
return getInfoBySql("nf_sqlquery_string",parmnames,parmvalue,0); }
}

PB2017哪里有得下载,有破解吗?R3还是R2的,不过我记得PB2017要打补丁才正常
WMERP 2019-03-07
  • 打赏
  • 举报
回复
可以了,被自己试出来了。WEBSERVICE是PB2017 开发的,WIN764-iis,代码如下:
public class PbwsSoap {

private String ls_result="";
private SoapObject soapObject;
private String result;
private String url;
private ProInfo proInfo;
public PbwsSoap(String lurl) {
this.url= lurl;
}
public String getInfoBySql(String methodnm, ArrayList<String> parmnames,ArrayList<String> parmvalues,int returnno) throws Exception{
String WSDL_URI = url+"wm_ws/n_wm_ws.asmx?WSDL";//wsdl 的uri ?wsdl
String namespace = "wmerp";//namespace
String methodName = methodnm;//"f_get_common_sql_test";//要调用的方法名称
SoapObject request = new SoapObject(namespace, methodName);
// 设置需调用WebService接口需要传入的参数
//request.addProperty("SSQL",lstr);
PropertyInfo pi;
for(int i=0;i<parmnames.size();i++) {
pi=new PropertyInfo();
pi.setName(parmnames.get(i).toString());
pi.setValue(parmvalues.get(i).toString());
request.addProperty(pi);
}
//创建SoapSerializationEnvelope 对象,同时指定soap版本号(之前在wsdl中看到的)
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapSerializationEnvelope.VER12);
envelope.bodyOut = request;//由于是发送请求,所以是设置bodyOut
envelope.dotNet = true;//由于是.net开发的webservice,所以这里要设置为true
envelope.setOutputSoapObject(request);
HttpTransportSE httpTransportSE = new HttpTransportSE(WSDL_URI);
httpTransportSE.call(null, envelope);//调用SOAP_ACTION
// 获取返回的数据
SoapObject object = (SoapObject) envelope.bodyIn;
// 获取返回的结果
result = object.getProperty(returnno).toString();
return result;
}
//nf_sqlquery_string(1,2,3) nf_sqlquery_jsonxml (1,2,3)
private String newstr(String str){
proInfo=new ProInfo();
return proInfo.setNewString(str);

}

public String getInfoBySql0(String methodnm, ArrayList<String> parmnames,ArrayList<String> parmvalues) throws Exception { return getInfoBySql(methodnm,parmnames,parmvalues,0); }
public String getInfoBySql1(String methodnm, ArrayList<String> parmnames,ArrayList<String> parmvalues) throws Exception { return getInfoBySql(methodnm,parmnames,parmvalues,1); }
public String getInfoBySql0( ArrayList<String> parmnames,ArrayList<String> parmvalues) throws Exception { return getInfoBySql("nf_action_system",parmnames,parmvalues,0); }
public String getInfoBySql1( ArrayList<String> parmnames,ArrayList<String> parmvalues) throws Exception { return getInfoBySql("nf_action_system",parmnames,parmvalues,1); }

public String getJsonByJson( String json) throws Exception
{ json=newstr(json);
ArrayList<String> parmnames,parmvalue;
parmnames = new ArrayList<String>();
parmvalue = new ArrayList<String>();
parmnames.add("as_json");
parmvalue.add(json);
parmnames.add("as_rtn");
parmvalue.add("");
return getInfoBySql("nf_action_system",parmnames,parmvalue,0); }

public String getJsonBySql( String newsql) throws Exception
{ newsql=newstr(newsql);
ArrayList<String> parmnames,parmvalue;
parmnames = new ArrayList<String>();
parmvalue = new ArrayList<String>();
parmnames.add("as_sql");
parmvalue.add(newsql);
parmnames.add("as_result");
parmvalue.add("");
parmnames.add("as_type");
parmvalue.add("J");
return getInfoBySql("nf_sqlquery_jsonxml",parmnames,parmvalue,0); }

public String getStringBySql( String newsql) throws Exception
{ newsql=newstr(newsql);
ArrayList<String> parmnames,parmvalue;
parmnames = new ArrayList<String>();
parmvalue = new ArrayList<String>();
parmnames.add("as_sql");
parmvalue.add(newsql);
parmnames.add("as_result");
parmvalue.add("1");
parmnames.add("as_type");
parmvalue.add("R");
return getInfoBySql("nf_sqlquery_string",parmnames,parmvalue,0); }
}
PackChen 2019-03-06
  • 打赏
  • 举报
回复
内容转成utf-16试试
velen000 2019-02-15
  • 打赏
  • 举报
回复
帮顶!帮顶!帮顶!

662

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder Web 应用
社区管理员
  • Web 应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧