HOSTPURLConnection POST-запрос не возвращает значения - PullRequest
0 голосов
/ 26 декабря 2010

У меня проблема с обработкой соединений HTTP URL, которые не возвращают данные.Код, который я использую, приведен ниже ... Это в основном клиент обмена сообщениями, и этот метод получает любые сообщения, отправленные поддельному пользователю (боту), а затем я могу манипулировать сообщениями, искать ключевые слова и отвечать отбот.

public void getMessages(String bot)
{
    xml = "" +
          "xmlMessage=<message type=\"comet.get.message.updates\" "
          + "id=\"" + bot + "\" "
          + "password=\"" + password + "\" />";

    // Replace spaces (partial url encode).
    xml = xml.replace(" ", "%20");

    String serverResponse = "";

    try
    {
        // Build URL
        url = new URL(botUrl);
        request = (HttpURLConnection)url.openConnection();

        // Set the Request Method.
        request.setRequestMethod("POST");
        request.setDoInput(true);
        request.setDoOutput(true);
        request.setUseCaches(false);
        request.setAllowUserInteraction(false);
        request.setRequestProperty("Content-type", "text/xml; charset=" + "UTF-8");

        out = request.getOutputStream();
        writer = new OutputStreamWriter(out, "UTF-8");
        writer.write(xml);
        writer.close();

        String temp = "";

        buff = new BufferedReader ( new InputStreamReader ( request.getInputStream() ) );
        while ( (temp = buff.readLine()) != null )
        {
            serverResponse = serverResponse + temp;
        }

//     XML RESPONSE EXAMPLE
//            xml = "- <message type=\"comet.message.updates\" id=\"chalkboard.status@fdq.att.com\" count=\"2\">z" +
//                        "- <contact id=\"jy5740\" />" +
//                             "<statement text=\"test\" from=\"jy5740\" />" +
//                             "<statement text=\"testing 123\" from=\"jy5740\" />" +
//                          "</contact>" +
//                     "</message>";
    }
    catch (MalformedURLException ex)
    {
        System.out.println("Bad URL: " + ex);
    }
    catch (IOException ex)
    {
        System.out.println("Connection error: " + ex);
    }

    // do stuff with the serverResponse string

Метод отлично работает, если есть сообщения, которые не были получены во время вызова метода.Проблема в том, что со времени последней проверки не было никаких сообщений.Метод просто остается в цикле while, пока бот не заблокирует мое приложение.Как определить, не было ли ответа от сервера?

Ответы [ 2 ]

1 голос
/ 26 декабря 2010

Комета point - это "длинный опрос" - вы делаете запрос, и он не будет выполнен, пока не будет получен реальный ответ или пока не истечет время ожидания.Другими словами, если нет сообщений, я ожидаю, что вызов на readLine будет блокироваться в течение длительного времени.

Если вам нужно сделать запрос, который не будет приниматьв течение длительного времени вам нужно либо указать где-то время ожидания (возможно, на уровне HTTP, возможно, в содержимом XML), либо использовать другой вызов для начала - вполне может быть другой видсообщение, используемое для не зависающих запросов.

0 голосов
/ 26 декабря 2010

Понятия не имею, но вот мой код для HTTP Post:


            HttpClient httpclient = new DefaultHttpClient();
            HttpPost httppost = new HttpPost(UPLOAD_URL);

            MultipartEntity reqEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);

            try {
                reqEntity.addPart("param1", new StringBody("yes"));
                reqEntity.addPart("param2", new StringBody("no"));

                httppost.setEntity(reqEntity);

                LOG.debug("executing request " + httppost.getRequestLine());
                HttpResponse response = httpclient.execute(httppost);
                HttpEntity resEntity = response.getEntity();

                String urlImageShack = null;
                if (resEntity != null) {
                    // XML returned by Imageshack
                    String page = EntityUtils.toString(resEntity);
                    LOG.debug("It return: " + page);
                }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...