2013-07-15 15 views
7

EDIT całkowicie ponownie pracuje na pytanie dla lepszego zrozumieniaexectuing HTTP POST zwraca HTML zamiast JSON

muszę zapytać Podany URL http://api.bf3stats.com/pc/player/ z 2 parametrami POST: 'player' (o nazwie Player) i " opt "(dla opcji). Przetestowałem to na http://www.requestmaker.com/ z następującymi danymi: player=Zer0conf&opt=all. Otrzymuję poprawną odpowiedź JSON (myślę, że nie wiem, jak ich witryna wykonuje kwerendę, domyślam się, że to php). Teraz staram się zrobić to samo w Androidzie:

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

i tak robię żądanie:

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

    } 
} 

Co dostaję w „teście” String nie jest JSON, ale pełna HTML markup jakiejś stronie bf3stats. Jakieś pomysły co może być nie tak z moją prośbę?

enter image description here

+0

sprawdzić, czy odpowiedź [tutaj] (http://stackoverflow.com/questions/9805300/using-httpget-returning-complete-html-code/9813473#9813473) pomocy. – yorkw

Odpowiedz

10

Musisz ustawić typ zawartości "application/x-www-form-urlencoded" w nagłówkach żądań dla typu danych, które chcesz wysłać.

Przetestowałem Twój interfejs API pod kątem wyżej wymienionych danych, działa on prawidłowo i otrzymałem w odpowiedzi mnóstwo danych. Możesz go znaleźć here.

Można spróbować następujący kod:

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: byłem coraz błąd Oczekiwanie Failed BŁĄD 417 dla WebService. Musimy więc dodać jeszcze jeden parametr w naszej prośbie. Jest to request.getParams().setParameter(CoreProtocolPNames.USE_EXPECT_CONTINUE, Boolean.FALSE);. Zaktualizowałem powyższy kod za pomocą tego. Teraz działa dobrze.

Odpowiedź wygląda mniej więcej tak.

Response looks something like this.

nadzieję, że pomoże.

Cheers
N_JOY

+0

Użyłem twojego kodu (dodałem nazwę gracza jako parametr dynamiczny) i wciąż otrzymuję pewne rzeczy HTML w "teście" String ... tutaj jest moja pełna klasa: http : //pastebin.com/QBpTcjAG Może w którymś momencie się mylę? – Droidman

+0

Próbowałem, ale teraz serwer daje 403 zabronione –

+0

naprawdę dziwne .. po prostu wykonałem kod, który opublikowałem na pastebin, bez błędów, ale HTML zamiast JSON .. – Droidman

0

próby wyświetlenia adresu URL w przeglądarce, wierzę, że jest deklaracją DOCTYPE!, który zdecydowanie nie można parsować do obiektu JSON.

+0

Jestem przekierowywany do strony głównej, jeśli spróbuję otworzyć adres URL w przeglądarce, czy na pewno oznacza to, że adres URL jest nieprawidłowy? Kiedyś otrzymywałem niektóre odpowiedzi JSON, ale system, z którym pracowałem był zupełnie inny, nie można otworzyć adresu URL żądania w przeglądarce. – Droidman

+0

@ Maver1ck Jeśli ten adres URL wymaga jakiejś zmiennej sesji (jak dane logowania) nie można go wyświetlić bezpośrednio za pomocą przeglądarki, ale można zweryfikować String jsonResults za pomocą narzędzia do debugowania Eclipse lub po prostu się go wylogować, aby zobaczyć otrzymaną odpowiedź. Właściwa odpowiedź JSON nie powinna zawierać deklaracji DOCTYPE. – reTs

+0

Edytowałem pytanie, chodziłem w niewłaściwy sposób. – Droidman