1

我正在尝试与 Facebook 进行简单的交流。目前,我可以让用户登录并以他们的身份发布到他们的墙上。但无论出于何种原因,我似乎无法访问他们的姓名等公共信息。我一直收到此错误:

{"error":{"message":"语法错误 \"预期字符串结尾而不是 \"?\".\" 在字符 4: name?access_token=MYACCESSTOKEN","type":"OAuthException","code ":2500}}

这是电话:

SampleRequestListener srl = new SampleRequestListener();
AsyncFacebookRunner afr = new AsyncFacebookRunner(facebook);
afr.request("http://graph.facebook.com/me?fields=name", (RequestListener)srl);

该调用是在经过验证的会话中进行的(在 .Authorize 的 DialogListener 的 onComplete 部分中)。使用我的 access_token 和与上面完全相同的字符串,我可以让请求在http://developers.facebook.com/tools/explorer/上正常工作

解析 RequestListener.onComplete 中的响应时发生错误

JSONObject json = Util.parseJson(response);
final String name = json.getString("name");
System.out.println("Hi, my name is " + name);

感谢您的时间。欢迎所有输入。

更新 *

有两件事正在发生。在 facebook API 中,Util.openUrl 附加了一个“?” 在字段名称和 access_token 之间(正如下面的答案所指出的)。这似乎很奇怪。我想知道我是否提取了旧版本的 API 之类的。你会认为这将被正确设置。

另外,我错误地调用了该方法:这个:

afr.request("http://graph.facebook.com/me?fields=name", (RequestListener)srl);

应该:

afr.request("me?fields=name", (RequestListener)srl);
4

2 回答 2

3

如果您使用的是 com.facebook.Request 类,那么只需使用以下形式的构造函数:Request(Session session, String graphPath, Bundle parameters, HttpMethod httpMethod, Callback callback) 并在“parameters”参数中传递您的参数。

就像:

if (GlobalApplication.accessToken != null && !GlobalApplication.accessToken.isExpired()) {
                    /* make the API call */
                    Bundle b = new Bundle();
                    b.putString("fields", "id,created_time,description,embed_html,name,source,picture");
                    new GraphRequest(GlobalApplication.accessToken, "/me/videos",
                            b, HttpMethod.GET, new GraphRequest.Callback() {
                        @Override
                        public void onCompleted(GraphResponse response) {
                            /* handle the result */
                            Log.i("", "");
                            String string = response.toString();

                            JSONObject object = response.getJSONObject();
                            JSONArray array = response.getJSONArray();
                            Log.i("", "");
                        }
                    }).executeAsync();
于 2014-08-27T23:01:05.787 回答
1

看起来正在发送的实际请求类似于

/me?fields=name?access_token=MYACCESSTOKEN

这当然是错误的;它应该是第二个参数之前的和号,而不是问号。

您必须在代码中查找将访问令牌添加为参数的位置。此时应该在附加 access_token 参数之前检查此 URL 是否已包含问号。

于 2012-07-16T20:18:43.740 回答