2013-05-02 55 views
0

我创建了一个Android应用程序,该应用程序必须连接到存储在数据库(托管在免费托管站点中)的Web服务(由我创建)。 Web服务需要latitude,longitudetext存储在数据库中,如果我使用它,它的工作效果会很好。从Web服务获取响应时出错

但我无法使用我的Android应用程序中的Web服务。 下面是代码:

package com.example.mobile; 

import java.io.IOException; 

import org.ksoap2.SoapEnvelope; 
import org.ksoap2.serialization.SoapObject; 
import org.ksoap2.serialization.SoapPrimitive; 
import org.ksoap2.serialization.SoapSerializationEnvelope; 
import org.ksoap2.transport.HttpTransportSE; 
import org.xmlpull.v1.XmlPullParserException; 

import android.os.Bundle; 
import android.app.Activity; 
import android.content.Intent; 
import android.util.Log; 
import android.view.Menu; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.TextView; 
import android.os.AsyncTask; 


public class WebServiceActivity extends Activity implements OnClickListener { 

    public final static String SOAP_ACTION1 = "http://ocrwebservice.somee.com/InsertIntoDB"; 
    public final static String SOAP_ACTION2 = "http://ocrwebservice.somee.com/Testing"; 
    public final static String NAMESPACE = "http://ocrwebservice.somee.com/"; 
    public final static String METHOD_NAME1 = "InsertIntoDB"; 
    public final static String METHOD_NAME2 = "Testing"; 
    public final static String URL = "http://ocrwebservice.somee.com/Service1.asmx?WSDL"; 

    Bundle extras; 
    TextView tvResult; 
    Button btnMenu; 
    String ocr; 
    int test_or_train; //valore sentinella 
    String gps, latitude, longitude; 
    double latitudine, longitudine; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_web_service); 

     tvResult = (TextView)findViewById(R.id.textViewResult); 
     btnMenu = (Button)findViewById(R.id.buttonGoToMenu); 

     extras = getIntent().getExtras(); 
     ocr = extras.getString(RecognitionActivity.OCRTEXT); 
     gps = extras.getString(RecognitionActivity.GPS); 
     test_or_train = extras.getInt(RecognitionActivity.TEST_OR_TRAIN); 

     String [] coordinate = gps.split("#"); 
     latitude = coordinate[0]; 
     longitude = coordinate[1]; 

     Log.d("VALORI", latitude); 
     Log.d("VALORI", longitude); 

     //latitudine = Double.parseDouble(latitude); 
     //longitudine = Double.parseDouble(longitude); 

     System.out.println(latitudine); 
     System.out.println(longitudine); 

     AsyncCallWS task = new AsyncCallWS(); 
     task.execute(); 

    } 

    private class AsyncCallWS extends AsyncTask<Void,Void,Void>{ 
     @Override 
     protected Void doInBackground(Void... params) { 
      // TODO Auto-generated method stub 
      perform(); 
      return null; 
     } 
    } 

    void perform(){ 
     switch(test_or_train){ 
     case 0: //inserimento dei valori -- fase di training 
      SoapObject requestInsert = new SoapObject(NAMESPACE, METHOD_NAME1);//inizializzazione richiesta SOAP e aggiunta parametri 

      //aggiunta dei parametri per la richiesta SOAP  
      requestInsert.addProperty("latitudine", latitude); 
      requestInsert.addProperty("longitudine", longitude); 
      requestInsert.addProperty("testo", ocr); 

      //dichiarazione della versione SOAP utilizzata 
      SoapSerializationEnvelope insertEnvelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 
      insertEnvelope.setOutputSoapObject(requestInsert); 
      insertEnvelope.dotNet = true; 


      try { 
       HttpTransportSE insertTransport = new HttpTransportSE(URL); 

       //chiamata del web service 
       insertTransport.call(SOAP_ACTION1, insertEnvelope); 

       SoapPrimitive insertResult = (SoapPrimitive)insertEnvelope.getResponse(); 

       if(insertResult != null) 
        tvResult.setText(insertResult.toString()); 
       } catch (IOException e) { 
       // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } catch (XmlPullParserException e) { 
       // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      break; 

     case 1: 
      SoapObject requestTest = new SoapObject(NAMESPACE, METHOD_NAME2); 

      requestTest.addProperty("latitudine", latitudine); 
      requestTest.addProperty("longitudine", longitudine); 
      requestTest.addProperty("testo", ocr); 

      SoapSerializationEnvelope testEnvelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 
      testEnvelope.setOutputSoapObject(requestTest); 
      testEnvelope.dotNet = true; 

      try{ 
       HttpTransportSE testTransport = new HttpTransportSE(URL); 

       testTransport.call(SOAP_ACTION2, testEnvelope); 

       SoapObject testResult = (SoapObject)testEnvelope.bodyIn; 

       if(testResult != null){ 
         if((testResult.getProperty(0).toString()).compareTo("EXISTS") == 0) 
         tvResult.setText("Il cartello fotografato è presente nel DB"); 
        else 
         tvResult.setText("Attenzione! Il cartello fotografato non è presente nel DB"); 
        } 

       }catch (IOException e) { 
       // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } catch (XmlPullParserException e) { 
       // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      break; 

      } 
     btnMenu.setOnClickListener(this); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.activity_web_service, menu); 
     return true; 
    } 

    @Override 
    public void onClick(View arg0) { 
     // TODO Auto-generated method stub 
     Intent intentReset = new Intent(this,MainActivity.class); 
     startActivity(intentReset); 
    } 
} 

,这是日志的猫,我得到:

05-02 15:44:46.530: W/System.err(4670): SoapFault - faultcode: 'soap:Server' faultstring: 'Server was unable to process request. ---> You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''Po '')' at line 1' faultactor: 'null' detail: [email protected] 
05-02 15:44:46.530: W/System.err(4670):  at org.ksoap2.serialization.SoapSerializationEnvelope.parseBody(SoapSerializationEnvelope.java:141) 
05-02 15:44:46.530: W/System.err(4670):  at org.ksoap2.SoapEnvelope.parse(SoapEnvelope.java:140) 
05-02 15:44:46.540: W/System.err(4670):  at org.ksoap2.transport.Transport.parseResponse(Transport.java:116) 
05-02 15:44:46.540: W/System.err(4670):  at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:259) 
05-02 15:44:46.540: W/System.err(4670):  at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:114) 

也许有一个问题,而我称之为SOAP的方法,但我不知道该怎么修理它。

+0

试试这个SoapObjectresult =(SoapObject)envelope.bodyIn ;.另一个需要注意的问题是你正在更新doInbackground()中的ui。在onPostExecute()中执行它 – Raghunandan 2013-05-02 14:00:43

+0

它给了我一个由ClassCastException导致的“RunTimeException”,如果我使用SoapObject,那就是为什么我使用SoapPrimitive .. – 2013-05-02 14:28:30

+0

我认为问题出在这里: requestTest.addProperty(“latitudine”,latitudine) ; requestTest.addProperty(“纵向”,纵向); requestTest.addProperty(“testo”,ocr); 是否有权使用addProperty这种方式向Web服务发送3个不同的值? – 2013-05-02 14:50:11

回答

0

您的代码似乎正确调用SOAP方法。问题在于Web服务本身。

试试这个信封:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
        xmlns:ocr="http://ocrwebservice.somee.com/"> 
    <soapenv:Header/> 
    <soapenv:Body> 
     <ocr:InsertIntoDB> 
     <ocr:latitudine>33</ocr:latitudine> 
     <ocr:longitudine>44</ocr:longitudine> 
     <ocr:testo>Po '</ocr:testo> 
     </ocr:InsertIntoDB> 
    </soapenv:Body> 
</soapenv:Envelope> 

它将yeld你指出了同样的错误:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
       xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <soap:Body> 
     <soap:Fault> 
     <faultcode>soap:Server</faultcode> 
     <faultstring>Server was unable to process request. ---> You have an 
     error in your SQL syntax; check the manual that corresponds to your 
     MySQL server version for the right syntax to use near ''Po '')' at 
     line 1</faultstring> 
     <detail/> 
     </soap:Fault> 
    </soap:Body> 
</soap:Envelope> 

在另一方面,当你把'出来:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
        xmlns:ocr="http://ocrwebservice.somee.com/"> 
    <soapenv:Header/> 
    <soapenv:Body> 
     <ocr:InsertIntoDB> 
     <ocr:latitudine>33</ocr:latitudine> 
     <ocr:longitudine>44</ocr:longitudine> 
     <ocr:testo>Po </ocr:testo> 
     </ocr:InsertIntoDB> 
    </soapenv:Body> 
</soapenv:Envelope> 

插入是成功的。

底线是:无论您的客户端还是您的Web服务都必须正确地转义'

我的看法?这应该在Web服务中完成,而不是在客户端中完成,因为不正确的转义会使您的服务容易受到SQL Injection的影响。另外PO '本身不是无效的String,您的服务不应该为此产生错误。

+0

与有效值(例如“Powe”),我从logcat得到这个错误: SoapFault - faultcode:'肥皂:服务器'faultstring:'服务器无法处理请求。 --->列计数与第1行的值计数不匹配faultactor:'null'详细信息:[email protected] – 2013-05-03 15:58:43

+0

这是**不是Web服务**的问题。您在数据库中插入(或选择)的业务方法不能正确处理它的参数。使用这些参数调用业务方法会产生错误。 Web服务只是转发该错误。 – acdcjunior 2013-05-03 16:40:34

+0

那么应该在哪里出错? – 2013-05-03 16:45:10