2010-10-26 12 views
1

m'a donné une mission de développer une application météo très simple dans Android en utilisant les données fournies deEnvoi d'un formulaire HTML dans Android sans WebView

http://forecast.weather.gov/zipcity.php

Ce serait ma première application Android réelle, mon seul D'autres expériences regardent/lisent de nombreux tutoriels sur le démarrage. Pour donner quelques informations de base de l'application, il suffit d'avoir une activité qui est un champ de texte pour que l'utilisateur entre une ville, une combinaison d'états ou simplement un code postal. Ceci doit ensuite être soumis au formulaire du site Web (indiqué ci-dessus). Après que ce dernier a été soumis, mon application doit récupérer la page envoyée en réponse et l'afficher dans une présentation simple (éventuellement une liste des jours de la semaine).

Ma première question est: comment pourrais-je soumettre une entrée de texte au formulaire du site Web ci-dessus? Aurais-je besoin de connaître le nom du champ de la forme pour s'y soumettre avec précision?

En général, comment dois-je démarrer ce processus?


version éditée:

En utilisant ce code:

HttpClient httpClient = new DefaultHttpClient(); 
HttpPost post = new HttpPost("http://forecast.weather.gov/zipcity.php?inputstring=04419"); 

    HttpResponse httpResp; 

    try { 
     httpResp = httpClient.execute(post); 
     StatusLine status = httpResp.getStatusLine(); 
     Toast.makeText(getApplicationContext(), status.getStatusCode(), Toast.LENGTH_SHORT).show(); 


    } catch (ClientProtocolException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

Je reçois:

10-26 15: 29: 56,686: DEBUG/SntpClient (59) : l'heure de la demande a échoué: java.net.SocketException: la famille d'adresses n'est pas prise en charge par le protocole

erreur dans la vue de débogage. Cette erreur est-elle liée? Est-ce que mon utilisation du toast est raisonnable pour tester si cette interaction http est réussie?

Répondre

2

Lorsque vous voulez voir ce qu'une demande de publication en passant utilise Firefox + tamperdata, vous pouvez voir comment utiliser le webservice.

J'ai regardé, je la recherche de « 33129 » et quand vous entrez du texte sur la case à gauche pour lancer une recherche, il Pases simplement 2 paramètres:

inputstring = "33129" 
Go2 = "Go" 

Ce serait une façon de le faire, d'un autre côté, une fois la requête terminée, il la transforme en une autre requête, plus spécifique. Vous pouvez effectuer une recherche par ville ou zip, pas les deux.

Si vous demandez avec un zip vous êtes redirigé vers:

http://forecast.weather.gov/MapClick.php?CityName=Miami&state=FL&site=MFL&lat=25.77&lon=-80.2 

Donc, il y a probablement une redirection aller là-bas.

Vous allez devoir examiner de près comment travailler avec cela.

Maintenant, pour faire une demande de publication dans android, utilisez une paire de valeurs de nom comme celle-ci.

List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 
      nameValuePairs.add(new BasicNameValuePair("inputstring","33129)); 

La réponse de Ramp montre le reste. De plus, TOUTES les communications doivent être effectuées sur un thread qui n'est pas le thread principal de l'interface utilisateur, sinon vous obtiendrez une erreur ANR.

1

Quand je vérifié votre URL, je suis entré dans la ville et state.This est l'URL qu'il génère dans HTTP POST:

http://forecast.weather.gov/MapClick.php?CityName=Edison&state=NJ&site=PHI&textField1=40.5288&textField2=-74.3693

Ainsi, votre fera un HTTP POST avec les paramètres d'URL CityName et de l'État . Ce sera quelque chose comme ça si vous utilisez apache HttpClient dans votre programme Android: (il devrait être OK pour utiliser le protocole HTTP GET aussi je suppose)

 

     HttpPost post = new HttpPost(url);//construct url with cityName and State 
     HttpResponse httpResp = httpClient.execute(post); 
     StatusLine status = httpResp.getStatusLine(); 

 

Hope this helps.

+0

Cela semble être comme une approche facile, mais ce que sur les entrées de code zip? – joepetrakovich

+0

En fouillant la source HTML, il semble que vous ayez juste besoin de fournir la ville, l'état ou le code postal via l'URL: "http://forecast.weather.gov/zipcity.php?inputstring=08802" (ou) "http: //forecast.weather.gov/zipcity.php?inputstring=Matawan,nj " – Ramp

+0

PetrakovichJ, vous pouvez accepter ou donner crédit aux réponses que vous aimez. La plupart des réponses ici vous donne toutes les informations dont vous avez besoin. – Ramp

0

Quelque chose comme ceci:

 HttpClient hc = new DefaultHttpClient(); 
     List<NameValuePair> l = new ArrayList<NameValuePair>(6); 
     l.add(new BasicNameValuePair("fieldname", "fieldvalue")); 
      //More fields... 
      HttpPost pr = new HttpPost(TheURL); 
     pr.setEntity(new UrlEncodedFormEntity(l, "the-proper-encoding")); 
     HttpResponse Resp = hc.execute(pr); 
     if(Resp.getStatusLine().getStatusCode() != 200) 
       //Fail...