Как передать параметр в веб-сервис, используя ksoap2? - PullRequest
10 голосов
/ 21 января 2010

Я использую Eclipse IDE для разработки приложения для Android. Я пытаюсь подключиться к веб-сервису .net. Я использую ksoap2 версии 2.3

Когда я вызываю веб-метод без параметров, он работает нормально. Когда я передаю параметр веб-методу, я получаю ноль (при отладке веб-службы я обнаружил это) и получаю ноль из веб-метода в коде на стороне клиента.

Код:

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


}

Почему я получаю нулевой ответ, как передать параметр в веб-сервис, используя ksoap2?

Ответы [ 6 ]

9 голосов
/ 01 июня 2010

вместо

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

попробуйте использовать

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

Я не ожидаю от ksoap2, но я уверен, что это устанавливает значение первого параметра для функции веб-службы. Отлично сработало для меня.

5 голосов
/ 04 марта 2010

Вызов веб-сервиса путем передачи параметров из j2me

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();
4 голосов
/ 09 августа 2011

Попробуйте закомментировать строку:

envelope.dotNet = истина;

Я сделал то же самое, что и вы, и когда я прочитал о том, что это свойство действительно ужасно взломано, я прокомментировал его для целей тестирования, и мой параметр был передан правильно.

4 голосов
/ 12 июля 2011

Я работаю с этим уже 2 дня и наконец-то нашел решение. Я отправляю свой полный код и надеюсь, что это поможет. Может передавать параметры и получать ответ.

Внутри файла WebService в .net C #:

[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 голосов
/ 29 сентября 2012

Вы должны будете объявить тип параметра в коде клиента:

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);
0 голосов
/ 20 сентября 2018

Здесь проблема с порядком кодов, который вы написали, не беспокойтесь. Попробуйте, это сработало для меня.

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