我已经编写了oauth2社交客户端,但无法获取授权用户的朋友列表
请查看我的代码以查看缺少的内容/
问候
请看@RequestMapping(“ vkontakte / friends”)
Java 1.8 Spring安全性
@SpringBootApplication
@RestController
@EnableOAuth2Client
public class SocialApplication extends WebSecurityConfigurerAdapter {
@Autowired
OAuth2ClientContext oAuth2ClientContext;
@RequestMapping({ "/user", "/me" })
public Map<String, String> user(Principal principal) {
Map<String, String> map = new LinkedHashMap<>();
map.put("name", principal.getName());
return map;
}
//TODO как это оформить на фронтенде?
@RequestMapping("/vkontakte/friends")
public Map<String,String> friends() {
OAuth2RestTemplate vkTemplate = new OAuth2RestTemplate(vk(), oAuth2ClientContext);
UserInfoTokenServices tokenServicesvk = new UserInfoTokenServices(vkResource().getUserInfoUri(), vk().getClientId());
tokenServicesvk.setRestTemplate(vkTemplate);
ObjectNode resultNode = vkTemplate.getForObject(vkResource().getUserFriendsInfoUri(), ObjectNode.class);
ArrayNode data = (ArrayNode) resultNode.get("data");
Map<String, String> map = new LinkedHashMap<>();
for (JsonNode dataNode : data) {
//TODO надо как то правильно все получить?
}
return map;
最佳答案
为了从Vkontakte获取朋友,您必须声明一个friend对象,该对象将包含朋友具有的JSON结构的所有字段。
根据documentation,每个朋友都有一个id,名字和姓氏,但是响应对象比我们需要的要复杂一些,因此您可以删除不需要的对象。
假设我们需要响应的所有属性,我们可以提出两个对象:结果和朋友。
Vkontakte朋友对象
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class VkontakteFriend {
private Long id;
@JsonProperty("first_name")
private String firstName;
@JsonProperty("last_name")
private String lastName;
}
通用结果对象
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class FriendResponse {
private Long count;
private List<VkontakteFriend> items;
}
剩下的唯一事情就是调用API,并将您的响应映射到Java对象。
vkTemplate.getForObject(vkResource().getUserFriendsInfoUri(), FriendResponse.class);