Рубрики
Без рубрики

Опубликовать ссылку на API Reddit

Основное взаимодействие с API Reddit – размещение новой ссылки с использованием Spring Security OAuth2.

Автор оригинала: baeldung.

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);

    Map param = 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 :

captcha

5. Отправить ссылку на Reddit

Теперь - давайте посмотрим на последний шаг - отправка фактической ссылки через Reddit API.

Мы пост запрос на Reddit, используя параметры из нашей представлениеФорма :

@Controller
@RequestMapping(value = "/api/posts")
public class RedditPostRestController {

    @Autowired
    private RedditService service;

    @RequestMapping(method = RequestMethod.POST)
    @ResponseBody
    public List submit(@Valid @RequestBody PostDto postDto) {
        return service.submitPost(postDto);
    }
}

Вот фактическая реализация метода:

public List submitPost(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 List parseResponse(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, поэтому он должен быть легким для импорта и запуска, как она есть.