Получение потока XML с http-сервера - проблема Android - PullRequest
1 голос
/ 19 июля 2011

В моем приложении мне нужно получить список некоторых назначений с сервера. На сервере у меня есть метод, скажем fetchAssignments (int, String), который принимает два значения в качестве своих параметров.

  1. Период (сегодня, текущий месяц или текущая неделя) - целое число
  2. идентификатор пользователя - строка

Эта функция возвращает список назначений в виде потока XML. Я знаю, как я могу подключиться к http-серверу. Но я не понимаю, как я могу вызвать этот метод на сервере и передать ему эти параметры. Кто-нибудь может предложить мне лучший способ сделать это ...?

Ответы [ 2 ]

3 голосов
/ 19 июля 2011

Вы можете просто запросить XML как InputStream с сервера, используя HTTP-запрос GET, и передать параметры в качестве параметров запроса:

http://some.server/webapp?period=1&userid=user1

С помощью метода, подобного приведенному ниже, вы можете получить поток с сервера:

/**
 * Returns an InputStream to read from the given HTTP url.
 * @param url
 * @return InputStream
 * @throws IOException
 */
public InputStream get(final String url) throws IOException {
    HttpClient httpClient = new DefaultHttpClient();
    HttpParams httpParams = httpClient.getParams();
    HttpConnectionParams.setConnectionTimeout(httpParams, TIMEOUT);
    HttpConnectionParams.setSoTimeout(httpParams, TIMEOUT);
    HttpGet httpget = new HttpGet(url);
    HttpResponse httpResponse = httpClient.execute(httpget);
    StatusLine statusLine = httpResponse.getStatusLine();
    if(! statusLine.getReasonPhrase().equals("OK")) {
        throw new IOException(String.format("Request failed with %s", statusLine));
    }
    HttpEntity entity = httpResponse.getEntity();
    return entity.getContent();
}

И затем вы можете использовать «простую» (http://simple.sourceforge.net/) библиотеку XML для разбора XML на JAXB-подобные объекты:

/**
 * Reads the XML from the given InputStream using "Simple" and returns a list of assignments.
 * @param InputStream
 * @return List<Assignment>
 */
public List<Assignment> readSimple(final InputStream inputStream) throws Exception {

    Serializer serializer = new Persister();

    return serializer.read(AssignmentList.class, inputStream).getAssignments();     
}

Я делаю это в значительной степени, просто с помощью службы REST, поэтому я не использую параметры запроса.

1 голос
/ 19 июля 2011

В зависимости от языка вы можете передать параметры через HTTP-запрос URL или с помощью POST. В конструкторе для класса (предполагая, что это веб-страница? .Php? .Aspx?) Извлеките эти значения и передайте их методу, упомянутому выше?

try{        
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://www.yoursite.com/getfeed.php");
InputSource inStream = new InputSource();

try {
// Add data
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
nameValuePairs.add(new BasicNameValuePair("period", period));
nameValuePairs.add(new BasicNameValuePair("userid", user_id));
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

 // Execute HTTP Post Request
HttpResponse response = httpclient.execute(httppost);
HttpEntity r_entity = response.getEntity();
String xmlString = EntityUtils.toString(r_entity);

xmlString = xmlString.trim();
InputStream in = new ByteArrayInputStream(xmlString.getBytes("UTF-8"));

if(xmlString.length() != 0){
inStream.setByteStream(in);
PARSE_FLAG = true;
}
else
{
PARSE_FLAG = false;
}

} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
} catch (IOException e) {
// TODO Auto-generated catch block
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...