我正在使用Eclipse IDE开发Android应用程序。我正在尝试连接到.net webservice。我正在使用ksoap2版本2.3
当我调用没有参数的web方法时,它运行正常。当我将参数传递给webmethod时,我得到null(在调试我发现的web服务时),我从客户端代码中的webmethod得到一个null。
代码:
package com.examples.hello;
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 android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class HelloActivity extends Activity {
/** Called when the activity is first created. */
private static final String SOAP_ACTION = "http://Innovation/HRService/stringBs";
private static final String METHOD_NAME = "stringBs";
private static final String NAMESPACE = "http://Innovation/HRService/";
private static final String URL = "http://196.205.5.170/mdl/hrservice.asmx";
TextView tv;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
tv=(TextView)findViewById(R.id.text1);
call();
}
public void call()
{
try {
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
//PropertyInfo PI = new PropertyInfo();
//request.addProperty("a", "myprop");
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.setOutputSoapObject(request);
envelope.dotNet=true;
envelope.encodingStyle = SoapSerializationEnvelope.XSD;
HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
androidHttpTransport.call(SOAP_ACTION, envelope);
Object result = (Object)envelope.getResponse();
String results = result.toString();
tv.setText( ""+results);
} catch (Exception e) {
tv.setText(e.getMessage());
}
}
}
为什么我得到null响应,如何使用ksoap2将参数传递给webservice?
答案 0 :(得分:9)
而不是
request.addProperty("a", "myprop");
尝试使用
request.addProperty("arg0", "myprop");
我不是对ksoap2的期望,但我很确定这会将第一个参数的值设置为您的Web服务功能。对我来说很完美。
答案 1 :(得分:5)
通过传递来自j2me
的参数来调用webserviceSoapObject request = new SoapObject("http://www.webserviceX.NET", "GetCitiesByCountry");
String soapAction = "http://www.webserviceX.NET/GetCitiesByCountry";
request.addProperty("CountryName", "india");
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.bodyOut = request;
envelope.dotNet = true;
HttpTransport ht = new HttpTransport("http://www.webservicex.net/globalweather.asmx");
ht.debug = true;
//System.err.println( ht.requestDump );
ht.call(soapAction,envelope);
System.out.println("####################: " +envelope.getResponse());
//SoapObject result = (SoapObject)envelope.getResponse();
答案 2 :(得分:4)
我已经使用了2天了,我终于得到了解决方案。我提交完整的代码,希望这会有所帮助。它可以传递参数并获得响应。
在.net C#中的WebService文件内:
[WebService(Namespace = "http://something/webservice/v1")]
[WebMethod]
public DateTime[] Function(Guid organizationId, Guid categoryId)
{
return ...;
}
在Android代码中:
private final static String URL = "http://something/WebServices/WebService.asmx";
private final static String NAMESPACE = "http://something/webservice/v1";
public ArrayList<Object> getSoapObject(String METHOD_NAME, String SOAP_ACTION, Map<String, String> parameters){
try {
ArrayList<Object> sol = new ArrayList<Object>();
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
if(parameters != null){
for (Entry<String, String> para : parameters.entrySet()) {
request.addProperty(para.getKey(), para.getValue());
}
}
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.dotNet=true;
envelope.setOutputSoapObject(request);
Log.d("Body", envelope.bodyOut.toString());
HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
androidHttpTransport.call(SOAP_ACTION, envelope);
SoapObject result=(SoapObject)envelope.getResponse();
for(int i = 0; i < result.getPropertyCount(); i++){
sol.add(result.getProperty(i));
}
return sol;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public void getMenuEndDate(String orgId, String categoryId){
Date startDate = null;
Date endDate = null;
HashMap<String, String> parameters = new HashMap<String, String>();
parameters.put("organizationId", orgId);
parameters.put("categoryId", categoryId);
ArrayList<Object> sol = getSoapObject("Function", "http://something/webservice/v1/Function", parameters);
SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd");
try {
startDate = (Date)dateFormatter.parse(sol.get(0).toString());
endDate = (Date)dateFormatter.parse(sol.get(1).toString());
} catch (ParseException e) {
Log.d(TAG, "Exception i Date-Formatering");
e.printStackTrace();
}
}
要检查的事项:
答案 3 :(得分:4)
尝试评论该行:
envelope.dotNet = TRUE;
我做了同样的事情,当我读到这个属性是一个非常丑陋的黑客时,我将其评论为测试目的并且我的参数正确传递。
答案 4 :(得分:3)
您必须在客户端代码中声明参数类型:
SoapObject request = new SoapObject("http://tempuri.org/", "mymethod");
PropertyInfo p = new PropertyInfo();
p.setName("param_name_from_webservice");
p.setValue(true);
p.setType(Boolean.class);
request.addProperty(p);
答案 5 :(得分:0)
在这里您编写的代码顺序有问题,请不要担心,请尝试一下,这对我有用。
private class ConversionAsyncTask extends AsyncTask<Void,Void,Void> {
private SoapPrimitive response;
protected Void doInBackground(Void... params) {
SoapObject request = new SoapObject(NAMESPACE, METHOD);
request.addProperty("a","5");
SoapSerializationEnvelope soapEnvelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
soapEnvelope.setOutputSoapObject(request);
soapEnvelope.dotNet = true;
soapEnvelope.implicitTypes = true;
try {
HttpTransportSE aht = new HttpTransportSE(URL);
aht.call(SOAP_ACTION, soapEnvelope);
response = (SoapPrimitive) soapEnvelope.getResponse();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
protected void onPostExecute(Void result) {
super.onPostExecute(result);
temperatureTxt.setText("Status: " + response);
}
}