Недопустимое двойное значение после приведения из float с конечными точками GAE

Я использую API конечных точек из облака Google и отправляю двойные значения, которые преобразуются из float в Android. В большинстве случаев это работает хорошо, но я заметил, что при небольшом количестве устройств я получаю следующую ошибку:

ошибка 400, неверный запрос

{
    "code": 400,
    "errors": [{
        "domain": "global",
        "location": "longitude",
        "locationType": "parameter",
        "message": "Invalid double value: '116.31765747070313'.",
        "reason": "invalidParameter"
    }],
    "message": "Invalid double value: '116.31765747070313'."
}

Вот код на стороне андроида:

void callEndpoints(final int level, final float latitude, final float longitude) {
    try {
        API.GetPlacesFromLocationV2 remoteData = cbAPI.getPlacesFromLocationV2();

        remoteData.setLatitude((double)latitude);
        remoteData.setLongitude((double)longitude);
        remoteData.setLevel((long) level);

        Result res = remoteData.execute();

        //Do stuff with res
    } catch (IOException e) {
        //print error
    }
}

Вот код на стороне сервера Python.

PLACES_LOCATION_SEARCH_V2_CONTAINER = endpoints.ResourceContainer(
   message_types.VoidMessage,
   level=messages.IntegerField(1),
   longitude=messages.FloatField(2),
   latitude=messages.FloatField(3)
)

def getCellIdx(level, lon, lat):
   scale = pow(2, level)
   cellWidth = FULL_WIDTH / scale
   cellHeight = FULL_HEIGHT / scale

   wIdx = int((lon + 180.0) / cellWidth)
   hIdx = int((lat + 90.0) / cellHeight)

   return level * 100000000 + hIdx * 10000 + wIdx

@endpoints.method(PLACES_LOCATION_SEARCH_V2_CONTAINER, 
   DataCollection, 
   path="getPlacesFromLocation_v2", http_method='GET', 
   name="getPlacesFromLocation_v2")
def getPlacesFromLocation_v2(self, request):
  cellIdx = placesGridSearch.getCellIdx(request.level,request.longitude,request.latitude)
  #Do stuff with cellIdx, includes datastore access and memcache usage
  return DataCollection(cellIdx)

Спасибо за вашу помощь.

Изменить: некоторая дополнительная информация. Я получаю ту же ошибку, если запускаю ее через проводник API с тем же значением долготы в облаке, но не запускаю ее на своем локальном сервере разработки. Также похоже, что функция endpoints никогда не вызывается (журнала нет), но есть журнал /_ah/spi/BackendService.logMessages, описывающий точно такую ​​же ошибку.


person dk_dev    schedule 13.10.2017    source источник
comment
не могли бы вы опубликовать свой код на стороне сервера?   -  person Michael Meyer    schedule 13.10.2017
comment
@MichaelMeyer Я добавил код Python на стороне сервера, насколько я думаю, это необходимо для простоты.   -  person dk_dev    schedule 13.10.2017


Ответы (1)


Перейдите на Endpoints Frameworks v2. У него не будет этой проблемы.

person saiyr    schedule 16.10.2017
comment
Спасибо за ваше предложение. Это было в моем списке задач на некоторое время. Я только что обновил его. Я следовал инструкциям, но теперь у меня нет обработчиков, соответствующих этому URL-адресу. на стороне сервера. Запросы от пользовательских приложений по-прежнему идут в /_ah/spi/..., который я изменил в app.yaml на /_ah/api/.* в соответствии с инструкциями. Должен ли я выпускать новую версию приложения? И если да, то как мне одновременно обрабатывать серверную часть? Спасибо. - person dk_dev; 18.10.2017
comment
Кстати. У меня было только 10% трафика на новую версию моего живого сервера. Может ли это быть проблемой? На моем тестовом сервере (тоже в облаке) все работает нормально. Там у меня был 100% трафик, идущий на него. - person dk_dev; 18.10.2017
comment
Да, не используйте для этого разделение трафика. После миграции разделение трафика должно работать. Вам не нужна новая версия вашего клиента, только ваш сервер. - person saiyr; 18.10.2017
comment
Спасибо! Сейчас это на конечных точках версии 2. Сейчас посмотрю исчезнут ли ошибки. - person dk_dev; 19.10.2017
comment
Похоже, это исправило ошибку. Но теперь у меня есть для одной из конечных точек эта ошибка: Конечная точка не найдена для пути:. Это происходит менее чем в 3% случаев. Есть идеи? Спасибо за вашу помощь. - person dk_dev; 20.10.2017
comment
Не бери в голову. Похоже, клиентская сторона время от времени вызывает эти конечные точки без параметров. - person dk_dev; 20.10.2017