Hantarkan Pautan ke Reddit API

Bahagian Keselamatan

Saya baru sahaja mengumumkan kursus Learn Spring Security yang baru, termasuk bahan penuh yang tertumpu pada timbunan OAuth2 baru di Spring Security 5:

>> SEMAK KELUARAN KURSUS Teratas

Saya baru sahaja mengumumkan kursus Learn Spring yang baru , yang berfokus pada asas-asas Spring 5 dan Spring Boot 2:

>> SEMAK KURSUS

1. Gambaran keseluruhan

Dalam artikel kedua siri ini, kami akan membina beberapa fungsi mudah untuk menghantar di Reddit dari aplikasi kami, melalui API mereka.

2. Keselamatan yang diperlukan

Pertama - mari kita keluarkan aspek keselamatan.

Untuk Mengirim Pautan ke Reddit , kita perlu menentukan Sumber yang dilindungi OAuth dengan ruang lingkup " kirim ":

@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; }

Perhatikan bahawa kami juga menentukan skop " identiti " kerana kami juga memerlukan akses maklumat akaun pengguna.

3. Adakah Captcha Diperlukan?

Pengguna yang baru menggunakan Reddit harus mengisi Captcha untuk menghantar; sebelum mereka melepasi ambang karma tertentu di Reddit.

Untuk pengguna ini, pertama-tama kita perlu memeriksa sama ada Captcha diperlukan:

private String needsCaptcha() { String result = redditRestTemplate.getForObject( "//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( "//oauth.reddit.com/api/new_captcha", req, String.class, param); String[] split = result.getBody().split("""); return split[split.length - 2]; }

4. Borang " Kirim Pos "

Seterusnya, mari buat borang utama untuk menghantar catatan baru ke Reddit. Untuk menghantar Pautan memerlukan butiran berikut:

  • tajuk - tajuk artikel
  • url - URL artikel
  • subreddit - sub-reddit untuk menghantar pautan ke

Oleh itu, mari kita lihat bagaimana kita dapat memaparkan halaman penyerahan mudah ini:

@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"; }

Dan tentunya asas penyerahanForm.html :

 Post   function submitPost(){ var data = {}; $('form').serializeArray().map(function(x){data[x.name] = x.value;}); $.ajax({ url: "api/posts", data: JSON.stringify(data), type: 'POST', contentType:'application/json' }).done(function(data) { if(data.length < 2){ alert(data[0]);} else{ window.location.href="submissionResponse?msg="+ data[0]+"&url="+data[1]; } }).fail(function(error) { alert(error.responseText); }); } 

5. Kirim Pautan ke Reddit

Sekarang - mari kita lihat langkah terakhir - menghantar pautan sebenar melalui Reddit API.

Kami akan MENGHANTAR permintaan kiriman ke Reddit menggunakan parameter dari submissionForm kami :

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

Inilah pelaksanaan kaedah sebenar:

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

Dan logik penghuraian mudah, menangani tindak balas dari Reddit API:

private List parseResponse(JsonNode node) { String result = ""; JsonNode errorNode = node.get("json").get("errors").get(0); if (errorNode != null) { for (JsonNode child : errorNode) 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"); } } }

Semua ini berfungsi dengan DTO asas :

public class PostDto { @NotNull private String title; @NotNull private String url; @NotNull private String subreddit; private boolean sendReplies; private String iden; private String captcha; }

Akhirnya - submissionResponse.html :

Hello

Hello

Here

6. Kesimpulannya

Dalam tutorial ringkas ini kami melaksanakan beberapa fungsi Submit to Reddit asas - sederhana tetapi berfungsi sepenuhnya.

Pada bahagian seterusnya dari kajian kes ini, kami akan melaksanakan fungsi Jadual Jadual untuk Kemudian ke dalam aplikasi kami.

The pelaksanaan penuh tutorial ini boleh didapati dalam projek github - ini adalah projek berasaskan Eclipse, jadi ia harus mudah untuk import dan berjalan kerana ia adalah.

Bahagian bawah keselamatan

Saya baru sahaja mengumumkan kursus Learn Spring Security yang baru, termasuk bahan penuh yang tertumpu pada timbunan OAuth2 baru di Spring Security 5:

>> SEMAK KENDIRI DI bahagian bawah

Saya baru sahaja mengumumkan kursus Learn Spring yang baru , yang berfokus pada asas-asas Spring 5 dan Spring Boot 2:

>> SEMAK KURSUS