Tegyen linket a Reddit API-ra
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 FOLYAMATOT1. Á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álya “identitá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ó