2012-09-24 29 views
6

Tôi có mã ứng dụng Android sau đây. Tôi đang cố gắng kết nối với một dịch vụ web thông qua HTTP. Dịch vụ web sử dụng trục apache. Tuy nhiên tôi đang chạy vào lỗi "Lỗi đọc XMLStreamReader" trong phản hồi. Tôi thực sự bị mắc kẹt và không chắc chắn những gì tôi có thể làm. Có thể nào là có các phiên bản khác nhau của HTTP client và SOAP đang được sử dụng trên máy chủ và phía máy khách? Bất kì sự giúp đỡ nào trong việc này đều rất được trân trọng. Dịch vụ web rất đơn giản: phương thức sayHello hiển thị đối số được đưa ra trong arg0 = some_stringLỗi đáp ứng phong bì SOAP: Lỗi khi đọc XMLStreamReader

public class MainActivity extends Activity { 
@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.activity_main, menu); 
    return true; 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 
    StrictMode.setThreadPolicy(policy); 

    BufferedReader in = null; 
    try { 
     HttpClient client = new DefaultHttpClient(); 
     HttpPost request = new HttpPost(
       "http://10.0.0.63:8080/archibus/cxf/HelloWorld/sayHello"); 
     request.addHeader("Content-Type", "text/xml"); 
     List<NameValuePair> postParameters = new ArrayList<NameValuePair>(); 
     postParameters.add(new BasicNameValuePair("arg0", "testing")); 
     UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(postParameters); 
     request.setEntity(formEntity); 

     HttpResponse response = client.execute(request); 

     in = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); 
     StringBuffer sb = new StringBuffer(""); 
     String line = ""; 
     String NL = System.getProperty("line.separator"); 
     while ((line = in.readLine()) != null) { 
      sb.append(line + NL); 
     } 
     in.close(); 

     String page = sb.toString(); 
     // Log.i(tag, page); 
     System.out.println(page); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } finally { 
     if (in != null) { 
      try { 
       in.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 
} 
+0

http://www.lalit3686.blogspot.in/2012/06/calling-soap-webservice-using- httppost.html –

Trả lời

7

Yêu cầu WebService của bạn không được xây dựng đúng cách. Bạn đang thực sự tạo một yêu cầu biểu mẫu chứ không phải yêu cầu SOAP thực tế.

yêu cầu SOAP là Tài liệu XML có phong bì và cơ thể xem ví dụ tại đây SOAP Message Example on Wikipedia.

Điều bạn đang thực sự thực hiện ở đây là cuộc gọi HTTP chuẩn mô phỏng biểu mẫu gửi chứ không phải cuộc gọi SOAP.

Bạn có hai giải pháp ở đây:

1- Bạn có thể bắt chước hành vi của một khách hàng SOAP bằng cách thủ công tạo ra các tài liệu XML và gửi nó. Bên cạnh đó thiết lập các tài liệu XML thích hợp theo yêu cầu của cơ thể đừng quên để thiết lập các tiêu đề thích hợp: SOAPAction, Content-Type và Content-Length

 RequestEntity requestEntity = new StringRequestEntity("<?xml version=\"1.0\"?><soap:Envelope xmlns:soap=\"http://www.w3.org/2003/05/soap-envelope\"><soap:Header></soap:Header><soap:Body><m:GetStockPrice xmlns:m=\"http://www.example.org/stock\"><m:StockName>IBM</m:StockName></m:GetStockPrice></soap:Body></soap:Envelope>"); 
    post.setRequestEntity(requestEntity); 

Cũng đừng quên để thay đổi không gian tên (m) ở trên với không gian tên thích hợp mà dịch vụ web của bạn đang sử dụng. và tên hoạt động (GetStockPrice) với thao tác bạn đang cố gọi. Cũng đừng quên tên và kiểu tham số.

2- Bạn có thể sử dụng Apache Axis để tạo ra một khách hàng và sử dụng khách hàng mà với ứng dụng của bạn

Xem chủ đề này để biết thêm thông tin và một khách hàng đề nghị How to call a SOAP web service on Android

2

Shoukry K là đúng. Bạn đã thực hiện yêu cầu HTTP POST. Đây không phải là một dịch vụ web xà phòng. Nếu bạn muốn biết cách gọi một dịch vụ web theo liên kết. http://www.youtube.com/watch?v=v9EowBVgwSo. Đảm bảo bạn tải xuống tệp jar ksoap mới nhất.

1

Mã mẫu sử dụng K-SOAP cho Android.

private void sendSOAPmsg(DamageAssessmentFormPojo pojo) throws IOException, XmlPullParserException, SoapFault { 
     SoapObject request = new SoapObject(WEBSERVICE.NAMESPACE, WEBSERVICE.METHOD_NAME_SUBMIT_REPORT); 
     request.addProperty("xmlBytes", Util.getSoapBase64String(pojo)); 
     request.addProperty("fileName", IO.DefaultReportName); 
     request.addProperty("deviceId", AppConstants.IMEI != null ? AppConstants.IMEI : Util.getIMEI(this)); 

     SoapPrimitive response = sendSOAPEnvelope(request, WEBSERVICE.SOAP_ACTION_SUBMIT_REPORT); 

     if (response.toString().equalsIgnoreCase("true")) { 
      Logger.logInfo("REPORT SENT SUCCESSFULLY", "WEB-SERVICE"); 
      pojo.setReportSent(true); 
      IO.writeObject(pojo.getReportsFolderPath() + IO.DefaultReportName, pojo); 
     } else { 
      Logger.logInfo("REPORT SENT FAILED", "WEB-SERVICE - RESONSE " + response.toString()); 
     } 
    } 

    private SoapPrimitive sendSOAPEnvelope(SoapObject request, String soapAction) throws IOException, XmlPullParserException, SoapFault { 
     SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 
     envelope.dotNet = true; 
     envelope.setOutputSoapObject(request); 
     HttpTransportSE androidHttpTransport = new HttpTransportSE(WEBSERVICE.URL); 

     androidHttpTransport.call(soapAction, envelope); 
     SoapPrimitive response = (SoapPrimitive) envelope.getResponse(); 

     return response; 

    } 

    private boolean sendSOAPimage(String strImg, File pFile) throws IOException, XmlPullParserException { 
     boolean result = false; 

     if (strImg != null) { 
      SoapObject request = new SoapObject(WEBSERVICE.NAMESPACE, WEBSERVICE.METHOD_NAME_SUBMIT_IMAGE); 
      request.addProperty("imageBytes", strImg); 
      request.addProperty("fileName", pFile.getName()); 
      request.addProperty("deviceId", AppConstants.IMEI != null ? AppConstants.IMEI : Util.getIMEI(this)); 

      SoapPrimitive response = sendSOAPEnvelope(request, WEBSERVICE.SOAP_ACTION_SUBMIT_MAGE); 

      if (response.toString().equalsIgnoreCase("true")) { 

       result = true; 

       Logger.logInfo("IMAGE SENT SUCCESSFULLY", "WEB-SERVICE"); 

      } else { 
       Logger.logInfo("IMAGE SENT FAILED", "WEB-SERVICE - RESONSE " + response.toString()); 
      } 

     } 

     return result; 
    } 

// -------- util Helper Method

public static String getSoapBase64String(DamageAssessmentFormPojo pojo) { 


     XmlSerializer xmlSerializer = Xml.newSerializer(); 
     StringWriter writer = new StringWriter(); 

     try { 
      xmlSerializer.setOutput(writer); 
      xmlSerializer.startDocument("UTF-8", true); 

      xmlSerializer.startTag("", XMLTags.TAG_ROD); 
      xmlSerializer.startTag("", XMLTags.TAG_ORDER); 

      xmlSerializer.startTag("", XMLTags.TAG_SEVERITY); 
      xmlSerializer.text(pojo.getCheckedSeverity_Complexity()); 
      xmlSerializer.endTag("", XMLTags.TAG_SEVERITY); 

      xmlSerializer.startTag("", XMLTags.TAG_DAMAGE_TYPE); 
      StringBuilder builder = new StringBuilder(); 
      for (String str : pojo.getCheckedDamageTypes()) { 

       builder.append(str + " , "); 

      } 
      xmlSerializer.text(builder.toString()); 
      xmlSerializer.endTag("", XMLTags.TAG_DAMAGE_TYPE); 

      xmlSerializer.startTag("", XMLTags.TAG_ENV_IMPACT); 
      xmlSerializer.text(pojo.getCheckedEnvImpact()); 
      xmlSerializer.endTag("", XMLTags.TAG_ENV_IMPACT); 

      xmlSerializer.startTag("", XMLTags.TAG_ENV_COMMENT); 
      xmlSerializer.text(pojo.getEnvImpactComments()); 
      xmlSerializer.endTag("", XMLTags.TAG_ENV_COMMENT); 

      xmlSerializer.startTag("", XMLTags.TAG_TRAVEL_CONDITION); 
      xmlSerializer.text(pojo.getCheckedTravelCond()); 
      xmlSerializer.endTag("", XMLTags.TAG_TRAVEL_CONDITION); 

      xmlSerializer.startTag("", XMLTags.TAG_TRAVEL_COMMENT); 
      xmlSerializer.text(pojo.getTravCondComments()); 
      xmlSerializer.endTag("", XMLTags.TAG_TRAVEL_COMMENT); 

      xmlSerializer.startTag("", XMLTags.TAG_ORDER_DATE); 
      xmlSerializer.text(pojo.getDateTime()); 
      xmlSerializer.endTag("", XMLTags.TAG_ORDER_DATE); 

      xmlSerializer.endTag("", "Order"); 
      xmlSerializer.endTag("", "ROD"); 

      xmlSerializer.endDocument(); 

     } catch (IllegalArgumentException e) { 
      Logger.logException(e); 
     } catch (IllegalStateException e) { 
      Logger.logException(e); 
     } catch (IOException e) { 
      Logger.logException(e); 
     } 

     return Base64.encode(writer.toString().getBytes()); 
    } 
Các vấn đề liên quan