2010-01-21 3 views
10

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

Когда я вызываю веб-метод без параметров, он отлично работает. Когда я прихожу к параметру в веб-методе, я получаю null (при отладке веб-службы, которую я обнаружил), и я получаю 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()); 
      } 
    } 


} 

Почему я получаю нулевой ответ, как я прохожу параметр в WebService с помощью ksoap2?

+0

Может быть, эта нить может помочь http://stackoverflow.com/questions/1052300/how-to-call-a-net-webservice- from-android-using-ksoap2 Я также начинаю использовать ksoap2 на основе затмения с нуля. – Forrest

ответ

5

Вызов веб-сервиса путем передачи параметров из 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(); 
9

Вместо

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

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

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

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

4

Я работаю с этим в течение 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(); 
     } 

    } 

вещей, чтобы проверить:

  • Названы параметры точно так же, как и проверены в веб-службе?
  • Проверьте, используете ли вы трейлинг «/» для пространства имен. Имейте то же самое в своем приложении.
4

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

envelope.dotNet = истина;

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

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