Web services Play框架:获取foursquare访问令牌

Web services Play框架:获取foursquare访问令牌,web-services,playframework-2.0,foursquare,Web Services,Playframework 2.0,Foursquare,我试图了解Play框架如何处理其web服务调用 这是Foursquare的方向(在1和2之后): 这是我的代码: public static Result index() { String base = "http://foursquare.com/oauth2/authenticate"; String clientId = "?client_id=***"; String responseType = "&response_type=code"; St

我试图了解Play框架如何处理其web服务调用

这是Foursquare的方向(在1和2之后):

这是我的代码:

public static Result index() {
    String base = "http://foursquare.com/oauth2/authenticate";
    String clientId = "?client_id=***";
    String responseType = "&response_type=code";
    String redirectUri = "&redirect_uri=http://localhost:9000/code";
    return redirect(base + clientId + responseType + redirectUri);
}


public static Result code() {
        String base = "http://foursquare.com/oauth2/access_token";
        String clientId = "?client_id=***";
        String clientsecret = "&client_secret=***";
        String grantType = "&grant_type=authorization_code";
        String redirectUri = "&redirect_uri=http://localhost:9000/json";
        String code = "&code=" + request().getQueryString("code");

        return redirect(base + clientId + clientsecret + grantType
                + redirectUri + code);

    }
有两件事我很好奇:

1) 我被重定向到屏幕上显示访问令牌的页面:

URL:
https://foursquare.com/oauth2/access_token?client_id=***&客户端\u密码=***和授权\u类型=授权\u代码和重定向\u uri=http://localhost:9000/json&code=***

显示以下内容时:

{"access_token":"***"}
我本来希望被重定向到
http://localhost:9000/json
因为这是重定向uri

2) 如何获取访问令牌?我已经尝试过使用异步web服务调用,但无法使它们工作

我的尝试:

String feedUrl = base + clientId + clientsecret + grantType
                + redirectUri + code;

        final Promise<Result> resultPromise = WS.url(feedUrl).get().map(
                new Function<WS.Response, Result>() {
                    public Result apply(WS.Response response) {
                        return ok("Feed title:" + response.asJson().findPath("access_token").asText());
                    }
                }
        );

        return resultPromise;
String feedUrl=base+clientId+clientsecret+grantType
+重定向URI+代码;
最终承诺resultPromise=WS.url(feedUrl.get().map(
新函数(){
应用公共结果(WS.Response响应){
返回ok(“提要标题:+response.asJson().findPath(“访问令牌”).asText());
}
}
);
返回结果promise;
这给了我一个例外:
[ConnectException:拒绝连接:无进一步信息:foursquare.com/107.23.103.139:80至http://foursquare.com/oauth2/access_token]


非常感谢您的帮助

这是我用来获取foursquare access_令牌并向foursquare提交新搜索的类:

public class Application extends Controller {

    static final String HOST_AUTHENTICATE = "foursquare.com/oauth2/authenticate";
    static final String HOST_ACCESS_TOKEN = "https://www.foursquare.com/oauth2/access_token";
    static final String CLIENT_ID = "***";
    static final String REDIRECT_URI = "http://localhost:9000/code";
    static final String CLIENT_SECRET = "***";
    static final String GRANT_TYPE = "authorization_code";
    static final String RESPONSE_TYPE = "code";
    static final String FOURSQUARE_API_FRIENDS = "https://api.foursquare.com/v2/users/self/friends";

    public static Result index() {
        String uri = new URIBuilder().setScheme("https").setHost(HOST_AUTHENTICATE)
                .setParameter("client_id", CLIENT_ID).setParameter("response_type", RESPONSE_TYPE)
                .setParameter("redirect_uri", REDIRECT_URI).toString();

        return redirect(uri);
    }

    public static Promise<Result> code() {
        WSRequestHolder authenticate = WS.url(HOST_ACCESS_TOKEN).setQueryParameter("client_id", CLIENT_ID)
                .setQueryParameter("client_secret", CLIENT_SECRET).setQueryParameter("grant_type", GRANT_TYPE)
                .setQueryParameter("redirect_uri", REDIRECT_URI)
                .setQueryParameter("code", request().getQueryString("code").toString());

        final Promise<Result> resultPromise = authenticate.get().flatMap(new Function<WS.Response, Promise<Result>>() {
            public Promise<Result> apply(WS.Response response) {
                JsonNode json = response.asJson();
                return WS.url(FOURSQUARE_API_FRIENDS).setQueryParameter("oauth_token", json.findPath("access_token").asText())
                        .setQueryParameter("v", "20131108").get().map(new Function<WS.Response, Result>() {
                            public Result apply(WS.Response response) {
                                return ok(response.asJson());
                            }
                        });
            }
        });

        return resultPromise;
    }

}
公共类应用程序扩展控制器{
静态最终字符串HOST_AUTHENTICATE=“foursquare.com/oauth2/AUTHENTICATE”;
静态最终字符串主机访问令牌=”https://www.foursquare.com/oauth2/access_token";
静态最终字符串客户端_ID=“***”;
静态最终字符串重定向_URI=”http://localhost:9000/code";
静态最终字符串CLIENT_SECRET=“***”;
静态最终字符串GRANT\u TYPE=“授权码”;
静态最终字符串响应\u TYPE=“code”;
静态最终字符串FOURSQUARE\u API\u FRIENDS=”https://api.foursquare.com/v2/users/self/friends";
公共静态结果索引(){
字符串uri=new URIBuilder().setScheme(“https”).setHost(主机\u身份验证)
.setParameter(“客户端id”,客户端id)。setParameter(“响应类型”,响应类型)
.setParameter(“重定向_uri”,重定向_uri).toString();
返回重定向(uri);
}
公共静态承诺代码(){
WSRequestHolder authenticate=WS.url(主机访问令牌).setQueryParameter(“客户端id”,客户端id)
.setQueryParameter(“客户端密码”,客户端密码)。setQueryParameter(“授权类型”,授权类型)
.setQueryParameter(“重定向uri”,重定向uri)
.setQueryParameter(“代码”,request().getQueryString(“代码”).toString());
final Promise resultPromise=authenticate.get().flatMap(新函数(){
应用公共承诺(WS.Response-Response){
JsonNode json=response.asJson();
返回WS.url(FOURSQUARE\u API\u FRIENDS).setQueryParameter(“oauth\u令牌”,json.findPath(“access\u令牌”).asText())
.setQueryParameter(“v”,“20131108”).get().map(新函数(){
应用公共结果(WS.Response响应){
返回ok(response.asJson());
}
});
}
});
返回结果promise;
}
}

WS-call的查询参数是使用.withQueryString(“key1”->“value1”)设置的,而不是手动将它们合并到url!这又快又脏。我正在使用java,因此无法使用您的语法。主要的问题是让WS-call正常工作。啊,对不起,没有考虑语言差异。对于JavaAPI,它看起来是这样的:WS.url(“,“value1”),它返回一个RequestHolder,这样您就可以链接调用,而不必将每个步骤存储为局部变量。
public class Application extends Controller {

    static final String HOST_AUTHENTICATE = "foursquare.com/oauth2/authenticate";
    static final String HOST_ACCESS_TOKEN = "https://www.foursquare.com/oauth2/access_token";
    static final String CLIENT_ID = "***";
    static final String REDIRECT_URI = "http://localhost:9000/code";
    static final String CLIENT_SECRET = "***";
    static final String GRANT_TYPE = "authorization_code";
    static final String RESPONSE_TYPE = "code";
    static final String FOURSQUARE_API_FRIENDS = "https://api.foursquare.com/v2/users/self/friends";

    public static Result index() {
        String uri = new URIBuilder().setScheme("https").setHost(HOST_AUTHENTICATE)
                .setParameter("client_id", CLIENT_ID).setParameter("response_type", RESPONSE_TYPE)
                .setParameter("redirect_uri", REDIRECT_URI).toString();

        return redirect(uri);
    }

    public static Promise<Result> code() {
        WSRequestHolder authenticate = WS.url(HOST_ACCESS_TOKEN).setQueryParameter("client_id", CLIENT_ID)
                .setQueryParameter("client_secret", CLIENT_SECRET).setQueryParameter("grant_type", GRANT_TYPE)
                .setQueryParameter("redirect_uri", REDIRECT_URI)
                .setQueryParameter("code", request().getQueryString("code").toString());

        final Promise<Result> resultPromise = authenticate.get().flatMap(new Function<WS.Response, Promise<Result>>() {
            public Promise<Result> apply(WS.Response response) {
                JsonNode json = response.asJson();
                return WS.url(FOURSQUARE_API_FRIENDS).setQueryParameter("oauth_token", json.findPath("access_token").asText())
                        .setQueryParameter("v", "20131108").get().map(new Function<WS.Response, Result>() {
                            public Result apply(WS.Response response) {
                                return ok(response.asJson());
                            }
                        });
            }
        });

        return resultPromise;
    }

}