2012-02-22 2 views
4

Мне нужно создать запрос на мыло, подобный этому.Создайте запрос SOAP с помощью KSOAP Android

SOAP-ЗАПРОС

POST /TennisMasters/TennisMasters.Listener.asmx HTTP/1.1 
Host: playinkstudio.com 
Content-Type: text/xml; charset=utf-8 
Content-Length: length 
SOAPAction: "http://playinktennismasters.com/authenticateUser" 

    <?xml version="1.0" encoding="utf-8"?> 
    <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
     <soap:Body> 
     <authenticateUser xmlns="http://playinktennismasters.com/"> 
      <user>string</user> 
     </authenticateUser> 
     </soap:Body> 
    </soap:Envelope> 

Я использую KSOAP2, чтобы построить этот запрос.

private static String SOAP_ACTION = "http://playinktennismasters.com/authenticateUser"; 
private static String NAMESPACE = "http://playinktennismasters.com/"; 
private static String METHOD_NAME = "authenticateUser"; 
private static String URL = "http://playinkstudio.com/TennisMasters/TennisMasters.Listener.asmx"; 

    SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); 
    request.addProperty("user", "A Json String will be here"); 

    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
      SoapEnvelope.VER12); 
    envelope.dotNet = true; 
    envelope.setOutputSoapObject(request); 
    HttpTransportSE androidHttpTransport = new HttpTransportSE(URL); 
    androidHttpTransport.debug = true; 
    try { 
     androidHttpTransport.call(SOAP_ACTION, envelope); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

Это запрос, который я получил от отладки.

<v:Envelope xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:d="http://www.w3.org/2001/XMLSchema" xmlns:c="http://www.w3.org/2003/05/soap-encoding" xmlns:v="http://www.w3.org/2003/05/soap-envelope"> 
<v:Header /> 
<v:Body> 
<authenticateUser xmlns="http://playinktennismasters.com/" **id="o0" c:root="1"**> 
<user **i:type="d:string"**>{"email":"[email protected]","UserDate":"Feb 22, 2012 7:01:24 PM","GearId":0,"GearValue":0,"Income":0,"Level":0,"MatchResult":0,"MatchType":0,"OfferId":0,"OpponentId":0,"Partners":0,"ExhibitionCount":0,"PowerRuns":0,"PowerServes":0,"PowerShots":0,"Seeds":0,"Energy":0,"Cash":0,"Stamina":0,"Strength":0,"SubLevel":0,"TotalEnergy":0,"TotalStamina":0,"TrainingId":0,"Agility":0,"UserId":0,"Age":0,"ActivityId":0,"gearIsGift":0}</user> 
</authenticateUser> 
</v:Body> 
</v:Envelope> 

Я не знаю, почему дополнительные атрибуты, такие как «ид» и «C: корень» добавляются в authenticateUser. и дополнительный атрибут в i: type = "d: String". Пожалуйста, можете прийти, чтобы кто-нибудь дал мне хороший пример или учебник, который может помочь мне создать запрос, как указано выше, действительно нужна помощь.

+0

Я принял первый запрос, который вы показали, вы получили его от soapUI? вы должны знать, что конверт ksoap2 выглядит немного иначе, чем мыло, скажем, например, из Java-программы, выполненной в netbeans с использованием обычного мыла. Это не проблема, оба получат одинаковый результат, это просто xml. Получаете ли вы ошибку из вашего запроса или вас просто беспокоят дополнительные добавленные атрибуты? – shadesco

+0

HI, пожалуйста, соедините меня в этом чате .. У меня есть некоторые сомнения, поэтому, https: //chat.stackoverflow.com/rooms/146715/soap –

ответ

1

Наконец-то он работал с KSOAP. Вот код, который я использовал, может быть, это поможет кому-то.

final SoapObject request = new SoapObject(AppConsts.NAMESPACE, 
       usecaseString); 
     request.addProperty(addPropertyString, propertyJsonString); 
     final SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
       SoapEnvelope.VER11); 
     envelope.dotNet = true; 
     envelope.setOutputSoapObject(request); 
     final HttpTransportSE androidHttpTransport = new HttpTransportSE(
       AppConsts.URL); 
     androidHttpTransport.debug = true; 
     String soapAction = AppConsts.NAMESPACE + usecaseString; 

     try { 
      androidHttpTransport.call(soapAction, envelope); 
      SoapPrimitive resultSoapPrimitive; 
      resultSoapPrimitive = (SoapPrimitive) envelope.getResponse(); 
      if (resultSoapPrimitive != null) { 
       result = resultSoapPrimitive.toString(); 
       if (AppConsts.ENABLE_LOG) 
        Log.d(AppConsts.GAME_TITLE, "result json : " + result); 
      } else { 
       if (AppConsts.ENABLE_LOG) 
        Log.d(AppConsts.GAME_TITLE, "result json is NULL!!! "); 

      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
      Log.e("static", "Exception in making call to server"); 
     } 

Для создания вышеуказанного запроса эти три параметра необходимо передать в код.

AppConsts.NAMESPACE = "http://playinktennismasters.com" 
usecaseString = "authenticateUser" 
addPropertyString = "user" 
+0

wt был ur url? .svc или .asmx? – Ronnie

+0

Я получаю a: InternalServiceFault – Ronnie

+0

Это было .asmx ... – Waqas

5

Я использовал простой HttpClient и Httppost, Простая строка для запроса Конверт.

 String temp = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" 
      + "<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">" 
      + "<soap:Body>" 
      + "<authenticateUser xmlns=\"http://playinktennismasters.com/\">" 
      + "<user>%s</user>" + "</authenticateUser>" + "</soap:Body>" 
      + "</soap:Envelope>"; 
    ENVELOPE = String.format(temp, user); 

Теперь с использованием метода, который будет создавать оставшиеся параметры после запроса и вернет ответную строку.

public String CallWebService(String url, String soapAction, String envelope) { 
    final DefaultHttpClient httpClient = new DefaultHttpClient(); 
    // request parameters 
    HttpParams params = httpClient.getParams(); 
    HttpConnectionParams.setConnectionTimeout(params, 10000); 
    HttpConnectionParams.setSoTimeout(params, 15000); 
    // set parameter 
    HttpProtocolParams.setUseExpectContinue(httpClient.getParams(), true); 

    // POST the envelope 
    HttpPost httppost = new HttpPost(url); 
    // add headers 
    httppost.setHeader("soapaction", soapAction); 
    httppost.setHeader("Content-Type", "text/xml; charset=utf-8"); 

    String responseString = "Nothingggg"; 
    try { 

     // the entity holds the request 
     HttpEntity entity = new StringEntity(envelope); 
     httppost.setEntity(entity); 

     // Response handler 
     ResponseHandler<String> rh = new ResponseHandler<String>() { 
      // invoked when client receives response 
      public String handleResponse(HttpResponse response) 
        throws ClientProtocolException, IOException { 

       // get response entity 
       HttpEntity entity = response.getEntity(); 

       // read the response as byte array 
       StringBuffer out = new StringBuffer(); 
       byte[] b = EntityUtils.toByteArray(entity); 

       // write the response byte array to a string buffer 
       out.append(new String(b, 0, b.length)); 
       return out.toString(); 
      } 
     }; 

     responseString = httpClient.execute(httppost, rh); 

    } catch (Exception e) { 
     e.printStackTrace(); 
     Log.d("me","Exc : "+ e.toString()); 

    } 

    // close the connection 
    httpClient.getConnectionManager().shutdown(); 
    return responseString; 
} 
4

удалить ID ес: корневые атрибуты установить украшения ложь:

envelope.setAddAdornments(false); 

для удаления I: тип атрибута, для SimpleTypes, установите неявные типы истинного

envelope.implicitTypes = true; 

но при работе с ComplexTypes, чтобы удалить «i: type», вам понадобится ksoap 3.0.0 RC1 или выше. Im с использованием 3.0.0 RC2 к настоящему времени, но я обновляю до стабильной версии 3.0.0, когда она станет доступной.

+0

Через 3 года вы спасли мой день! Большое спасибо! –

Смежные вопросы