Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/230.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用ksoap2将参数传递给Web服务?_Java_Android_Web Services_Parameters_Ksoap2 - Fatal编程技术网

Java 如何使用ksoap2将参数传递给Web服务?

Java 如何使用ksoap2将参数传递给Web服务?,java,android,web-services,parameters,ksoap2,Java,Android,Web Services,Parameters,Ksoap2,我正在使用EclipseIDE开发一个android应用程序。我正在尝试连接到.net Web服务。我正在使用ksoap2 2.3版 当我调用一个没有参数的webmethod时,它可以正常工作。当我向webmethod传递参数时,我得到null(在调试我发现的webservice时),并且在客户端代码中从webmethod得到null 代码: 为什么要得到空响应,如何使用ksoap2将参数传递给Web服务?通过从j2me传递参数来调用Web服务 SoapObject request = new

我正在使用EclipseIDE开发一个android应用程序。我正在尝试连接到.net Web服务。我正在使用ksoap2 2.3版

当我调用一个没有参数的webmethod时,它可以正常工作。当我向webmethod传递参数时,我得到null(在调试我发现的webservice时),并且在客户端代码中从webmethod得到null

代码:


为什么要得到空响应,如何使用ksoap2将参数传递给Web服务?

通过从j2me传递参数来调用Web服务

SoapObject 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();
而不是

    request.addProperty("a", "myprop"); 
试用

    request.addProperty("arg0", "myprop");         

我不是ksoap2上的expect,但我非常确定这会为您的web服务函数设置第一个参数的值。这对我来说非常有效。

我已经用了两天时间,终于找到了解决方案。我提交了我的完整代码,希望这会有所帮助。它可以传递参数并获得响应

在.net C中的WebService文件中:

[WebService(Namespace = "http://something/webservice/v1")]

[WebMethod]
public DateTime[] Function(Guid organizationId, Guid categoryId)
    {
        return ...;
    }
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();
        }

    }
安卓代码内部:

[WebService(Namespace = "http://something/webservice/v1")]

[WebMethod]
public DateTime[] Function(Guid organizationId, Guid categoryId)
    {
        return ...;
    }
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();
        }

    }
private最终静态字符串URL=”http://something/WebServices/WebService.asmx";
私有最终静态字符串命名空间=”http://something/webservice/v1";
公共ArrayList getSoapObject(字符串方法\u名称、字符串SOAP\u操作、映射参数){
试一试{
ArrayList sol=新的ArrayList();
SoapObject请求=新的SoapObject(名称空间、方法名称);
if(参数!=null){
for(条目段:parameters.entrySet()){
request.addProperty(para.getKey(),para.getValue());
}
}
SoapSerializationEnvelope=新的SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.dotNet=true;
envelope.setOutputSoapObject(请求);
Log.d(“Body”,envelope.bodyOut.toString());
HttpTransportSE androidHttpTransport=新的HttpTransportSE(URL);
调用(SOAP_操作,信封);
SoapObject结果=(SoapObject)envelope.getResponse();
对于(int i=0;i
检查事项:

  • 命名的参数是否与Web服务中的预期参数完全相同
  • 检查名称空间是否使用尾随“/”。在你的申请中也有同样的要求

试着注释这句话:

envelope.dotNet=true


我做了与您相同的事情,当我了解到此属性是一个非常丑陋的黑客行为时,出于测试目的,我对其进行了注释,我的参数正确通过。

您必须在客户端代码中声明参数类型:

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);

在这里,你写的代码顺序有问题,别担心,试试这个,它对我有用

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);
    }
}
私有类转换AsyncTask扩展AsyncTask{
私人原始反应;
受保护的Void doInBackground(Void…参数){
SoapObject请求=新的SoapObject(名称空间、方法);
请求。添加财产(“a”、“5”);
SoapSerializationEnvelope soapEnvelope=新的SoapSerializationEnvelope(soapEnvelope.VER11);
setOutputSoapObject(请求);
soapEnvelope.dotNet=true;
soapEnvelope.implicitTypes=true;
试一试{
HttpTransportSE aht=新的HttpTransportSE(URL);
aht.call(SOAP\u动作,soapEnvelope);
响应=(SoapPrimitive)soapEnvelope.getResponse();
}捕获(例外e){
e、 printStackTrace();
}
返回null;
}
受保护的void onPostExecute(void结果){
super.onPostExecute(结果);
TemperatureText.setText(“状态:+响应”);
}
}
也许这个线程可以帮助我从零开始使用基于eclipse的ksoap2。