2012-04-04 13 views
0

Also habe ich 2 Codes, die angeblich das gleiche tun. Die eine, die ich auf Android verwende, gibt jedoch die falschen HTML-Daten zurück. Der Bestand Java gibt die korrekten Daten nach dem Senden der Anfrage zurück. Ich habe beide Codes hier. Können Sie mir sagen (auch wenn ich INTERNET-ERLAUBNIS ANDROID bekam), warum das Android-Gerät nicht funktioniert, während das Java-Gerät funktioniert? Dies ist der Android-Code:Android HTTP Post Request funktioniert nicht, aber Lager Java tut?

EDIT: Ich fand den Fix. Wenn Sie eine StringEntity verwenden, um eine solche Zeichenfolge an den Server zu senden, müssen Sie den Inhalt auf application/x-www-form-urlencoded setzen. Ich habe meinen Code bearbeitet, dies zu zeigen:

public static String sendNamePostRequest(String urlString) { 

    HttpClient client = new DefaultHttpClient(); 

    HttpPost post = new HttpPost(urlString); 

    StringBuffer sb = new StringBuffer(); 

    try { 
      StringEntity se = new StringEntity(
       "__EVENTTARGET=&__EVENTARGUMENT=&__VIEWSTATE=%2FwEPDwULLTE3NDM5MzMwMzRkZA%3D%3D&__EVENTVALIDATION=%2FwEWBAL%2B%2B4CfBgK52%2BLYCQK1gpH7BAL0w%2FPHAQ%3D%3D&_nameTextBox=John&_zoekButton=Zoek&numberOfLettersField=3"); 

     se.setContent("application/x-www-form-urlencoded"); 

     post.setEntity(); 

     HttpResponse response = client.execute(post); 
     HttpEntity entity = response.getEntity(); 

     BufferedReader br = new BufferedReader(new InputStreamReader(
       entity.getContent())); 
     String in = ""; 

     while ((in = br.readLine()) != null) { 
      sb.append(in + "\n"); 
     } 

     br.close(); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    return sb.toString(); 
} 

Dies ist die Aktie von Java-Code:

public String sendNamePostRequest(String urlString) { 

    StringBuffer sb = null; 

    try { 
     String data = "__EVENTTARGET=&__EVENTARGUMENT=&__VIEWSTATE=%2FwEPDwULLTE3NDM5MzMwMzRkZA%3D%3D&__EVENTVALIDATION=%2FwEWBAL%2B%2B4CfBgK52%2BLYCQK1gpH7BAL0w%2FPHAQ%3D%3D&_nameTextBox=John&_zoekButton=Zoek&numberOfLettersField=3"; 

     // String data = ""; 

     URL requestUrl = new URL(urlString); 

     HttpURLConnection conn = (HttpURLConnection) requestUrl 
       .openConnection(); 

     conn.setDoOutput(true); 
     conn.setDoInput(true); 
     conn.setRequestMethod("POST"); 

     DataOutputStream dos = new DataOutputStream(conn.getOutputStream()); 

     dos.writeBytes(data); 
     dos.flush(); 

     BufferedReader br = new BufferedReader(new InputStreamReader(
       conn.getInputStream())); 

     String in = ""; 
     sb = new StringBuffer(); 

     while ((in = br.readLine()) != null) { 
      sb.append(in + "\n"); 
     } 

     dos.close(); 
     br.close(); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return sb.toString(); 
} 
+0

angeben, was meinst du mit „falschen HTML-Daten“ – 207

+0

Es bedeutet, dass ich sollte die HTML-Daten der Seite zurück bekommen, nachdem es hat die Anfrage bearbeitet. Der Java-Quellcode macht das perfekt, aber der Android-Code gibt nur die HTML-Seite der Site zurück, ohne die POST-Anfrage zu berücksichtigen. Wireshark sieht zwar einen POST sowohl von der Android- als auch von der Stock-Seite, mit dem exakt gleichen Datenstring, aber aus irgendeinem Grund wird der von Java gesendete nicht verarbeitet ... – ZimZim

+0

Im Android-Fall müssen Sie das wahrscheinlich sagen StringEntity zum Festlegen des Inhaltstyps auf application/x-www-form-urlencoded – superfell

Antwort

0

Wenn die Daten an den Server zu erhalten ist, möchten Sie vielleicht, um zu sehen, was dort geschieht (Andere Protokolle, Fehler, Ausnahmen usw.), die als:

  • Verwendung kann HttpURLConnection verwenden, so dass Sie
  • Für Httpclient genau den gleichen Code haben, nicht sicher, wh Sie kodieren die Entität selbst. Verwenden Sie NameValuePair, um Parameter festzulegen, und HttpClient wird sie für Sie (richtig) codieren.
+0

Das Codieren der Zeichenfolge gibt nur Probleme in Android. Es sagt etwas darüber aus, dass es nicht base64 ist (wahrscheinlich wegen der Menge von _ und% und was nicht im Code. Also kann ich den String nicht urlencodieren, was saugt, aber ich weiß nicht, ob das wirklich das Problem ist, da es ohne funktioniert Codierung auf Lager Java ... – ZimZim

+0

Sie veröffentlichen, dass Ihr "Lager-Java" und Android-Code grundlegend anders sind, tun Sie? HttpURLConnection verwendet, der andere HttpClient. Wahrscheinlich hat HttpClient einen strengeren Check, deshalb sind Sie einen Fehler auf Android bekommen, den kompletten Stack-Trace posten und versuchen, den Teil zu finden, der fälschlicherweise kodiert ist. Außerdem sollte man nicht VIEWSTATE von Android verwenden, um den Zustand des Formulars zu speichern. Einfach die Parameter einstellen, die das serverseitige Script benötigt (Name, etc.) –

+0

Danke für die Hilfe, aber ich habe gerade versucht SetContent ("application/x-www-form-urlencoded"); und es hat sofort funktioniert. Ich schätze Ihre Hilfe obwohl! – ZimZim

0

Sie Namevaluepair und UrlEncodedFormEntity verwenden können:

List<BasicNameValuePair> nvps = new ArrayList<BasicNameValuePair>(); 
nvps.add(new BasicNameValuePair(KEY1, VALUE1)); 
nvps.add(new BasicNameValuePair(KEY2, VALUE2)); 
UrlEncodedFormEntity p_entity = new UrlEncodedFormEntity(nvps,HTTP.UTF_8); 
post.setEntity(p_entity); 
+0

Nein, kann ich nicht Habe das in anderen Apps a Und es funktioniert gut, aber in diesem Programm gibt es mir Ärger. – ZimZim

Verwandte Themen