2012-10-09 2 views
1

KSOAP2를 사용하는 Android의 XmlPullParserException과 관련하여 여러 가지 질문/답변을 여기에서 살펴 보았지만 지금까지 아무 것도 잘못 이해하지 못했습니다. 나는 iOS App을 Android로 포팅하기 시작했으며, 지금은 .Net 웹 서비스와 통신하도록 앱을 가져 오는이 부분에 붙어 있습니다. 다음은 문제의 코드입니다. 대부분은 웹 서비스에서 자체 서명 된 인증서를 가지고 있기 때문에 여러 가지 다른 질문/블로그/사이트에서 함께 작성되었습니다. 누구든지 팁을 가지고 있거나 내가 웹 서비스를 사용하는 몇 가지 다른 영역이 있기 때문에 위의 내용을 이해하는 데 도움이 될 몇 가지 독서 방향으로 나를 안내 할 수 있고 필요한 경우 내가 지금 얻고있는 것보다 더 잘 디버깅하는 법을 알아라.Android 및 HTTPS 웹 서비스 (XmlPullParserException)

String URL = "https://online.ensinet.com/Services/ENSIMobileservice.asmx"; 
      String SOAP_ACTION = "http://ensinet.com/VerifyRep"; 
      String NAMESPACE = "http://ensinet.com/"; 
      String METHOD_NAME = "VerifyRep"; 
      String SERVER = "online.ensinet.com"; 

      SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); 

      //PropertyInfo usernamePI = new PropertyInfo(); 
      //usernamePI.setName("RepLogin"); 
      //usernamePI.setValue(username); 
      //usernamePI.setType(String.class); 
      request.addProperty("RepLogin", username); 

      //PropertyInfo passPI = new PropertyInfo(); 
      //passPI.setName("RepPass"); 
      //passPI.setValue(passphrase); 
      //passPI.setType(String.class); 
      request.addProperty("RepPass",passphrase); 

      SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 
      envelope.dotNet = true; 
      envelope.setOutputSoapObject(request); 
      try 
      { 
       allowAllSSL(); 
       HttpsTransportSE androidHttpTransport = new HttpsTransportSE(SERVER,443, URL, 1000); 
       androidHttpTransport.call(SOAP_ACTION,envelope); 
       SoapObject response=(SoapObject) envelope.getResponse(); 

      Log.i("Message", "the response contains: " + response.toString()); 
      } 
      catch(Exception e) 
      { 
       Log.i("Message", "there was an error: " + e); 
      } 

오케이 여기 좀 더 자세한 정보가 있습니다. 먼저 allowAllSSL()은 자격 증명이 없으므로 다른 포럼에서 자체 서명 된 인증서의 자격 관리자를 우회하는 방법이며 모바일 장치에서 수집하는 정보는 웹 응용 프로그램처럼 중요하지 않습니다. 모든 웹 서비스가 호스팅됩니다. 다음은

private static TrustManager[] trustManagers; 

public static class _FakeX509TrustManager implements 
     javax.net.ssl.X509TrustManager { 
    private static final X509Certificate[] _AcceptedIssuers = new X509Certificate[] {}; 

    public void checkClientTrusted(X509Certificate[] arg0, String arg1) 
      throws CertificateException { 
    } 

    public void checkServerTrusted(X509Certificate[] arg0, String arg1) 
      throws CertificateException { 
    } 

    public boolean isClientTrusted(X509Certificate[] chain) { 
     return (true); 
    } 

    public boolean isServerTrusted(X509Certificate[] chain) { 
     return (true); 
    } 

    public X509Certificate[] getAcceptedIssuers() { 
     return (_AcceptedIssuers); 
    } 
} 

public static void allowAllSSL() { 

    javax.net.ssl.HttpsURLConnection 
      .setDefaultHostnameVerifier(new HostnameVerifier() { 
       public boolean verify(String hostname, SSLSession session) { 
        return true; 
       } 
      }); 

    javax.net.ssl.SSLContext context = null; 

    if (trustManagers == null) { 
     trustManagers = new javax.net.ssl.TrustManager[] { new _FakeX509TrustManager() }; 
    } 

    try { 
     context = javax.net.ssl.SSLContext.getInstance("SSL"); 
     context.init(null, trustManagers, new SecureRandom()); 
    } catch (NoSuchAlgorithmException e) { 
     Log.e("allowAllSSL", e.toString()); 
    } catch (KeyManagementException e) { 
     Log.e("allowAllSSL", e.toString()); 
    } 
    javax.net.ssl.HttpsURLConnection.setDefaultSSLSocketFactory(context 
      .getSocketFactory()); 
} 
} 

또한 가짜 자격 증명 관리자를 설정하는 세부 방법은, 나는 requestDump에보고했고 나는 요청에 실제 웹 서비스의 일부가 아닌 <Header /> 태그가 있다는 것을 발견 그래서 KSOAP2에 의해 추가 된 것 같아요. 그리고 지금까지 제가 가지고있는 START TAG erro의 일부일 수있는 제거 방법을 보지 못했습니다. 나는 SOAP 요청을 수동으로 빌드 할 것이라고 생각하는데, 나중에 오늘 밤 시도해 볼 것이므로 작동하는지 확인하십시오.

+0

전체 스택 추적을 게시하십시오. 'allowAllSSL()'은 매우 의심 스럽습니다. 무엇을합니까? 우편 번호. 일반적으로 자체 서명 된 인증서가있는 경우 _any_ certificate가 _bad 아이디어 인 _을 허용하도록 앱을 신뢰하도록 설정해야합니다. –

답변

0

그래, 문제를 파악할 수있었습니다. 문제는 내가 사용하고 있던 URL이기 때문에 안드로이드 쪽이 iOS 쪽보다 조금 더 구체적인 것처럼 보입니다. 위의 코드에서 iOS 코드와 같이 모바일 응용 프로그램에서 사용할 수있는 전체 작업 목록 URL을 사용하고 있었지만 호출 한 작업의 실제 URL을 사용해야했습니다 (그래서 추가해야합니까?) = VerifyRep 위의 URL 문자열의 끝까지). 이제 올바른 응답을 얻었으므로 다음 단계로 넘어가서 필요한 데이터를 분석하는 방법을 파악하려고합니다.