FileNotfoundException при попытке проверить Foursquare с помощью Android

Я пробовал искать ответы для этого с последних нескольких дней без везения, даже некоторые из ответов stackoverflow не помогли.

Я пытаюсь проверить пользователя после получения его UserToken через Android. Я получаю FileNotfoundException в getInputStream() , не аутентифицированные API, например «https://api.foursquare.com/v2/venues/categories» работает хорошо. Я что-то упускаю?

    URL url = new URL("https://api.foursquare.com/v2/checkins/add?oauth_token="+token);
    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    conn.addRequestProperty("venueId","12238");
    conn.setDoInput(true);
    conn.setRequestMethod("POST");
    conn.setAllowUserInteraction(true);
    conn.connect();
    InputStream is = conn.getInputStream();
    String response = streamToString(is);
    return response;

Это удалось решить после многих усилий. См. Мой ответ ниже.

0
добавлено отредактировано
Просмотры: 2
nl ja de
вероятно, 404 ответ от сервера. Проверьте код ответа
добавлено автор Blackbelt, источник
браузера? Вы уверены, что вам нужно выполнить POST вместо GET?
добавлено автор Blackbelt, источник
Вероятно, проблема связана с аутентификацией. Вы пробовали c.setRequestProperty («Авторизация», «Базовый» + Base64.encode («myuser: mypass» .getBytes ()));
добавлено автор Blackbelt, источник
Итак, «conn.addRequestProperty» («siteid», «12238»); бесполезно?
добавлено автор Blackbelt, источник
Неважно. Проверьте код ответа сервера
добавлено автор Blackbelt, источник
Он хорошо работает с браузером, когда я помещаю URL.
добавлено автор Sharjeel Ahmed, источник
Я использовал плагин для браузера для значения POST.
добавлено автор Sharjeel Ahmed, источник
не требуется авторизация для Foursquare с пользователем/pass, поскольку мы не должны хранить имя пользователя и пароль пользователя, вместо этого мы используем токен
добавлено автор Sharjeel Ahmed, источник
Он добавляет свойство POST (я предполагаю), поскольку мне нужно, чтобы он проверялся.
добавлено автор Sharjeel Ahmed, источник

4 ответы

Класс HttpURLConnection вводит в заблуждение, поскольку он будет генерировать FileNotFoundException для любого кода ошибки HTTP 400 или выше.

Таким образом, это не обязательно неправильный URL (404), это может быть 400 (неудачный запрос), 403 (запрещено), 500 (внутренняя ошибка сервера) и т. Д.

Используйте getResponseCode , чтобы получить более точное указание проблемы.

1
добавлено
Вы правы в этом, это вводит в заблуждение, мне пришлось использовать браузер, чтобы получить правильный код ошибки. В следующий раз это будет иметь в виду. Но что, по вашему мнению, является причиной, когда я передаю параметры в URL-адресе, который он работает, а не через AddRequestProperty?
добавлено автор Sharjeel Ahmed, источник

Попробуйте добавить oauth_token, используя тот же метод, который вы используете для добавления eventid. Кроме того, ваш siteID недействителен, поэтому убедитесь, что вы проверяете пользователя на реальном месте.

1
добавлено
Параметр siteID, который вы написали в вашем примере, не может быть прав. Параметры идентификатора места - это длинные шестнадцатеричные строки длиной 24 символа. Вы должны попробовать составить URL-адрес вручную и использовать CURL, чтобы убедиться, что он работает. Это позволит вам проверить ответ на ошибки.
добавлено автор pfhayes, источник
Пробовал это, не работая, плюс eventId прав, поскольку я тестировал его через плагин браузера, дающий оба значения через POST
добавлено автор Sharjeel Ahmed, источник
Я пробовал этот идентификатор места в браузере и отлично работал, я попробую снова через CURL
добавлено автор Sharjeel Ahmed, источник

Okie Мне, наконец, удалось решить проблему, я не знаю, в чем проблема с моим кодом выше, но сработало.

Для этого API требуется POST-вызов, но даже идентификатор места размещения должен быть частью URL-адреса, а addRequestProperty, похоже, не правильно отправляет идентификатор места. Поэтому я изменил код на

URL url = new URL("https://api.foursquare.com/v2/checkins/add?venueId=12238&oauth_token="+token);

И это решило проблему. Спасибо всем

0
добавлено

first: Yoy have https url, and trying to create HttpURLConnection. You should use HttpsURLConnection.

Second: You can try to add conn.setDoOutput(true), "post" request requires it. And without it server can try give a get request from you despite on conn.setRequestMethod("POST"). Also you can check headers from your browser plugin, and put them into your request.

0
добавлено