如何使用简单的String(字符串格式的xml)调用SOAP Web服务

我有这个代表XML的字符串:

String soapCall="   "; soapCall+=idApp; soapCall+=""; soapCall+=versonApp; soapCall+=" Android   "; 

我有这个肥皂网络服务:

 http://stats.mywebsite.com/ws/adddownload 

现在,我需要将该字符串传递给android上的soap webservice,但我不知道方式,我知道我需要使用httpcliente:

 HttpClient httpClient = new DefaultHttpClient(); HttpContext localContext = new BasicHttpContext(); 

但我不知道如何用该字符串调用soapwebservice。

有人有代码示例吗? 我在谷歌上找不到它。 我不想使用图书馆,我需要自己做

谢谢

编辑:这是现在的代码,但它无法正常工作,我得到错误500内部服务器错误:

  public static byte[] addDownloadIntoServer(){ byte[] result = null; String SERVER_URL="http://stats.mywebsite.com/ws/server.php"; String SOAP_ACTION="addDownload"; String body=""; body+="" +SectionManager.instance.app_id+""; body+=""+SectionManager.instance.app_version+""; body+="android Android "; HttpParams httpParameters = new BasicHttpParams(); // Set the timeout in milliseconds until a connection is established. int timeoutConnection = 15000; HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection); // Set the default socket timeout (SO_TIMEOUT) // in milliseconds which is the timeout for waiting for data. int timeoutSocket = 35000; HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket); DefaultHttpClient httpclient = new DefaultHttpClient(httpParameters); /* * httpclient.getCredentialsProvider().setCredentials( new * AuthScope("os.icloud.com", 80, null, "Digest"), new * UsernamePasswordCredentials(username, password)); */ HttpPost httppost = new HttpPost(SERVER_URL ); httppost.setHeader("soapaction", SOAP_ACTION); httppost.setHeader("Content-Type", "text/xml; charset=utf-8"); System.out.println("executing request" + httppost.getRequestLine()); //now create a soap request message as follows: final StringBuffer soap = new StringBuffer(); soap.append("\n"); soap.append(""); // this is a sample data..you have create your own required data BEGIN soap.append(" \n"); soap.append(" \n"); soap.append("" + body); soap.append(" \n"); soap.append(" \n"); /* soap.append(body); */ // END of MEssage Body soap.append(""); Log.i("SOAP Request", ""+soap.toString()); // END of full SOAP request message try { HttpEntity entity = new StringEntity(soap.toString(),HTTP.UTF_8); httppost.setEntity(entity); HttpResponse response = httpclient.execute(httppost);// calling server HttpEntity r_entity = response.getEntity(); //get response Log.i("Reponse Header", "Begin..."); // response headers Log.i("Reponse Header", "StatusLine:"+response.getStatusLine()); Header[] headers = response.getAllHeaders(); for(Header h:headers) Log.i("Reponse Header",h.getName() + ": " + h.getValue()); Log.i("Reponse Header", "END..."); if (r_entity != null) { result = new byte[(int) r_entity.getContentLength()]; if (r_entity.isStreaming()) { DataInputStream is = new DataInputStream( r_entity.getContent()); is.readFully(result); } } }catch (Exception E) { Log.i("Exception While Connecting", ""+E.getMessage()); E.printStackTrace(); } httpclient.getConnectionManager().shutdown(); //shut down the connection return result; } 

解:

 private byte[] callSOAPServer() { byte[] result = null; HttpParams httpParameters = new BasicHttpParams(); // Set the timeout in milliseconds until a connection is established. int timeoutConnection = 15000; HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection); // Set the default socket timeout (SO_TIMEOUT) // in milliseconds which is the timeout for waiting for data. int timeoutSocket = 35000; HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket); DefaultHttpClient httpclient = new DefaultHttpClient(httpParameters); /* * httpclient.getCredentialsProvider().setCredentials( new * AuthScope("os.icloud.com", 80, null, "Digest"), new * UsernamePasswordCredentials(username, password)); */ HttpPost httppost = new HttpPost(SERVER_URL ); httppost.setHeader("soapaction", SOAP_ACTION); httppost.setHeader("Content-Type", "text/xml; charset=utf-8"); System.out.println("executing request" + httppost.getRequestLine()); //now create a soap request message as follows: final StringBuffer soap = new StringBuffer(); soap.append("\n"); soap.append(""); // this is a sample data..you have create your own required data BEGIN soap.append(" \n"); soap.append(" \n"); soap.append("" + body); soap.append(" \n"); soap.append(" \n"); /* soap.append(body); */ // END of MEssage Body soap.append(""); Log.i("SOAP Request", ""+soap.toString()); // END of full SOAP request message try { HttpEntity entity = new StringEntity(soap.toString(),HTTP.UTF_8); httppost.setEntity(entity); HttpResponse response = httpclient.execute(httppost);// calling server HttpEntity r_entity = response.getEntity(); //get response Log.i("Reponse Header", "Begin..."); // response headers Log.i("Reponse Header", "StatusLine:"+response.getStatusLine()); Header[] headers = response.getAllHeaders(); for(Header h:headers){ Log.i("Reponse Header",h.getName() + ": " + h.getValue()); } Log.i("Reponse Header", "END..."); if (r_entity != null) { result = new byte[(int) r_entity.getContentLength()]; if (r_entity.isStreaming()) { DataInputStream is = new DataInputStream( r_entity.getContent()); is.readFully(result); } } } catch (Exception E) { Log.i("Exception While Connecting", ""+E.getMessage()); E.printStackTrace(); } httpclient.getConnectionManager().shutdown(); //shut down the connection return result; } 

2)你必须解析上面函数返回的byteArray的输出。 例如:

 byte[] initReqrepsonse = callSOAPServer(soapBodymessage ); ByteArrayInputStream bais=new ByteArrayInputStream(initReqrepsonse); // now parse the xml as /** Handling XML */ SAXParserFactory spf = SAXParserFactory.newInstance(); SAXParser sp = spf.newSAXParser(); XMLReader xr = sp.getXMLReader(); /** Create handler to handle XML Tags ( extends DefaultHandler ) */ // ResponseParser is XML parser class which will parse the XML output. ResponseParser myXMLHandler = new ResponseParser(); xr.setContentHandler(myXMLHandler); Log.i("XML data", bais.toString()); xr.parse(new InputSource(bais)); 

这样,您可以在没有第三方库的情况下访问任何SOAP Web服务方法。 如果需要更正,请告诉我。

 package ProductVerificationCard.in; import org.ksoap2.SoapEnvelope; import org.ksoap2.serialization.SoapObject; import org.ksoap2.serialization.SoapSerializationEnvelope; import org.ksoap2.transport.HttpTransportSE; import android.app.Activity; import android.content.Intent;`` import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; public class AdminLogin extends Activity { /** Called when the activity is first created. */ Button btn_ok; TextView textView; private static final String SOAP_ACTION = "http://tempuri.org/Login"; private static final String OPERATION_NAME = "Login"; private static final String WSDL_TARGET_NAMESPACE = "http://tempuri.org/"; private static final String SOAP_ADDRESS = "http://10.0.2.2/new/WebService.asmx"; String s; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); btn_ok=(Button) findViewById(R.id.btn_login); textView=(TextView) findViewById(R.id.tv_error); btn_ok.setOnClickListener(new OnClickListener() { public void onClick(View v) { SoapObject request = new SoapObject(WSDL_TARGET_NAMESPACE, OPERATION_NAME); SoapSerializationEnvelope envelope = new SoapSerializationEnvelope( SoapEnvelope.VER11); envelope.dotNet = true; envelope.setOutputSoapObject(request); HttpTransportSE httpTransport = new HttpTransportSE(SOAP_ADDRESS); try { httpTransport.call(SOAP_ACTION, envelope); Object response = envelope.getResponse(); //textView.setText(response.toString()); s=response.toString(); if(s=="true") { Intent intent=new Intent(AdminLogin.this,MenuForm.class); startActivity(intent); } else { textView.setText("Enter Valid Username or Password"); } } catch (Exception exception) { textView.setText(exception.toString()); } // TODO Auto-generated method stub } }); } } 
 Formatted answer : import java.io.BufferedReader; import java.io.InputStreamReader; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.HttpStatus; import org.apache.commons.httpclient.methods.PostMethod; /** * * This program demonstrates consuming web service using Apache HTTPClient and * SOAP message. * Reference: * http://www.webservicex.net/stockquote.asmx?op=GetQuote * ClassPath: Keep these * two files in class path: commons-httpclient-3.0.1.jar, commons-codec-1.4.jar * @author * Bhavani P Polimetla * @since April-27-2011 */ public class WSClient { public static void main(String args[]) { HttpClient httpClient = new HttpClient(); httpClient.getParams().setParameter("http.useragent", "Web Service Test Client"); BufferedReader br = null; String data = " " + " " + " " + " " + "INFY " + " " + " "; PostMethod methodPost = new PostMethod( "http://www.webservicex.net/stockquote.asmx?op=GetQuote"); methodPost.setRequestBody(data); methodPost.setRequestHeader("Content-Type", "text/xml"); try { int returnCode = httpClient.executeMethod(methodPost); if (returnCode == HttpStatus.SC_NOT_IMPLEMENTED) { System.out .println("The Post method is not implemented by this URI"); methodPost.getResponseBodyAsString(); } else { br = new BufferedReader(new InputStreamReader( methodPost.getResponseBodyAsStream())); String readLine; while (((readLine = br.readLine()) != null)) { System.out.println(readLine); } } } catch (Exception e) { e.printStackTrace(); } finally { methodPost.releaseConnection(); if (br != null) try { br.close(); } catch (Exception fe) { fe.printStackTrace(); } } } }