Posting Tautan ke Reddit API

Keamanan Top

Saya baru saja mengumumkan kursus Learn Spring Security baru, termasuk materi lengkap yang berfokus pada tumpukan OAuth2 baru di Spring Security 5:

>> LIHAT SISA KURSUS Atas

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

>> LIHAT KURSUSnya

1. Ikhtisar

Di artikel kedua dari seri ini, kita akan membangun beberapa fungsi sederhana untuk dikirim ke Reddit dari aplikasi kita, melalui API mereka.

2. Keamanan yang Diperlukan

Pertama - mari kita singkirkan aspek keamanan.

Untuk Mengirim Tautan ke Reddit , kita perlu menentukan Sumber Daya yang dilindungi OAuth dengan cakupan " 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 bahwa kami juga menentukan cakupan " identitas " karena kami juga perlu mengakses informasi akun pengguna.

3. Apakah Captcha Dibutuhkan?

Pengguna yang baru mengenal Reddit harus mengisi Captcha untuk mengirimkan; itu sebelum mereka melewati ambang karma tertentu dalam Reddit.

Untuk pengguna ini, pertama-tama kami perlu memeriksa apakah 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. Formulir " Kirim Posting "

Selanjutnya, mari buat formulir utama untuk mengirimkan posting baru ke Reddit. Mengirimkan Tautan membutuhkan detail berikut:

  • judul - judul artikel
  • url - URL artikel
  • subreddit - sub-reddit untuk mengirimkan tautan

Jadi mari kita lihat bagaimana kita dapat menampilkan halaman pengiriman sederhana 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 tentu saja submissionForm.html dasar :

 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. Kirimkan Tautan ke Reddit

Sekarang - mari kita lihat langkah terakhir - mengirimkan tautan sebenarnya melalui Reddit API.

Kami akan POST permintaan kirim 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); } }

Berikut implementasi metode sebenarnya:

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 logika parsing sederhana, menangani respons 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 bekerja dengan DTO dasar :

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

Terakhir - submissionResponse.html :

Hello

Hello

Here

6. Kesimpulan

Dalam tutorial singkat ini kami menerapkan beberapa fungsi dasar Kirim ke Reddit - sederhana tetapi berfungsi penuh.

Di bagian selanjutnya dari studi kasus ini, kita akan mengimplementasikan fungsi Jadwal Posting untuk Nanti ke dalam aplikasi kita.

The implementasi penuh dari tutorial ini dapat ditemukan dalam proyek github - ini adalah proyek berbasis Eclipse, sehingga harus mudah untuk impor dan berjalan seperti itu.

Keamanan bawah

Saya baru saja mengumumkan kursus Learn Spring Security baru, termasuk materi lengkap yang berfokus pada tumpukan OAuth2 baru di Spring Security 5:

>> LIHAT SISA KURSUS bawah

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

>> LIHAT KURSUSnya