1

そこで、ユーザーが自分の携帯電話でバスの切符を購入し、取引が終了したらすぐにPDFファイルをダウンロードできるようにするプログラムを作成しました。これは、URLが変更され、キーワードTicsnetReceipt.aspxが含まれているかどうかを確認することで実行され、トランザクションが完了したことを通知します。将来使用するために、URLから名前やメールアドレスなどの他の情報も保存するので、これは問題なく機能します。

次に、Soapを使用してファイルをダウンロードします。

public String getPDFxml(String ReferenceID){
    String NAMESPACE = "http://tempuri.org/";
    String METHOD_NAME = "GetPDFxml";
    String SOAP_ACTION = "http://tempuri.org/GetPDFxml";
    String URL = "http://77.40.188.73:28082/SasMobileWS/SasMobile.asmx?op=GetPDFxml";

    try {

        SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);

        PropertyInfo pi = new PropertyInfo();
        pi.setName("Reference");
        pi.setValue(ReferenceID);
        request.addProperty(pi);

        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
        envelope.dotNet=true;
        envelope.setOutputSoapObject(request);

        HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);

        androidHttpTransport.call(SOAP_ACTION, envelope);

        SoapPrimitive result = (SoapPrimitive)envelope.getResponse();
        String strRes = result.toString();
        String temp[];
        temp = strRes.split("TravelDate");
        String Date[] = temp[1].split(">|<|/");
        String theDate = Date[1];
        return(theDate);
    } catch (IOException e) {
        e.printStackTrace();
    } catch (XmlPullParserException e) {
        e.printStackTrace();
    }
    return null;
}


public void getPDFbytes(String TransactionID, String Date){
    String NAMESPACE = "http://tempuri.org/";
    String METHOD_NAME = "GetPDFbytes";
    String SOAP_ACTION = "http://tempuri.org/GetPDFbytes";
    String URL = "http://77.40.188.73:28082/SasMobileWS/SasMobile.asmx?op=GetPDFbytes";

    SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);

    PropertyInfo pi = new PropertyInfo();
    pi.setName("Reference");
    pi.setValue(TransactionID);
    request.addProperty(pi);

    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
    envelope.dotNet=true;
    envelope.setOutputSoapObject(request);

    try {
        HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
        androidHttpTransport.call(SOAP_ACTION, envelope);
    } catch (Exception e) {
        e.printStackTrace();
    }

    SoapObject resultsRequestSOAP = null;
    try{
        resultsRequestSOAP = (SoapObject) envelope.getResponse();
    }catch (Exception e) {
        try{    
        resultsRequestSOAP = (SoapObject) envelope.bodyIn; 
        }catch(Exception f){
            f.printStackTrace();
        }
    } 
    byte[] result = null;
    try {
        result = Base64.decode(resultsRequestSOAP.getProperty("GetPDFbytesResult").toString());
    } catch(Exception e){
        e.printStackTrace();
    }
    try {
        Date = Date.replace(".", "");
        FileOutputStream fos = openFileOutput(Date + "_" + TransactionID + ".pdf", Context.MODE_WORLD_READABLE);

        fos.write(result);
        fos.close();

    } catch(FileNotFoundException ex){
        ex.printStackTrace();
    } catch(IOException ioe){
        ioe.printStackTrace();
    }
}

これはすべて、私が試した他のモデルでは正常に機能しますが、S3ではファイルがダウンロードされず、ビューアーでファイルを開こうとしたときにファイルが存在しないことをユーザーに通知します。

私は99%確信していますが、石鹸に何か問題があり、私には理解できません。しかし、これがうまく見える場合、私は何が起こっているのか分かりません:p

前もって感謝します :)

もう少しテストを行った後、問題の原因は次のとおりです。

  androidHttpTransport.call(SOAP_ACTION, envelope);

これはデータをまったく読み取っていないように見えますが、これは上記の方法と同じ入力であると想定されているため、奇妙です。どちらのメソッドも文字列参照(実際には数値)を受け入れます。最初のメソッドでは、GetPDFxmlが文字列を返し、GetPDFbytesがbase64Binaryを返します。

プログラムがクラッシュする直前に、envolopeから値を取得すると、次のように表示されます。

envelope    
SoapSerializationEnvelope  (id=830066090736)    
addAdornments   true    
avoidExceptionForUnknownProperty    false   
bodyIn  SoapFault  (id=830066150416)    
bodyOut SoapObject  (id=830066090472)   
classToQName    Hashtable  (id=830066090944)    
dotNet  true    
enc "http://schemas.xmlsoap.org/soap/encoding/" (id=830065748280)   
encodingStyle   null    
env "http://schemas.xmlsoap.org/soap/envelope/" (id=830065748552)   
headerIn    null    
headerOut   null    
idMap   Hashtable  (id=830066090864)    
implicitTypes   false   
multiRef    Vector  (id=830066102400)   
properties  Hashtable  (id=830066090824)    
qNameToClass    Hashtable  (id=830066090904)    
version 110 
xsd "http://www.w3.org/2001/XMLSchema" (id=830065748824)    
xsi "http://www.w3.org/2001/XMLSchema-instance" (id=830065749064)   

そして、どちらもenvelope.getResponse(); またはresultsRequestSOAP=(SoapObject)envelope.bodyIn; 有効な値を返します。

4

1 に答える 1

0

担当者が足りないので、コメントにする必要があります。

せっけんの呼び出しで例外が発生した場合は、次のようなものを追加してみてください。

catch(Exception e){
Log.e(TAG, "Exception during getting pdf " + e.getMessage());} 

したがって、実際に何が起こっているのかを確認できます。

Soapが失敗していると確信している場合は、Eclipseプラグイン( Eclipseプラグイン)もあるSoapUI( SoapUIホームページ)内のsoapserviceを確認することをお勧めします。

また、デバイスのWebブラウザ内でサービスにアクセスしてみてください。空白のページが表示される場合は、デバイスの問題またはIISの問題のいずれかです。

ちなみに; 私は個人的に自分のSoapSerializationEnvelope(SoapEnvelope.VER11)番号に問題がありました。


デバッグ用に追加できるものは次のとおりです。

 SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
    envelope.setOutputSoapObject(request);
    envelope.dotNet = true;
    Log.d("SoapBody",envelope.bodyOut.toString()); //This

    HttpTransportSE httpTransport = new HttpTransportSE(URL);
    httpTransport.debug = true; //And this!
于 2012-11-07T09:43:15.980 に答える