2011-02-10 4 views
3

.net Webservice로 연결하는 동안 안드로이드 프로젝트에서 Ksoap2를 사용할 때 몇 가지 문제가 있습니다. Wsouth 매개 변수를 호출하는 한 모든 것이 잘 작동하지만 매개 변수를 추가하려고하면 서버에서 매개 변수를 가져 오지 않습니다. 여기 ... 내가 보내 문자열 + 매개 변수를 반환하는 서버 측을 harcode 내 코드KSoap2 + Android + .net Ws = Null

import java.util.Vector; 

import org.ksoap2.SoapEnvelope; 
import org.ksoap2.serialization.PropertyInfo; 
import org.ksoap2.serialization.SoapObject; 
import org.ksoap2.serialization.SoapPrimitive; 
import org.ksoap2.serialization.SoapSerializationEnvelope; 
import org.ksoap2.transport.AndroidHttpTransport; 

import android.app.Activity; 
import android.os.Bundle; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 
import android.widget.TextView; 
import android.widget.Toast; 

public class ServicioWeb extends Activity { 

SoapObject response; 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    // String NAMESPACE = "http://tempuri.org/"; 
    String NAMESPACE = "IDBN.WS"; 
    String METHOD_NAME = "getClientesByName"; 
    //String SOAP_ACTION = "http://tempuri.org/getClientesByName"; 
    String SOAP_ACTION = "IDBN.WS/getClientesByName"; 
    //String URL = "http://www.ws.idbnar2.com.ar/wsClientes.asmx"; 
    String URL = "http://www.ws.idbnar2.com.ar/wsClientes.asmx"; 
    SoapObject Request = new SoapObject(NAMESPACE, METHOD_NAME); 
    PropertyInfo pi = new PropertyInfo(); 
    pi.setName("Nombre"); 
    pi.setValue("RIQUELME"); 
    pi.setType(int.class); 
    Request.addProperty(pi); 

    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 
    envelope.dotNet = true; 
    envelope.setOutputSoapObject(Request); 
    AndroidHttpTransport androidHttpTransport = new AndroidHttpTransport(URL); 
    ListView Lista = (ListView)findViewById(R.id.Lista); 

    try 
    { 
     androidHttpTransport.call(SOAP_ACTION, envelope); 
     response = (SoapObject)envelope.getResponse(); 
     String[] Clientes = getStringArrayResponse(response, null); 
     Lista.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,Clientes)); 
    } 
    catch(Exception e) 
    { 
     Toast toast = Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG); 
     toast.show(); 
    } 
} 

public String[] getStringArrayResponse(SoapObject node, Vector<String> strings) { 
    boolean isFirstCall = false; 
    if (strings == null) { 
     isFirstCall = true; 
     strings = new Vector<String>(); 
    } 
    int count = response.getPropertyCount(); 
    for (int i = 0; i < count; i++) { 
     Object obj1 = node.getProperty(i); 
     if (obj1 instanceof SoapObject) { 
      // don't recurse empty objects 
      if (((SoapObject)obj1).getPropertyCount() > 0) { 
       // recurse into another node to process its nodes/primitives 
       getStringArrayResponse((SoapObject)obj1, strings); 
      } 
     } else if (obj1 instanceof SoapPrimitive) { 
      strings.add(((SoapPrimitive)obj1).toString()); 
     } 
    } 
    // only make this for the original caller 
    if (isFirstCall) { 
     return (String[])strings.toArray(new String[strings.size()]); 
    } 
    return null; 
} 
} 

그리고 지금은 모두 내가 그것을 하드 코딩 된 부분 얻을, 내가있는 비누 오브제에 추가 매개 변수처럼 보인다 서버에 수신되지 않습니다.

Allready try : -) "envelope.dotNet = true;"를 사용하지 않고 웹 서비스 -의 네임 스페이스에서 "http : //"를 제거하십시오. -) 요청에 직접 속성 추가

어떤 아이디어가 잘못 되었습니까 ???

답변

2

이 라인은 나를 혼란스럽게 :

PropertyInfo pi = new PropertyInfo(); 
pi.setName("Nombre"); 
pi.setValue("RIQUELME"); 
pi.setType(int.class); 
Request.addProperty(pi); 

왜 정수에 대한 값으로 문자열 ("리켈메")를 사용합니까?

코드를 실행하면 어떻게 될까요? envelope.debug = true으로 설정하십시오. 중단 점을 설정하고 envelope.requestDumpenvelope.responseDump 값을 검사하는 중입니다. 그렇게하면 전송 된 내용과 수신 된 내용을 볼 수 있습니다.

0
pi.setName("Nombre"); 
    pi.setValue("RIQUELME"); 
    pi.setType(int.class); 
    Request.addProperty(pi); 

pi.setValue는 또는이 pi.setType 당신은 할 필요가 없습니다 ,

string.class 수 또는한다 정수 (1, 2, 등)해야 하나 pi.setType. 해당 행을 삭제하면 제대로 작동합니다.