Tegyen linket a Reddit API-ra

Biztonsági top

Most jelentettem be az új Learn Spring Security tanfolyamot, beleértve a Spring Security 5 új OAuth2 veremére összpontosító teljes anyagot:

>> ELLENŐRIZZE A FOLYAMATOT REST felső

Most jelentettem be az újat Tanulj tavaszt tanfolyam, amelynek középpontjában az 5. tavasz és a tavaszi bakancs 2 alapjai állnak:

>> ELLENŐRIZZE A FOLYAMATOT

1. Áttekintés

A sorozat második cikkében felépítünk néhány egyszerű funkciót, amelyet alkalmazásunkból az API-n keresztül a Redditre tehetünk közzé.

2. Szükséges biztonság

Először - menjünk el a biztonsági szempontok elől.

Azért, hogy Küldjön linket a Reddit-re, meg kell határoznunk egy OAuth-védett erőforrást a hatálya nak,-nek "Beküldés“:

@Bean public OAuth2ProtectedResourceDetails reddit () {AuthorizationCodeResourceDetails details = new AuthorizationCodeResourceDetails (); részletek.setId ("reddit"); details.setClientId (kliensID); részletek.setClientSecret (clientSecret); részletek.setAccessTokenUri (accessTokenUri); details.setUserAuthorizationUri (userAuthorizationUri); részletek.setTokenName ("oauth_token"); details.setScope (Arrays.asList ("azonosság", "beküldés")); details.setGrantType ("jogosultsági_kód"); visszatérési adatok; }

Ne feledje, hogy a hatályaidentitás”, Mert a felhasználói fiók adataira is szükségünk van.

3. Szükség van-e Captchára?

A Reddit új felhasználói ki kell töltenie egy Captchát benyújtása érdekében; még mielőtt átlépnének egy bizonyos karma küszöböt a Reddit-en belül.

Ezeknek a felhasználóknak először meg kell vizsgálnunk, hogy szükség van-e a Captchára:

privát karakterlánc needsCaptcha () {karakterlánc eredménye = redditRestTemplate.getForObject ("//oauth.reddit.com/api/needs_captcha.json", String.class); visszatérési eredmény; } privát karakterlánc getNewCaptcha () {HttpHeaders fejlécek = new HttpHeaders (); fejlécek.setContentType (MediaType.APPLICATION_JSON); HttpEntity req = új HttpEntity (fejlécek); Map param = new HashMap (); param.put ("api_type", "json"); ResponseEntity eredmény = redditRestTemplate.postForEntity ("//oauth.reddit.com/api/new_captcha", req, String.class, param); Karakterlánc [] split = result.getBody (). Split ("" "); return split [split.length - 2];}

4. A „Küldés elküldése”Forma

Ezután hozzuk létre a fő űrlapot az új bejegyzések beküldéséhez a Reddithez. Link beküldéséhez a következő részletekre van szükség:

  • cím - a cikk címe
  • url - a cikk URL-je
  • subreddit - az al-reddit, amelyhez linket kell küldeni

Tehát nézzük meg, hogyan tudjuk megjeleníteni ezt az egyszerű beküldési oldalt:

@RequestMapping ("/ post") public String showSubmissionForm (Model model) dobja a JsonProcessingException, IOException {String needsCaptchaResult = needsCaptcha (); if (needsCaptchaResult.equalsIgnoreCase ("true")) {String iden = getNewCaptcha (); model.addAttribute ("iden", iden); } return "submittedForm"; }

És persze az alap submittedForm.html:

 Feladat függvény submitPost () {var data = {}; $ ('forma'). serializeArray (). map (függvény (x) {data [x.név] = x.érték;}); $ .ajax ({url: "api / posts", adatok: JSON.stringify (data), típus: 'POST', contentType: 'application / json'}). done (function (adatok) {if (data.length <2) {figyelmeztetés (adatok [0]);} else {window.location.href = "submittedResponse? Msg =" + data [0] + "& url =" + data [1];}}). Sikertelen (függvény (hiba) {figyelmeztetés (hiba.responseText);}); } 

5. Küldjön linket a Reddit-re

Most - nézzük meg az utolsó lépést - küldje el a tényleges linket a Reddit API-n keresztül.

Küldünk egy beküldési kérelmet a Reddit-nek a mi paramétereink felhasználásával benyújtási forma:

@Controller @RequestMapping (value = "/ api / posts") public class RedditPostRestController {@Autowired private RedditService service; @RequestMapping (metódus = RequestMethod.POST) @ResponseBody nyilvános lista benyújtása (@Valid @RequestBody PostDto postDto) {return service.submitPost (postDto); }}

Itt van a módszer tényleges megvalósítása:

public List submitPost (PostDto postDto) {MultiValueMap param1 = constructParams (postDto); JsonNode csomópont = redditTemplate.submitPost (param1); return parseResponse (csomópont); } privát MultiValueMap constructParams (PostDto postDto) {MultiValueMap param = new LinkedMultiValueMap (); param.add ("cím", 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 ("kedves", "link"); param.add ("újraküldés", "igaz"); param.add ("majd", "megjegyzések"); visszatérő param; }

És az egyszerű elemzési logika, a válasz kezelése a Reddit API-ból:

privát lista parseResponse (JsonNode csomópont) {String result = ""; JsonNode errorNode = node.get ("json"). Get ("hibák"). Get (0); if (errorNode! = null) {for (JsonNode gyermek: 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 (" Sikeresen elküldve ", node.get (" json "). get (" data "). get (" url "). asText ());} else {return Arrays.asList ("Hiba történt a válasz elemzése során");}}}

Mindez működik egy alap DTO:

public class PostDto {@NotNull private String title; @NotNull privát karakterlánc URL; @NotNull private String subreddit; privát logikai sendReplies; privát húr iden; privát String captcha; }

Végül - a submittedResponse.html:

Helló

Helló

Itt

6. Következtetés

Ebben a gyors bemutatóban megvalósítottunk néhány alapvető elemet Küldje el a Reddit-nek funkcionalitás - egyszerű, de teljesen működőképes.

Az esettanulmány következő részében a Üzenet ütemezése későbbre funkcionalitás az alkalmazásunkba.

A teljes végrehajtása ennek az oktatóanyagnak a github projektje található meg - ez egy Eclipse alapú projekt, ezért könnyen importálhatónak és futtathatónak kell lennie.

Biztonsági alsó

Most jelentettem be az új Learn Spring Security tanfolyamot, beleértve a Spring Security 5 új OAuth2 veremére összpontosító teljes anyagot:

>> ELLENŐRIZZE A FOLYAMATOT REST alsó

Most jelentettem be az újat Tanulj tavaszt tanfolyam, amelynek középpontjában az 5. tavasz és a tavaszi bakancs 2 alapjai állnak:

>> ELLENŐRIZZE A FOLYAMATOT