2013-07-15 5 views
7

EDIT komplett neu arbeiten, um die Frage zum besseren Verständnisexectuing http POST gibt HTML anstelle von JSON

Ich habe die angegebene URL http://api.bf3stats.com/pc/player/ mit 2 POST-Parameter abzufragen: ‚Spieler‘ (für Spielernamen) und ' opt '(für Optionen). Ich habe es auf http://www.requestmaker.com/ mit folgenden Daten getestet: player=Zer0conf&opt=all. Ich bekomme eine korrekte JSON-Antwort (dachte ich weiß nicht, wie ihre Website die Abfrage durchführt, ich denke, es ist PHP). Jetzt versuche ich, das gleiche in Android zu tun:

private StringBuilder inputStreamToString(InputStream is) { 
     //this method converts an inputStream to String representation 
    String line = ""; 
    StringBuilder total = new StringBuilder(); 

    BufferedReader rd = new BufferedReader(new InputStreamReader(is)); 

    try { 
     while ((line = rd.readLine()) != null) { 
      total.append(line); 
     } 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    return total; 
} 

und das ist, wie ich den Antrag stellen:

public void postData(String url, String name) { 

    HttpClient httpclient = new DefaultHttpClient(); 
    HttpPost httppost = new HttpPost(url); 

    try { 

     List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2); 
        //qname is a String containing a correct player name 
     nameValuePairs.add(new BasicNameValuePair("player", qname)); 
     nameValuePairs.add(new BasicNameValuePair("opt", "all")); 
     httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 

     HttpResponse response = httpclient.execute(httppost); 
     //test is just a string to check the result, which should be in JSON format 
     test = inputStreamToString(response.getEntity().getContent()) 
       .toString(); 

    } catch (ClientProtocolException e) { 

    } catch (IOException e) { 

    } 
} 

Was ich bin immer in dem ‚Test“ String ist nicht JSON, aber die komplette HTML-Markup einiger bf3stats Seite. Irgendwelche Ideen, was mit meiner Anfrage falsch sein könnte?

enter image description here

+0

wenn die Antwort [hier] (http://stackoverflow.com/questions/9805300/using-httpget-returning-complete-html-code/9813473#9813473) Hilfe. – yorkw

Antwort

10

Sie müssen den Inhaltstyp "application/x-www-form-urlencoded" in Ihren Anforderungsheadern für den Datentyp angeben, den Sie senden möchten.

Ich habe Ihre API für die oben genannten Daten getestet, es funktioniert gut und ich erhielt viele Daten als Antwort. Sie können es here finden.

Sie können den folgenden Code versuchen:

public String postDataToServer(String url) throws Throwable 
    { 

    HttpPost request = new HttpPost(url); 
    StringBuilder sb=new StringBuilder(); 

    String requestData = prepareRequest(); 
    StringEntity entity = new StringEntity(requestData); 
         entity.setContentType("application/x-www-form-urlencoded;charset=UTF-8");//text/plain;charset=UTF-8 
         request.getParams().setParameter(CoreProtocolPNames.USE_EXPECT_CONTINUE, Boolean.FALSE); 

         request.setHeader("Accept", "application/json"); 
         request.setEntity(entity); 
         // Send request to WCF service 
         HttpResponse response =null; 
         DefaultHttpClient httpClient = new DefaultHttpClient(); 
         //DefaultHttpClient httpClient = getNewHttpClient(); 
         HttpConnectionParams.setSoTimeout(httpClient.getParams(), 10*1000); 
         HttpConnectionParams.setConnectionTimeout(httpClient.getParams(),10*1000); 
         try{ 

         response = httpClient.execute(request); 
         } 
         catch(SocketException se) 
         { 
          Log.e("SocketException", se+""); 
          throw se; 
         } 
         /* Patch to prevent user from hitting the request twice by clicking 
          * the view [button, link etc] twice. 
          */ 
         finally{ 
         } 



    InputStream in = response.getEntity().getContent(); 
    BufferedReader reader = new BufferedReader(new InputStreamReader(in)); 
    String line = null; 
    while((line = reader.readLine()) != null){ 
     sb.append(line); 

    } 
    Log.d("response in Post method", sb.toString()+""); 
    return sb.toString(); 
    } 

    public String prepareRequest() 
    { 

     return "player=Zer0conf&opt=all"; 
    } 

Edit: wurde ich Fehler Erwartung fehler- 417 für Ihre Webservice konnte nicht bekommen. Also müssen wir einen weiteren Parameter in unserer Anfrage hinzufügen. Es ist request.getParams().setParameter(CoreProtocolPNames.USE_EXPECT_CONTINUE, Boolean.FALSE);. Ich habe den obigen Code damit aktualisiert. Jetzt funktioniert es gut.

Antwort sieht in etwa so aus.

Response looks something like this.

Hope this helfen.

Prost
N_JOY

+0

Ich habe Ihren Code (Spielernamen als dynamischen Parameter hinzugefügt) und immer noch einige HTML-Zeug in der "Test" String ... hier ist meine komplette Klasse: http : //pastebin.com/QBpTcjAG Vielleicht mache ich irgendwann einen Fehler? – Droidman

+0

Ich habe versucht, aber jetzt Server gibt 403 verboten –

+0

wirklich seltsam .. nur den Code ich auf Pastebin geschrieben, keine Fehler, aber HTML statt JSON .. – Droidman

0

Versuchen Sie die uRL in Browser zu betrachten, ich glaube, es ist eine! DOCTYPE-Deklaration, die kann definitiv nicht zu einem JSON-Objekt geparst werden.

+0

Ich werde auf die Hauptseite umgeleitet, wenn ich versuche, die URL im Browser zu öffnen. Sind Sie sicher, dass die URL falsch ist? Ich habe in der Vergangenheit einige JSON-Antworten erhalten, aber das System, mit dem ich gearbeitet habe, war komplett anders. Sie konnten die Anfrage-URL im Browser nicht öffnen. – Droidman

+0

@ Maver1ck Wenn diese URL eine Art Sitzungsvariable benötigt (wie Anmeldedaten) Es ist nicht möglich, sie direkt mit dem Browser anzuzeigen, aber Sie können die Zeichenfolge jsonResults mit dem Eclipse-Debug-Tool überprüfen oder einfach nur abmelden, um die empfangene Antwort zu sehen. Eine richtige JSON-Antwort sollte trotzdem keine DOCTYPE-Deklaration enthalten. – reTs

+0

Ich habe die Frage bearbeitet, ging in die falsche Richtung. – Droidman

Verwandte Themen