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. Есть идеи, что может быть не так с моей просьбой?
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);
. Я обновил выше код с этим. Теперь он работает нормально.
ответ выглядит примерно так.
надеюсь, это поможет.
Ура
N_JOY
попробуйте просмотреть url в браузере, я считаю, что есть !Объявление DOCTYPE, которое определенно не может быть проанализировано для объекта JSON.