尝试使用Android签入Foursquare时FileNotfoundException

尝试使用Android签入Foursquare时FileNotfoundException,android,foursquare,Android,Foursquare,从最近几天开始,我就一直在努力寻找答案,但运气不好,甚至有些答案也没有帮助 我试图在通过Android接收到用户的UserToken后签入用户。我在getInputStream()处得到了一个FileNotfoundException,未经身份验证的API,如 ”https://api.foursquare.com/v2/venues/categories“工作正常。我错过什么了吗 URL url = new URL("https://api.foursquare.com/v2/chec

从最近几天开始,我就一直在努力寻找答案,但运气不好,甚至有些答案也没有帮助

我试图在通过Android接收到用户的UserToken后签入用户。我在
getInputStream()
处得到了一个
FileNotfoundException
,未经身份验证的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;

经过努力终于解决了这个问题。请参阅下面我的答案。

尝试使用与添加venueid相同的方法添加oauth_令牌。此外,您的venueid无效,因此请确保您正在将用户签入真实的场地。

首先:您有https url,并尝试创建HttpURLConnection。您应该使用HttpsURLConnection


:您可以尝试添加conn.setDoOutput(true),“post”请求需要它。如果没有它,服务器可以尝试从您那里发出get请求,尽管使用conn.setRequestMethod(“POST”)。您还可以检查浏览器插件中的标题,并将其放入您的请求中。

好的,我终于解决了这个问题,我不知道上面的代码到底出了什么问题,但下面的代码起了作用

此API需要POST调用,但即使是venueID也必须是URL的一部分,并且addRequestProperty似乎没有正确发送venueID。因此,我将代码更改为

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

这就解决了问题。谢谢大家,
HttpURLConnection
类具有误导性,因为它会对任何400或以上的HTTP错误代码抛出
FileNotFoundException

所以它不一定是一个错误的URL(404),它可能是400(错误请求),403(禁止),500(内部服务器错误)等等


使用该方法可以更精确地指示问题。

可能是服务器的404响应。检查响应代码当我将URL放入浏览器时,它与浏览器配合得很好?你确定要执行POST op而不是GET吗?我使用浏览器插件发布venueid值。问题可能与身份验证有关。您是否尝试过c.setRequestProperty(“授权”、“基本”+Base64.encode(“myuser:mypass.getBytes());尝试了这个,没有工作,加上venueId是正确的,因为我通过一个浏览器插件测试了它,通过POST提供了这两个值。您在示例中编写的venueId参数不可能是正确的。场馆ID参数为24个字符长的十六进制字符串。您应该尝试手动组合URL,并使用CURL验证它是否有效。这将让您检查响应是否有错误。我通过浏览器尝试了此场馆ID,效果非常好,我将通过浏览器重试。您说得对,这是误导,我必须使用浏览器获取正确的错误代码。下次我会记住这一点。但是你认为是什么原因导致我在URL中传递参数时它工作而不是通过AddRequestProperty?