Legg ut en lenke til Reddit API

Sikkerhetstopp

Jeg kunngjorde nettopp det nye Learn Spring Security-kurset, inkludert hele materialet med fokus på den nye OAuth2-stakken i Spring Security 5:

>> KONTROLLER KURSET REST Topp

Jeg kunngjorde nettopp det nye Lær våren kurs, med fokus på det grunnleggende i vår 5 og vårstøvel 2:

>> KONTROLLER KURSET

1. Oversikt

I denne andre artikkelen i serien bygger vi noen enkle funksjoner for å legge ut på Reddit fra applikasjonen vår, via deres API.

2. Nødvendig sikkerhet

Først - la oss få sikkerhetsaspektet ut av veien.

For å Send inn en lenke til Reddit, må vi definere en OAuth-beskyttet ressurs med omfang av “sende inn“:

@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 ("identitet", "sende")); details.setGrantType ("autorisasjonskode"); returner detaljer; }

Merk at vi også spesifiserer omfangidentitet”Fordi vi også trenger tilgang til brukerkontoinformasjonen.

3. Trengs Captcha?

Brukere som er nye for Reddit må fylle ut en Captcha for å sende inn; det er før de passerer en viss karma-terskel i Reddit.

For disse brukerne må vi først sjekke om Captcha er nødvendig:

private String needsCaptcha () {String result = redditRestTemplate.getForObject ("//oauth.reddit.com/api/needs_captcha.json", String.class); returresultat; } privat streng getNewCaptcha () {HttpHeaders headers = nye HttpHeaders (); headers.setContentType (MediaType.APPLICATION_JSON); HttpEntity req = ny HttpEntity (overskrifter); Map param = ny HashMap (); param.put ("api_type", "json"); ResponseEntity result = redditRestTemplate.postForEntity ("//oauth.reddit.com/api/new_captcha", req, String.class, param); Streng [] split = result.getBody (). Split ("" "); retur split [split.length - 2];}

4. “Send innlegg”Skjema

Deretter la oss lage hovedskjemaet for å sende innlegg til Reddit. For å sende inn en lenke kreves følgende detaljer:

  • tittel - tittelen på artikkelen
  • url - nettadressen til artikkelen
  • subreddit - underreddit å sende lenken til

Så la oss se hvordan vi kan vise denne enkle innsendingssiden:

@RequestMapping ("/ post") offentlig String showSubmissionForm (modellmodell) kaster JsonProcessingException, IOException {String needsCaptchaResult = needsCaptcha (); if (needsCaptchaResult.equalsIgnoreCase ("true")) {String iden = getNewCaptcha (); model.addAttribute ("iden", iden); } returner "submissionForm"; }

Og selvfølgelig det grunnleggende submissionForm.html:

 Innleggsfunksjon submitPost () {var data = {}; $ ('skjema'). serializeArray (). kart (funksjon (x) {data [x.name] = x.value;}); $ .ajax ({url: "api / posts", data: JSON.stringify (data), type: 'POST', contentType: 'application / json'}). gjort (funksjon (data) {if (data.length <2) {alert (data [0]);} else {window.location.href = "submissionResponse? Msg =" + data [0] + "& url =" + data [1];}}. Mislykkes (funksjon (feil) {alarm (error.responseText);}); } 

5. Send inn en lenke til Reddit

Nå - la oss ta en titt på det siste trinnet - sende inn den faktiske lenken via Reddit API.

Vi POSTER en innsendingsforespørsel til Reddit ved hjelp av parametrene fra vår innsendingForm:

@Controller @RequestMapping (value = "/ api / posts") offentlig klasse RedditPostRestController {@Autowired privat RedditService-tjeneste; @RequestMapping (method = RequestMethod.POST) @ResponseBody public List send (@Valid @RequestBody PostDto postDto) {return service.submitPost (postDto); }}

Her er den faktiske implementeringen av metoden:

public List submitPost (PostDto postDto) {MultiValueMap param1 = constructParams (postDto); JsonNode-node = redditTemplate.submitPost (param1); returner 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 ()); hvis (postDto.isSendReplies ()) {param.add ("sendReplies", "true"); } param.add ("api_type", "json"); param.add ("snill", "lenke"); param.add ("send inn på nytt", "sant"); param.add ("deretter", "kommentarer"); retur param; }

Og den enkle analyseringslogikken, håndtering av svaret fra Reddit API:

private List parseResponse (JsonNode node) {String result = ""; JsonNode errorNode = node.get ("json"). Get ("feil"). Get (0); if (errorNode! = null) {for (JsonNode child: errorNode) null "," ") +"

"; returner Arrays.asList (resultat);} annet {if ((node.get (" json "). get (" data ")! = null) && (node.get (" json "). get (" data ") .get (" url ")! = null)) {return Arrays.asList (" Innlegg sendt vellykket ", node.get (" json "). get (" data "). get (" url "). asText ());} annet {return Arrays.asList ("Feil oppstod under parsing av svar");}}}

Alt dette fungerer med en grunnleggende DTO:

offentlig klasse PostDto {@NotNull privat strengetittel; @NotNull private String url; @NotNull privat streng subreddit; private boolske sendRespies; private String iden; private String captcha; }

Endelig - den submissionResponse.html:

Hallo

Hallo

Her

6. Konklusjon

I denne raske opplæringen implementerte vi noen grunnleggende Send til Reddit funksjonalitet - forenklet, men fullt funksjonell.

I neste del av denne casestudien implementerer vi en Planlegg innlegg for senere funksjonalitet i appen vår.

De full gjennomføring av denne opplæringen finnes i github-prosjektet - dette er et formørkelsesbasert prosjekt, så det skal være enkelt å importere og kjøre som det er.

Sikkerhetsbunn

Jeg kunngjorde nettopp det nye Learn Spring Security-kurset, inkludert hele materialet med fokus på den nye OAuth2-stakken i Spring Security 5:

>> KONTROLLER KURSET HVILLE bunnen

Jeg kunngjorde nettopp det nye Lær våren kurs, med fokus på det grunnleggende i vår 5 og vårstøvel 2:

>> KONTROLLER KURSET

$config[zx-auto] not found$config[zx-overlay] not found