2013-07-15 11 views
7

EDIT completamente ri-lavorare la domanda per una migliore comprensioneexectuing http POST restituisce HTML invece di JSON

ho per interrogare il dato url http://api.bf3stats.com/pc/player/ con 2 parametri POST: 'giocatore' (per nome del giocatore) e ' opt '(per le opzioni). L'ho provato su http://www.requestmaker.com/ con i seguenti dati: player=Zer0conf&opt=all. Sto ottenendo una risposta JSON corretta (pensavo che non so come il loro sito esegue la query, suppongo che sia php). Ora sto cercando di fare lo stesso in Android:

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; 
} 

ed è così che faccio la richiesta:

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) { 

    } 
} 

Quello che sto ottenendo nel 'test" Stringa non è JSON, ma la completa HTML markup di qualche pagina bf3stats. Tutte le idee che cosa potrebbe essere sbagliato con la mia richiesta?

enter image description here

+0

vedere se la risposta [qui] (http://stackoverflow.com/questions/9805300/using-httpget-returning-complete-html-code/9813473#9813473) aiuto. – yorkw

risposta

10

è necessario impostare il tipo di contenuto "application/x-www-form-urlencoded" nelle intestazioni della richiesta per il tipo di dati che si desidera inviare.

Ho testato la tua API per i dati sopra citati, funziona correttamente e ho ricevuto molti dati in risposta. Lo puoi trovare here.

si può provare il seguente codice:

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: stavo ottenendo errore Expectation Failed degli errori 417 per il vostro servizio Web. Quindi abbiamo bisogno di aggiungere un altro parametro nella nostra richiesta. È request.getParams().setParameter(CoreProtocolPNames.USE_EXPECT_CONTINUE, Boolean.FALSE);. Ho aggiornato il codice sopra con questo. Ora funziona bene.

La risposta è simile a questa.

Response looks something like this.

Spero che questo vi aiuterà.

Acclamazioni
N_JOY

+0

Ho usato il tuo codice (aggiunto il nome del giocatore come parametro dinamico) e ho ancora ottenuto alcune cose HTML nella stringa "test" ... ecco la mia classe completa: http : //pastebin.com/QBpTcjAG Forse sto andando male ad un certo punto? – Droidman

+0

Ho provato ma ora il server sta dando 403 vietato –

+0

davvero strano .. ho appena eseguito il codice che ho postato su pastebin, nessun errore tranne HTML invece di JSON .. – Droidman

0

tenta di visualizzare l'URL nel navigatore, credo che ci sia una dichiarazione DOCTYPE!, che sicuramente non può essere analizzato su un oggetto JSON.

+0

Sono reindirizzato alla pagina principale se provo ad aprire l'URL nel browser, sei sicuro che vuol dire che l'URL non è corretto? In passato ricevevo alcune risposte JSON, ma il sistema con cui ho lavorato era completamente diverso, non è stato possibile aprire l'URL della richiesta nel browser. – Droidman

+0

@ Maver1ck Se l'url richiede qualche tipo di variabile di sessione (come le credenziali di accesso) non è possibile visualizzarlo direttamente utilizzando il browser, ma è possibile verificare la stringa jsonResults utilizzando lo strumento di debug di eclipse o semplicemente eseguendo il logout per vedere la risposta ricevuta. Una risposta JSON corretta non dovrebbe comunque contenere la dichiarazione DOCTYPE. – reTs

+0

Ho modificato la domanda, stavo camminando nel modo sbagliato .. – Droidman