1. Обзор
В этой второй статье серии, мы будем строить некоторые простые функции, чтобы разместить на Reddit из нашего приложения, через их API.
2. Необходимая безопасность
Во-первых – давайте аспект безопасности в сторону.
Для того, чтобы Отправить ссылку на Reddit , мы должны определить OAuth защищенный ресурс с область из ” представить “:
@Bean public OAuth2ProtectedResourceDetails reddit() { AuthorizationCodeResourceDetails details = new AuthorizationCodeResourceDetails(); details.setId("reddit"); details.setClientId(clientID); details.setClientSecret(clientSecret); details.setAccessTokenUri(accessTokenUri); details.setUserAuthorizationUri(userAuthorizationUri); details.setTokenName("oauth_token"); details.setScope(Arrays.asList("identity", "submit")); details.setGrantType("authorization_code"); return details; }
Обратите внимание, что мы также указываем область ” идентификационный ” потому что нам также нужен доступ к информации учетной записи пользователя.
3. Нужен ли Капча?
Пользователи, которые являются новыми для Reddit должны заполнить капча для того, чтобы представить; то есть, прежде чем они проходят определенный порог кармы в Reddit.
Для этих пользователей, мы сначала должны проверить, если Captcha необходимо:
private String needsCaptcha() { String result = redditRestTemplate.getForObject( "https://oauth.reddit.com/api/needs_captcha.json", String.class); return result; } private String getNewCaptcha() { HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); HttpEntity req = new HttpEntity(headers); Mapparam = new HashMap (); param.put("api_type", "json"); ResponseEntity result = redditRestTemplate.postForEntity( "https://oauth.reddit.com/api/new_captcha", req, String.class, param); String[] split = result.getBody().split("""); return split[split.length - 2]; }
4. Форма “Отправить почту”
Далее давайте создадим основную форму для отправки новых постов на Reddit. Отправка ссылки требует следующих деталей:
- титульный – название статьи
- URL – URL статьи
- subreddit – суб-Реддит, чтобы представить ссылку на
Итак, давайте посмотрим, как мы можем отобразить эту простую страницу представления:
@RequestMapping("/post") public String showSubmissionForm(Model model) throws JsonProcessingException, IOException { String needsCaptchaResult = needsCaptcha(); if (needsCaptchaResult.equalsIgnoreCase("true")) { String iden = getNewCaptcha(); model.addAttribute("iden", iden); } return "submissionForm"; }
И, конечно, основная представлениеФорма.html :
5. Отправить ссылку на Reddit
Теперь - давайте посмотрим на последний шаг - отправка фактической ссылки через Reddit API.
Мы пост запрос на Reddit, используя параметры из нашей представлениеФорма :
@Controller @RequestMapping(value = "/api/posts") public class RedditPostRestController { @Autowired private RedditService service; @RequestMapping(method = RequestMethod.POST) @ResponseBody public Listsubmit(@Valid @RequestBody PostDto postDto) { return service.submitPost(postDto); } }
Вот фактическая реализация метода:
public ListsubmitPost(PostDto postDto) { MultiValueMap param1 = constructParams(postDto); JsonNode node = redditTemplate.submitPost(param1); return parseResponse(node); } private MultiValueMap constructParams(PostDto postDto) { MultiValueMap param = new LinkedMultiValueMap (); param.add("title", postDto.getTitle()); param.add("sr", postDto.getSubreddit()); param.add("url", postDto.getUrl()); param.add("iden", postDto.getIden()); param.add("captcha", postDto.getCaptcha()); if (postDto.isSendReplies()) { param.add("sendReplies", "true"); } param.add("api_type", "json"); param.add("kind", "link"); param.add("resubmit", "true"); param.add("then", "comments"); return param; }
И простая логика разбора, обработка ответных из API Reddit:
private ListparseResponse(JsonNode node) { String result = ""; JsonNode errorNode = node.get("json").get("errors").get(0); if (errorNode != null) { for (JsonNode child : errorNode) { result = result + child.toString().replaceAll("\"|null", "") + "
"; } return Arrays.asList(result); } else { if ((node.get("json").get("data") != null) && (node.get("json").get("data").get("url") != null)) { return Arrays.asList("Post submitted successfully", node.get("json").get("data").get("url").asText()); } else { return Arrays.asList("Error Occurred while parsing Response"); } } }
Все это работает с базовый DTO :
public class PostDto { @NotNull private String title; @NotNull private String url; @NotNull private String subreddit; private boolean sendReplies; private String iden; private String captcha; }
Наконец - представлениеОтветчик.html :
Hello
Hello
Here
6. Заключение
В этом быстром учебнике мы реализовали некоторые основные Отправить на Reddit функциональность – упрощенная, но полностью функциональная.
В следующей части этого примера мы реализуем проект Расписание пост на более поздние функциональность в нашем приложении.
полная реализация этого учебника можно найти в проект github - это проект на основе Eclipse, поэтому он должен быть легким для импорта и запуска, как она есть.