Web services Play框架:获取foursquare访问令牌
我试图了解Play框架如何处理其web服务调用 这是Foursquare的方向(在1和2之后): 这是我的代码: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
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;
}
}