Как установить полезную нагрузку для HttpPut? Мой код не будет записывать целевую температуру

Я не могу заставить свой код установить целевую температуру (в Android). Код, показанный ниже, получает статус OK (200) вместе с текущей температурой в качестве полезной нагрузки. Я ожидал получить новую температуру, которую я написал (65 градусов по Фаренгейту). Я использую URL-адрес:

https://developer-api.nest.com/devices/thermostats/THERMOSTAT-ID/target_temperature_f?auth=AUTH CODE

с моим идентификатором термостата и кодом аутентификации на месте. У меня также есть права на чтение и запись для моего клиента. Когда я выполняю аналогичный запрос в имеющемся у меня расширении Chrome, температура на термостате устанавливается правильно. Может ли кто-нибудь определить, что мне здесь не хватает? Закомментированный код показывает пару вещей, которые я пробовал.

Спасибо.

    InputStream is = null;
    String result = "";

    try{

        HttpClient httpclient = new DefaultHttpClient();
        HttpPut httpPut = new HttpPut(url);
        httpPut.addHeader("Content-Type", "application/json");
        httpPut.addHeader("Accept", "application/json");
        //httpPut.addHeader("Connection", "keep-alive");
        httpclient.getParams().setBooleanParameter("http.protocol.expect-continue",false);
        //value.setContentType("application/json");
        httpPut.setEntity(new StringEntity("65");
        HttpResponse response = httpclient.execute(httpPut);
        HttpEntity entity = response.getEntity();
        is = entity.getContent();
        int statusCode = response.getStatusLine().getStatusCode();
        Log.d("StatusCode",Integer.toString(statusCode));

    }catch(Exception e){
        Log.e("log_tag", "Error in http connection "+e.toString());
    }

    // Convert response to string
    try{
        BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
        StringBuilder sb = new StringBuilder();
        String line;
        while ((line = reader.readLine()) != null) {
            sb.append(line + "\n");
        }
        is.close();
        result=sb.toString();
        Log.d("Result",result);
    }catch(Exception e){
        Log.e("log_tag", "Error converting result "+e.toString());
    }

person user3822689    schedule 10.07.2014    source источник


Ответы (4)


Это то, что я запускаю, чтобы изменить температуру:

curl -v -L -X PUT "https://developer-api.nest.com/devices/thermostats/<THERMOSTAT ID>/target_temperature_f?auth=<AUTH CODE>" -H "Content-Type: application/json" -d "65"

Не могли бы вы попробовать изменить свой заголовок, чтобы он больше походил на то, что я запускал? Мое единственное другое предположение состоит в том, что target_temperature_f является целым числом и не передается как целое число.

person jfudgeelder    schedule 10.07.2014
comment
Я не уверен, как я могу отредактировать свой заголовок, чтобы он больше походил на ваш. У меня уже есть набор Content-Type. Что касается вашего второго предложения, интересно, есть ли способ передать как int? Я знаю, что теперь это строковая сущность, но, возможно, есть какая-то целая сущность? Я посмотрю, смогу ли я что-нибудь откопать. обновление: нет способа различить строку или int, который я мог найти - person user3822689; 11.07.2014
comment
StringEntity работает нормально. Вы должны быть в состоянии установить значение с ним. - person Nagesh Susarla; 11.07.2014

Значение должно быть передано как целое (F) и полуплавающее (C).

person Lev    schedule 11.07.2014

Вы не можете записать целевую температуру при определенных условиях. см. страницу https://www.developer.nest.com/documentation/error-codes#targettemp для правил.

Например: вы не можете сохранить целевую температуру, когда:

  • дом находится в режиме «в гостях».
  • используется аварийное тепло.
  • ОВК находится в режиме «выключено».
  • детектор дыма сработал защитное отключение.
person Kim Gregory    schedule 01.08.2014

Не могли бы вы сообщить нам, какой ответ/код вы получили?

Обновление: похоже, вы используете это на Android. Я бы рекомендовал использовать HttpsURLConnection на Android. Вот пример с HttpsURLConnection

    public static int setThermostatTemperatureF(int temperatureF, String apiUrl) {
      HttpsURLConnection.setFollowRedirects(true);
      BufferedReader reader = null;
      try {
        URL url = new URL(apiUrl);
        HttpsURLConnection ucon = (HttpsURLConnection) url.openConnection();
        ucon.setRequestProperty("Content-Type", "application/json");
        ucon.setRequestMethod("PUT");
        ucon.setDoOutput(true);
        // Write the PUT body
        OutputStreamWriter writer = new OutputStreamWriter(ucon.getOutputStream());
        writer.append(Integer.toString(temperatureF));
        writer.flush();

        return ucon.getResponseCode();
      } catch (MalformedURLException e) {
        e.printStackTrace();
      } catch (IOException e) {
        e.printStackTrace();
      }
      return -1;
    }

Предыдущий ответ: Судя по коду, вы, возможно, не следуете перенаправлению, возвращаемому developer-api.nest.com. С HttpClient 4.2 и более поздних версий вы можете использовать следующую стратегию перенаправления, чтобы убедиться, что временное перенаправление выполняется.

        httpClient.setRedirectStrategy(new DefaultRedirectStrategy() {
          @Override
          protected boolean isRedirectable(String method) {
            return HttpGet.METHOD_NAME.equals(method) ||
                    HttpPut.METHOD_NAME.equals(method);
          }
        });

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

person Nagesh Susarla    schedule 11.07.2014