2010-12-16 157 views
3

J'essaie de consommer un service web que j'ai créé localement à partir d'une application Android. Mon problème est que dans mon application Android, à un certain point, je dois donner une URL avec des paramètres qui ressemble à ceci: http://localhost:8080/CalculatorApp/CalculatorWSService/add?i=1&j=1Consommer un service web dans une application android dans localhost

CalculatorWS est le service web que j'utilise, add est l'opération et i et j sont des paramètres de l'opération add. Pour l'instant j'utilise un exemple de calculatrice d'application (à partir de NetBeans) pour tester et je veux récupérer l'URL correcte à donner à mon client de service web (application Android) pour qu'il puisse me renvoyer un XML à analyser.

J'ai essayé d'utiliser l'URL mentionnée ci-dessus mais cela ne fonctionne pas.

Est-ce que quelqu'un sait quelle est l'URL correcte à mettre?

+0

Votre service écoute-t-il sur l'interface localhost? – 9000

+0

je pense que le problème n'est pas dans l'url que l'application android consomme, si votre application web sur netbeans fait la sortie correcte à l'inputtream (peut-être écrire un fichier xml) et vous connecter sur Android app je ne vois pas problème, peut-être que je ne comprends pas votre question – Franco

+0

Votre service écoute-t-il sur l'interface localhost? Installez un terminal sur votre appareil Android (si vous ne l'avez pas déjà fait), dites 'netstat -lnt' et voyez si quelque chose liste 127.0.0.1. – 9000

Répondre

1

Si vous utilisez un émulateur puis lire ci-dessous le paragraphe extrait de: Referring to localhost from the emulated environment

Si vous devez vous référer à votre ordinateur hôte localhost, comme lorsque vous voulez que le client émulateur de contacter un serveur exécutant sur le même hôte , utilisez l'alias 10.0.2.2 pour faire référence à l'interface de bouclage de l'ordinateur hôte. Du point de vue de l'émulateur, localhost (127.0.0.1) fait référence à sa propre interface de bouclage.

4

Utilisez cette adresse:

http://10.0.2.2:8080/CalculatorApp/CalculatorWSService/add?i=1&j=1

Depuis l'émulateur Android course sur machine virtuelle, nous avons donc d'utiliser cette adresse IP au lieu de localhost or 127.0.0.1

+0

J'ai essayé de lancer ceci au début: http://10.0.2.2:8080/ mais il jette toujours une exception d'appel :( – sharktiger

+0

@sharktiger: Si vous commentez ou répondez utilisation Au symbole (@) suivi du nom de l'utilisateur, cela n'a pas de sens, si vous avez une exception, envoyez votre journal des erreurs ici. –

0

sharktiger comme vous dit sur les commentaires, i Coller ici un code pour vous aider à comprendre comment procéder, ce code essayer de se connecter à un service Web et analyser le InputStream récupéré, tout comme @Vikas Patidar et @MisterSquonk dit, vous devez configurer l'URL dans le code android lik Ils les expliquent. Donc, je poste mon code

et exemple d'appel à HttpUtils ...

public static final String WS_BASE = "http://www.xxxxxx.com/dev/xxx/"; 
public static final String WS_STANDARD = WS_BASE + "webserviceoperations.php"; 
public static final String REQUEST_ENCODING = "iso-8859-1"; 

    /** 
     * Send a request to the servers and retrieve InputStream 
     * 
     * @throws AppException 
     */ 
     public static Login logToServer(Login loginData) { 
      Login result = new Login(); 
      try { 
       // 1. Build XML 
       byte[] xml = LoginDAO.generateXML(loginData); 
       // 2. Connect to server and retrieve data 
       InputStream is = HTTPUtils.readHTTPContents(WS_STANDARD, "POST", xml, REQUEST_ENCODING, null); 
       // 3. Parse and get Bean 
       result = LoginDAO.getFromXML(is, loginData); 
      } catch (Exception e) { 
       result.setStatus(new ConnectionStatus(GenericDAO.STATUS_ERROR, MessageConstants.MSG_ERROR_CONNECTION_UNKNOWN)); 

      } 
      return result; 
     } 

et la méthode readHTTPContents de ma classe HttpUtils

/** 
    * Get the InputStream contents for a specific URL request, with parameters. 
    * Uses POST. PLEASE NOTE: You should NOT use this method in the main 
    * thread. 
    * 
    * @param url 
    *   is the URL to query 
    * @param parameters 
    *   is a Vector with instances of String containing the parameters 
    */ 
    public static InputStream readHTTPContents(String url, String requestMethod, byte[] bodyData, String bodyEncoding, Map<String, String> parameters) 
      throws AppException { 
     HttpURLConnection connection = null; 
     InputStream is = null; 
     try { 
      URL urlObj = new URL(url); 
      if (urlObj.getProtocol().toLowerCase().equals("https")) { 
       trustAllHosts(); 
       HttpsURLConnection https = (HttpsURLConnection) urlObj 
         .openConnection(); 
       https.setHostnameVerifier(new HostnameVerifier() { 
        public boolean verify(String hostname, SSLSession session) { 
         return true; 
        } 
       }); 
       connection = https; 
      } else { 
       connection = (HttpURLConnection) urlObj.openConnection(); 
      } 
      // Allow input 
      connection.setDoInput(true); 
      // If there's data, prepare to send. 
      if (bodyData != null) { 
       connection.setDoOutput(true); 
      } 
      // Write additional parameters if any 
      if (parameters != null) { 
       Iterator<String> i = parameters.keySet().iterator(); 
       while (i.hasNext()) { 
        String key = i.next(); 
        connection.addRequestProperty(key, parameters.get(key)); 
       } 
      } 
      // Sets request method 
      connection.setRequestMethod(requestMethod); 
      // Establish connection 
      connection.connect(); 
      // Send data if any 

      if (bodyData != null) { 
       OutputStream os = connection.getOutputStream(); 
       os.write(bodyData); 
      } 
      if (connection.getResponseCode() != HttpURLConnection.HTTP_OK) { 
       throw new AppException("Error HTTP code " + connection.getResponseCode()); 
      } 
      is = connection.getInputStream(); 
      int numBytes = is.available(); 
      if (numBytes <= 0) { 
       closeInputStream(is); 
       connection.disconnect(); 
       throw new AppException(MessageConstants.MSG_ERROR_CONNECTION_UNKNOWN); 
      } 

      ByteArrayOutputStream content = new ByteArrayOutputStream(); 

      // Read response into a buffered stream 
      int readBytes = 0; 
      while ((readBytes = is.read(sBuffer)) != -1) { 
       content.write(sBuffer, 0, readBytes); 
      } 
      ByteArrayInputStream byteStream = new ByteArrayInputStream(content.toByteArray()); 
      content.flush(); 
      return byteStream; 
     } catch (Exception e) { 
//   Logger.logDebug(e.getMessage()); 
      throw new AppException(e.getMessage()); 
     } finally { 
      closeInputStream(is); 
      closeHttpConnection(connection); 
     } 
    } 

Hope this vous aide ...

5

vous devez définir l'URL comme 10.0.2.2: portNr

portNr = le port donné par ASP.NET serveur de développement mon service actuel est en cours d'exécution sur localhost: 3229/Service.svc

donc mon URL est 10.0.2.2:3229

j'avais fixé mon problème de cette façon

J'espère que ça aide ...