exectuing HTTP-запрос POST возвращает HTML вместо JSON

редактировать полностью переработать вопрос для лучшего понимания

Я должен запросить данный url http://api.bf3stats.com/pc/player/ С 2 параметрами поста: "игрок" (для имени игрока) и " opt " (для опций). Я протестировал его на http://www.requestmaker.com/ со следующими данными:player=Zer0conf&opt=all. Я получаю правильный ответ JSON (думал, что не знаю, как их сайт выполняет запрос, я думаю, это php). Сейчас я пытаюсь сделать то же самое в 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;
}

и вот как я делаю запрос:

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

    }
}

то, что я получаю в строке" test",-это не JSON, а полная HTML-разметка некоторой страницы bf3stats. Есть идеи, что может быть не так с моей просьбой?

enter image description here

2 ответов


вам нужно установить тип содержимого "application/x-www-form-urlencoded" в заголовки запроса для типа данных, которые вы хотите отправить.

я протестировал ваш API для вышеупомянутых данных, он работает нормально, и я получил множество данных в ответ. Вы можете найти его здесь.

вы можете попробовать следующий код:

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: Я получаю ошибку ошибка ожидания - 417 для вашего веб-сервиса. Поэтому нам нужно добавить еще один параметр в нашей просьбе. Это request.getParams().setParameter(CoreProtocolPNames.USE_EXPECT_CONTINUE, Boolean.FALSE); . Я обновил выше код с этим. Теперь он работает нормально.

ответ выглядит примерно так.

Response looks something like this.

надеюсь, это поможет.

Ура
N_JOY


попробуйте просмотреть url в браузере, я считаю, что есть !Объявление DOCTYPE, которое определенно не может быть проанализировано для объекта JSON.