Jump to content

Search the Community

Showing results for tags 'rest'.



More search options

  • Search By Tags

    Type tags separated by commas.
  • Search By Author

Content Type


Forums

  • Q&A Desenvolvimento
    • Perguntas e respostas rápidas
  • Desenvolvimento e Banco de Dados
    • HTML e CSS
    • Java
    • Javascript
    • .NET
    • PHP
    • Python
    • Ruby
    • Mobile
    • Ambientes de Desenvolvimento
    • Arquitetura e Métodos Ágeis
    • Banco de Dados
    • DevOps
    • Desenvolvimento de Games
    • E-Commerce e Pagamentos Online
    • SEO e Otimizações
    • WordPress
    • Algoritmos & Outras Tecnologias
  • Design e Produto
    • Fotografia
    • Photoshop
    • Design de interfaces e UX
    • Edição/Produção de Vídeos
    • Marketing Online
    • Desenho, Ilustração e 3D
  • Entretenimento e uso pessoal
    • Geral
    • Segurança & Malwares
    • Gadgets e wearable
    • Softwares e Apps
    • Entretenimento

Find results in...

Find results that contain...


Date Created

  • Start

    End


Last Updated

  • Start

    End


Filter by number of...

Joined

  • Start

    End


Group


Google+


Hangouts


Skype


Twitter


deviantART


Github


Flickr


LinkedIn


Pinterest


Facebook


Site Pessoal


Localização


Interesses

Found 21 results

  1. boa noite amigos, estou iniciando com a parte de webserver e estou com dificuldade para pegar os parametros que são passados por uma catraca, ja consegui fazer toda a configuração da mesma e o webserver que fiz consegue indentificar a requisição dela, meu problema esta para pegar a informação do id_user que vem no json quando coloco a digital na catraca o meu webserver identifica o evento vindo da mesma na porta 8080: POST /new_user_identified.fcgi?session=?& HTTP/1.1 ate ae tudo ok,+ eu preciso e da informação que vem junto com o POST da ctraca no meu webserver agora segue oque o fabricante me passou: O Fluxo de comunicação entre o servidor (web server que escutará as requisições http que o equipamento para enviará, o verbo http é o POST) que você vai desenvolver e o equipamento é o seguinte: Primeiro um pouco de teoria para você entender o fluxo do endpoint que você precisará implementar: new_user_identified.fcgi (https://www.controlid.com.br/suporte/api_idaccess_latest.html#50_events) Usuário identificado CLIENT -> SERVER POST /new_user_identified.fcgi?session=gJgOHkblq69Vc3WLOOdUMvrf& HTTP/1.1 Host: 192.168.2.121 Accept: */* Content-Type: application/x-www-form-urlencoded Connection: Keep-Alive Content-Length: 105 event=8&device_id=468507&identifier_id=1651076864&portal_id=1&user_id=1&user_name=Danilo&user_has_image=0 preciso pegar a informação do user_id acima e não sei como ja que oque chega na uri e somente:POST /new_user_identified.fcgi?session=?& HTTP/1.1
  2. marcio pereira batista

    configurar web server para escutar as requisições http

    boa noite meus amigos, meu problema e o seguinte : preciso ler a informação que vem de uma catraca controlid, consigo fazer toda a comunicação com a catraca via restjson usando idttp indy, logo, libero acesso e etc, o problema esta quando preciso receber oque vem da catraca sem que eu solicite, ex : o usuario coloca a digital no equipamento e eu preciso que o webserver receba o json que vem da catraca via http, fiz todos os passos abaixo indicado pelo o suporte do fabricante e tudo correu bem e os comandos foram executados sem erro algum, porem quando coloca a digital na catraca o webserver que fiz usando idttpserver nao recebe nada no ip e porta expecifica vindo da catraca e se tento enviar algo pela rede no ip e porta do webserver ele responde perfeitamente, por favor se alguem puder me ajudar a terminar de configurar o webserver, acho q não falta muito e o cliente ja perdeu a paciencia..., segue oque foi feito de acordo com o fabricante : O fluxo é o seguinte: Realizar o login no equipamento para obter uma sessão; lJSO := SO('{"login": "admin", "password": "admin"}'); lResponse := IdHTTP1.Post('http://192.168.001.171/login.fcgi', lRequest); Criar um novo device que representará o servidor do equipamento. Referências: aqui e aqui (procurar 'devices'). Note que o campo 'public_key' deve ser qualquer texto em base64. Em Linux, pode-se gerar facilmente um através do comando: echo -n chave_secreta | base64 lJSO := SO('{ object: "devices", values: [{id: 3333, name: "clube_server", ip: "192.168.1.100:8080", public_key:"Y2hhdmVfc2VjcmV0YQ=="}] })}'); lResponse := IdHTTP1.Post('http://192.168.001.171/create_objects.fcgi?session='+trim(edit1.text),lRequest); Modificar a configuração 'server_id' do objeto 'online_client' para o id do device cadastrado na etapa anterior. Exemplo : lJSO := SO('{ online_client: {server_id: "3333" } }'); lResponse := IdHTTP1.Post('http://192.168.001.171/set_configuration.fcgi?session='+trim(edit1.text),lRequest); Modificar a configuração 'online' do objeto 'general' para 1 lJSO := SO('{ general: {online: "1"} }'); lResponse := IdHTTP1.Post('http://192.168.001.171/set_configuration.fcgi?session='+trim(edit1.text),lRequest); Habilita a identificação Local: lJSO := SO('{ general: {"local_identification": "1"} })}'); lResponse := IdHTTP1.Post('http://192.168.001.171/set_configuration.fcgi?session='+trim(edit1.text),lRequest); todos os campos são executados sem problema, segue mais explicações do fabricante : O Fluxo de comunicação entre o servidor (web server que escutará as requisições http que o equipamento para enviará, o verbo http é o POST) que você vai desenvolver e o equipamento é o seguinte: Primeiro um pouco de teoria para você entender o fluxo do endpoint que você precisará implementar: new_user_identified.fcgi (https://www.controlid.com.br/suporte/api_idaccess_latest.html#50_events) Usuário identificado CLIENT -> SERVER POST /new_user_identified.fcgi?session=gJgOHkblq69Vc3WLOOdUMvrf& HTTP/1.1 Host: 192.168.2.121 Accept: */* Content-Type: application/x-www-form-urlencoded Connection: Keep-Alive Content-Length: 105 event=8&device_id=468507&identifier_id=1651076864&portal_id=1&user_id=1&user_name=Danilo&user_has_image=0 SERVER -> CLIENT HTTP/1.1 200 OK Content-Type: application/json; charset=utf-8 Transfer-Encoding: chunked Date: Thu, 18 Feb 2016 16:20:45 GMT Server: lighttpd/1.4.35 {"result":{"event":6,"user_id":1,"user_name":"João","user_image":false,"portal_id":5,"actions":[]}} Usuário não identificado CLIENT -> SERVER POST /new_user_identified.fcgi?session=gJgOHkblq69Vc3WLOOdUMvrf& HTTP/1.1 Host: 192.168.2.121 Accept: */* Content-Type: application/x-www-form-urlencoded Connection: Keep-Alive Content-Length: 99 event=3&device_id=468507&identifier_id=1651076864&portal_id=0&user_id=0&user_name=&user_has_image=0 SERVER -> CLIENT HTTP/1.1 200 OK Content-Type: application/json; charset=utf-8 Transfer-Encoding: chunked Date: Thu, 18 Feb 2016 16:22:57 GMT Server: lighttpd/1.4.35 {"result":{"event":3}} no webser que criei configurei da seguinte forma : IdHTTPServer1.Active := false; IdHTTPServer1.defaultport:=8080; IdHTTPServer1.Active := True; no oncommandget coloquei o seguinte : if (ARequestInfo.URI = '/api/notification/dao') or (ARequestInfo.URI = '/api/notification/dao') then begin showmessage('eu to aqui'); end else begin showmessage('chequei aqui 2'); end; não coloquei nenhuma rotina de envio do retorno ainda pois estou tentando ver se esta chegando algo no ip/porta vindo da catraca e nao esta e se tento pela rede chega sem problema. desde ja agradeço a quem puder me ajudar
  3. boa tarde amigos, estou utilizando o rest debugguer e quando tento passar o json abaixo pelo custom body retorna erro { "error":"Invalid member 'type' (string expected, got undefined)", "code":1 } sendo que estou passando de acordo com o manual da catraca (e uma catraca eletronica controlid) e sempre retorna o erro independente de estar no rest debugger ou no postman, estou iniciando nessa parte de rest/json e tenho visto varios videos + ainda estou apanhando um pouco... desde ja agradeço a quem puder me ajudar. ex do manual : $.ajax({ url: "/execute_actions.fcgi?session=" + session, type: 'POST', contentType: 'application/json', data: JSON.stringify({ actions: [ { action: "catra", parameters: "allow=clockwise" } ] }) }); estou passando os dados do contenttype pelo head e esta ok, o problema esta mesmo quando tento passar oque esta no campo json.stringfy estou passando no campo custom body da seguinte forma : ({ actions: [ { action: "catra", parameters: "allow=clockwise" } ] }) e retorna o erro acima quando executo 1 comando + simples tipo pegar as informações da catraca ou setar o beepvai sem problema : campo custom body ok : { general: ["beep_enabled", "relay1_timeout"] }
  4. Eu criei duas classes customizadas de acordo com o que foi orientado por meu professor para fazer a requisição no servidor, mas estou recebendo um retorno 400 e não consigo descobrir a razão. Pesquisando, vi que pode ser algo relacionado ao cabeçalho, mas não sei como enviá-lo na minha requisição JSon customizada. Este é o código do meu do meu código customizado para requisição de JsonObject: package com.example.sandrini.pokeagenda; import com.android.volley.AuthFailureError; import com.android.volley.Response; import com.android.volley.RetryPolicy; import com.android.volley.toolbox.JsonObjectRequest; import org.json.JSONObject; import java.util.HashMap; import java.util.Map; public class CustomJSONObjectRequest extends JsonObjectRequest { public CustomJSONObjectRequest(int method, String url, JSONObject jsonRequest, Response.Listener<JSONObject> listener, Response.ErrorListener errorListener) { super(method, url, jsonRequest, listener, errorListener); } @Override public Map<String, String> getHeaders() throws AuthFailureError { HashMap<String, String> headers = new HashMap<>(); headers.put("Content-Type", "application/json; charset=utf-8"); return headers; } @Override public RetryPolicy getRetryPolicy() { return super.getRetryPolicy(); } } Este é o código da minha Request Queue: package com.example.sandrini.pokeagenda; import android.content.Context; import com.android.volley.Cache; import com.android.volley.Network; import com.android.volley.RequestQueue; import com.android.volley.toolbox.BasicNetwork; import com.android.volley.toolbox.DiskBasedCache; import com.android.volley.toolbox.HurlStack; public class CustomVolleyRequestQueue { private static CustomVolleyRequestQueue mInstance; private static Context mCtx; private RequestQueue mRequestQueue; private CustomVolleyRequestQueue(Context context) { //recebe o contexto da aplicação //Assim a fila dura o ciclo de vida do app mCtx = context; mRequestQueue = getRequestQueue(); } public static synchronized CustomVolleyRequestQueue getmInstance(Context context) { if (mInstance == null) { mInstance = new CustomVolleyRequestQueue(context); } //retorna uma instância da fila return mInstance; } public RequestQueue getRequestQueue() { if (mRequestQueue == null) { //Cache 10MB Cache cache = new DiskBasedCache(mCtx.getCacheDir(), 10 *1024); Network network = new BasicNetwork(new HurlStack()); mRequestQueue = new RequestQueue(cache, network); mRequestQueue.start(); } return mRequestQueue; } } Este é o código da Activity onde estou tentando fazer a requisição: package com.example.sandrini.pokeagenda; import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.ProgressBar; import android.widget.Toast; import com.android.volley.Request; import com.android.volley.RequestQueue; import com.android.volley.Response; import com.android.volley.VolleyError; import com.android.volley.toolbox.JsonRequest; import com.google.gson.Gson; import org.json.JSONException; import org.json.JSONObject; import java.util.EmptyStackException; public class CreateUserActivity extends AppCompatActivity implements Response.Listener, Response.ErrorListener { private static final String REQUEST_TAG = "CreateUser"; Trainer trainer = new Trainer(); EditText loginCreateInput, emailCreateInput, pwdCreateInput; Button createUserButton; private RequestQueue mQueue; JsonRequest jsonRequest; ProgressBar progressBarCreateUser; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_create_user); loginCreateInput = (EditText) findViewById(R.id.login_create_input); emailCreateInput = (EditText) findViewById(R.id.email_create_input); pwdCreateInput = (EditText) findViewById(R.id.pwd_create_input); createUserButton = (Button) findViewById(R.id.create_user_button); progressBarCreateUser = (ProgressBar) findViewById(R.id.progress_bar_create_user); progressBarCreateUser.setVisibility(View.INVISIBLE); } @Override protected void onStart() { super.onStart(); createUserButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (loginCreateInput.getText().toString().equals("")) { Toast.makeText(getApplicationContext(), "Please, set a login", Toast.LENGTH_SHORT).show(); } else if (emailCreateInput.getText().toString().equals("")) { Toast.makeText(getApplicationContext(), "Please, set an email", Toast.LENGTH_SHORT).show(); } else if (pwdCreateInput.getText().toString().equals("")) { Toast.makeText(getApplicationContext(), "Please, set a password", Toast.LENGTH_SHORT).show(); } else { String url = "http://192.168.25.6:8081/PokedexWS/webresources/pokews/poke/insert/trainer"; /*trainer.setUsername(loginCreateInput.getText().toString()); trainer.setEmail(emailCreateInput.getText().toString()); trainer.setPassword(pwdCreateInput.getText().toString());*/ trainer.setUsername("gato"); trainer.setEmail("gato"); trainer.setPassword("gato"); try { JSONObject jsonObject; Gson gson = new Gson(); String trainerToGson = gson.toJson(trainer); jsonObject = new JSONObject(trainerToGson); //String trainerToGson = "{\"username\":"+ "\"" + trainer.getUsername()+ "\"" + "," + //"\"email\":"+ "\"" + trainer.getEmail() + "\"" + "," + //"\"username\":"+ "\"" + trainer.getPassword()+ "\"" + "}"; //createUserButton.setText(trainerToGson); mQueue = CustomVolleyRequestQueue.getmInstance(CreateUserActivity.this.getApplicationContext()).getRequestQueue(); jsonRequest = new CustomJSONObjectRequest(Request.Method.POST, url, jsonObject, CreateUserActivity.this, CreateUserActivity.this); jsonRequest.getHeaders(); mQueue.add(jsonRequest); progressBarCreateUser.setVisibility(View.VISIBLE); } catch (Exception e) { e.printStackTrace(); } } } }); } @Override protected void onStop() { super.onStop(); if(mQueue != null) { mQueue.cancelAll(REQUEST_TAG); } } @Override public void onErrorResponse(VolleyError error) { progressBarCreateUser.setVisibility(View.INVISIBLE); Toast.makeText(getApplicationContext(), "Register failed", Toast.LENGTH_LONG).show(); Log.e("erro400", error.getMessage().toString()); Log.e("erro400", error.getCause().toString()); Log.e("erro400", error.getStackTrace().toString()); } @Override public void onResponse(Object trainerObject) { progressBarCreateUser.setVisibility(View.INVISIBLE); Toast.makeText(getApplicationContext(), "Registered successfully", Toast.LENGTH_LONG).show(); Intent intent = new Intent(CreateUserActivity.this, WelcomeTrainerActivity.class); startActivity(intent); finish(); } } Este é o meu Web Service: package ws; import com.google.gson.Gson; import dao.PokemonDAO; import dao.TrainerDAO; import java.util.ArrayList; import javax.ws.rs.core.Context; import javax.ws.rs.core.UriInfo; import javax.ws.rs.Produces; import javax.ws.rs.Consumes; import javax.ws.rs.DELETE; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.PUT; import javax.ws.rs.PathParam; import javax.ws.rs.core.MediaType; import model.Pokemon; import model.Trainer; /** * REST Web Service * * @author sandrini */ @Path("pokews") public class PokedexWebService { PokemonDAO pokemonDAO = new PokemonDAO(); TrainerDAO trainerDAO = new TrainerDAO(); @Context private UriInfo context; /** * Creates a new instance of PokedexWebService */ public PokedexWebService() { } /** * Retrieves representation of an instance of teste.GenericResource * @return an instance of java.lang.String */ @GET @Produces(MediaType.APPLICATION_XML) public String getXml() { //TODO return proper representation object throw new UnsupportedOperationException(); } @GET @Produces(MediaType.APPLICATION_JSON) @Path("poke/list") public ArrayList<Pokemon> pokeList() { return pokemonDAO.listPokemon(); } @GET @Produces(MediaType.APPLICATION_JSON) @Path("poke/fetch/{id}") public Pokemon pokeFetch(@PathParam("id") int id) { return pokemonDAO.fetchPokemon(id); } @GET @Produces(MediaType.APPLICATION_JSON) @Path("poke/isFavorite/{id}") public String pokeIsFavorite(@PathParam("id") int id) { return pokemonDAO.isFavorite(id); } @GET @Produces(MediaType.APPLICATION_JSON) @Path("poke/login/{login}/{pwd}") public Trainer pokelogin(@PathParam("login") String login, @PathParam("pwd") String pwd) { return trainerDAO.authUser(login, pwd); } @DELETE @Path("poke/delete/{id}") public boolean delete(@PathParam("id")int id) { return pokemonDAO.deletePokemon(id); } @POST @Consumes(MediaType.APPLICATION_JSON) @Path("poke/insert") public boolean pokeInsert(String content) { Gson gson = new Gson(); Pokemon pokemon = (Pokemon) gson.fromJson(content, Pokemon.class); return pokemonDAO.insertPokemon(pokemon); } @POST @Consumes(MediaType.APPLICATION_JSON) @Path("poke/insert/trainer") public boolean trainerInsert(String content) { Gson gson = new Gson(); Trainer trainer = (Trainer) gson.fromJson(content, Trainer.class); return trainerDAO.insertTrainer(trainer); } @PUT @Consumes(MediaType.APPLICATION_JSON) @Path("poke/update") public boolean pokeUpdate(String content) { Gson gson = new Gson(); Pokemon pokemon = (Pokemon) gson.fromJson(content, Pokemon.class); return pokemonDAO.updatePokemon(pokemon); } /** * PUT method for updating or creating an instance of GenericResource * @param content representation for the resource */ @PUT @Consumes(MediaType.APPLICATION_XML) public void putXml(String content) { } } Eu peguei um código java pra testar o WS e tá funcionando, só não estou conseguindo requisitar pelo android: package acessorest; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.InputStreamReader; import java.lang.ProcessBuilder.Redirect.Type; import java.net.HttpURLConnection; import java.net.URL; import javax.net.ssl.HttpsURLConnection; /** * * @author marcelosiedler */ public class HttpExemplo { private final String USER_AGENT = "Mozilla/5.0"; public static void main(String[] args) throws Exception { HttpExemplo http = new HttpExemplo(); Gson gson = new Gson(); Pokemon pokemon = new Pokemon(); java.lang.reflect.Type pokemonType = new TypeToken<Pokemon>() { }.getType(); String chamadaWS = "http://192.168.25.6:8081/PokedexWS/webresources/pokews/poke/insert/trainer"; Trainer trainer = new Trainer(); trainer.setUsername("quadrado"); trainer.setEmail("quadrado"); trainer.setPassword("quadrado"); //System.out.println(gson.toJson(trainer)); String trainerToGson = gson.toJson(trainer); /*String trainerToGson = "{\"username\":"+ "\"" + trainer.getUsername()+ "\"" + "," + "\"email\":"+ "\"" + trainer.getEmail() + "\"" + "," + "\"password\":"+ "\"" + trainer.getPassword()+ "\"" + "}";*/ //System.out.println(trainerToGson); //String retorn = http.sendGet(chamadaWS, "DELETE"); //pokemon = gson.fromJson(json, pokemonType); //System.out.println(retorn); http.sendPost(chamadaWS,trainerToGson, "POST"); } // HTTP GET request private String sendGet(String url, String method) throws Exception { URL obj = new URL(url); HttpURLConnection con = (HttpURLConnection) obj.openConnection(); // optional default is GET con.setRequestMethod(method); //add request header con.setRequestProperty("User-Agent", USER_AGENT); int responseCode = con.getResponseCode(); System.out.println("Response Code : " + responseCode); BufferedReader in = new BufferedReader( new InputStreamReader(con.getInputStream())); String inputLine; StringBuffer response = new StringBuffer(); while ((inputLine = in.readLine()) != null) { response.append(inputLine); } in.close(); //print result System.out.println(response.toString()); return response.toString(); } // HTTP POST request private void sendPost(String url, String parameters, String method) throws Exception { URL obj = new URL(url); HttpURLConnection con = (HttpURLConnection) obj.openConnection(); //add reuqest header con.setRequestMethod(method); con.setRequestProperty("Content-Type", "application/json"); con.setRequestProperty("User-Agent", USER_AGENT); con.setRequestProperty("Accept-Language", "en-US,en;q=0.5"); String urlParameters = parameters; // Send post request con.setDoOutput(true); DataOutputStream wr = new DataOutputStream(con.getOutputStream()); wr.writeBytes(urlParameters); wr.flush(); wr.close(); int responseCode = con.getResponseCode(); System.out.println("\nSending 'POST' request to URL : " + url); System.out.println("Post parameters : " + urlParameters); System.out.println("Response Code : " + responseCode); BufferedReader in = new BufferedReader( new InputStreamReader(con.getInputStream())); String inputLine; StringBuffer response = new StringBuffer(); while ((inputLine = in.readLine()) != null) { response.append(inputLine); } in.close(); //print result System.out.println(response.toString()); } } android post volley singleton
  5. Raffael Dornelles Jardim

    Chamada REST

    Boa tarde! Estou tentando fazer umas chamadas REST conforme o código abaixo, mas está sempre retornando um 400! Alguém consegue ajudar? httpClient = new DefaultHttpClient(); httpClient.getCredentialsProvider().setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(proxy_usuario, proxy_senha)); httpClient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy); parametersBody.add(new BasicNameValuePair("grant_type", GRANT_TYPE)); parametersBody.add(new BasicNameValuePair("User", USER));)); parametersBody.add(new BasicNameValuePair("Key", KEY));)); post = new HttpPost(SERVER + AUTHENTICATION); post.addHeader("Content-Type", "application/x-www-form-urlencoded"); post.setEntity(new UrlEncodedFormEntity(parametersBody)); response = httpClient.execute(proxy, post);
  6. Neillon Cesar

    Erro em autenticação com JWT e Spring boot

    Boa tarde estou com um problema na liberação de rotas para minha aplicação feita com Spring boot. O problema é que a rota principal "/HOME" pede o token JWT para acessa-la, porem ela está configurada para permitir qualquer tipo de request de qualquer usuário, com ou sem token. Alguém já teve esse tipo de problema ?Estava seguindo este tutorial: http://andreybleme.com/2017-04-01/autenticacao-com-jwt-no-spring-boot/Arquivo de boot: package br.com.teste; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RestController; @SpringBootApplication @RestController @EnableAutoConfiguration public class Boot { public static void main(String[] args) { SpringApplication.run(Boot.class, args); } @GetMapping("/home") public String home() { return "home"; } } Arquivo de configuração: package br.com.security; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.HttpMethod; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; @Configuration @EnableWebSecurity public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity httpSecurity) throws Exception { httpSecurity.csrf().disable().authorizeRequests() .antMatchers("/home").permitAll() .antMatchers(HttpMethod.POST, "/login").permitAll() .anyRequest().authenticated() .and() // filtra requisições de login .addFilterBefore(new JWTLoginFilter("/login", authenticationManager()), UsernamePasswordAuthenticationFilter.class) // filtra outras requisições para verificar a presença do JWT no header .addFilterBefore(new JWTAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class); } @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { // cria uma conta default auth.inMemoryAuthentication() .withUser("admin") .password("password") .roles("ADMIN"); } } Arquivo TokenAuthenticationService: import javax.servlet.http.HttpServletResponse; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.Authentication; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; public class TokenAuthenticationService { // EXPIRATION_TIME = 10 dias static final long EXPIRATION_TIME = 860_000_000; static final String SECRET = "9FFE05B4553F32356D4D70F128FF0BB8C19F64275C45153EF26ED127E264A2AA"; static final String TOKEN_PREFIX = "Bearer"; static final String HEADER_STRING = "Authorization"; static void addAuthentication(HttpServletResponse response, String username) { String JWT = Jwts.builder() .setSubject(username) .setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME)) .signWith(SignatureAlgorithm.HS512, SECRET) .compact(); response.addHeader(HEADER_STRING, TOKEN_PREFIX + " " + JWT); } static Authentication getAuthentication(HttpServletRequest request) { String token = request.getHeader(HEADER_STRING); if (token != null) { // faz parse do token String user = Jwts.parser() .setSigningKey(SECRET) .parseClaimsJws(token.replace(TOKEN_PREFIX, "")) .getBody() .getSubject(); if (user != null) { return new UsernamePasswordAuthenticationToken(user, null, Collections.emptyList()); } } return null; } } Arquivo JWTLoginFilter: package br.com.security; import java.io.IOException; import java.util.Collections; import javax.servlet.FilterChain; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import br.com.models.AccountCredentials; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.Authentication; import org.springframework.security.core.AuthenticationException; import org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter; import org.springframework.security.web.util.matcher.AntPathRequestMatcher; import com.fasterxml.jackson.databind.ObjectMapper; public class JWTLoginFilter extends AbstractAuthenticationProcessingFilter { protected JWTLoginFilter(String url, AuthenticationManager authManager) { super(new AntPathRequestMatcher(url)); setAuthenticationManager(authManager); } @Override public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException, IOException { AccountCredentials credentials = new ObjectMapper() .readValue(request.getInputStream(), AccountCredentials.class); return getAuthenticationManager().authenticate( new UsernamePasswordAuthenticationToken( credentials.getUsername(), credentials.getPassword(), Collections.emptyList() ) ); } @Override protected void successfulAuthentication( HttpServletRequest request, HttpServletResponse response, FilterChain filterChain, Authentication auth) { TokenAuthenticationService.addAuthentication(response, auth.getName()); } } Arquivo JWTAuthenticationFilter: package br.com.security; import java.io.IOException; import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.web.filter.GenericFilterBean; public class JWTAuthenticationFilter extends GenericFilterBean { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException { Authentication authentication = TokenAuthenticationService .getAuthentication((HttpServletRequest) request); SecurityContextHolder.getContext().setAuthentication(authentication); filterChain.doFilter(request, response); } }
  7. assuncao.jr

    Desativar endpoint na API do WP

    Olá! Há alguma maneira de desativar um endpoint de um método específico (tipo GET) na API Rest do wordpress?
  8. gust.php

    API Django Rest Framework

    Senhores, boa noite. Tenho assistido vários vídeos de como criar uma API Rest usando Django Rest Framework e não parece ser difícil. Em todos os vídeos que assisto os exemplos são criados inserindo e mostrando dados cadastrados em um DB criado com o comando : python manager.py migrate Esse comando acima me parece ser utilizado para criar um modelo de admin do Django .... Certo ? Quero criar uma API para ler dados de uma tabela que já esta criada em um sistema meu em produção. Como registrar o meu banco de dados? como fazer ele ler a tabela que eu quero? .... Não quero nem que exista esse DB admin ... Alguém recomenda algum video do tipo: Criando um tabelinha Cliente nome email Agora no Django rest vamos criar as models, views e serializers para ler essa informações e disponibilizar .... Agradeço ....
  9. Felipe da Silveira

    Web Service

    Bom dia, estou cursando o ultimo período do curso ciências da computação e meu trabalho de conclusão de curso é sobre Web Service. Abaixo segue o link para o questionário que eu criei, seria de grade ajuda a colaboração. Desde já agradeço. https://docs.google.com/forms/d/e/1FAIpQLSd_HBKpLTuvM4qjHiTH6PP3OAKmgddKGg0fRBBU3i51BUQsWg/viewform?c=0&w=1
  10. claudiojuniorfabiao

    Arquitetura para API REST

    Olá, pessoal! Estou planejando criar uma API RESTful, que retorna conteúdo somente em JSON e executa algumas tarefas de CRUD em entidades do meu domínio, para ser consumida por um cliente HTML usando AngularJS, mas estou com algumas dúvidas. Antes, quando estava recuperando todo o HTML do servidor, minha aplicação estava estruturada segundo à arquitetura MVC, todavia, agora, não sei se é proveitoso usar essa arquitetura na minha API. Se alguém tiver uma opinião de porquê usar ou não MVC, ou outra arquitetura e/ou exemplos de implementação, será de grande ajuda. Desde já obrigado.
  11. claudiojuniorfabiao

    Ações especiais em API Restful

    Fala, galera! Qual tipo de requisição HTTP (HTTP Verbs) eu deveria usar para solicitar a emissão de uma nota fiscal para a API Rest no meu aplicativo PHP (arquitetura MVC) rodando no servidor? Digo, é fácil criar uma aplicação Restful, quando se tem apenas tarefas de CRUD básico, mas quando se deseja executar tarefas diferentes das tradicionais? Estou aprendendo agora sobre padrões, arquitetura de software e, sobretudo, APIs Rest, mas conheço bem o PHP e OOP, quer dizer, sou fluente na linguagem. Agradeço desde já a ajuda de todos! ;)
  12. Quando executar um exemplo de API Rest em Java, tomei um 404, alguém sabe o por que e como corrigir ?
  13. Olá, estou consumindo um servidor REST que retorna em JSON. Na solicitação retornada há um campo de imagem, onde ela foi salva como blob. Por favor poderiam me ajudar a exibir a imagem na tela?! Não estou conseguindo... Segue em anexo o arquivo json como ela me retornando na url. Desde de já, obrigada!! teste.json
  14. Diegus Miestro

    Website REST - uma opção?

    Olá pessoas, Estava querendo saber se um website usando o conceito de REST em todo ele é algo que funciona ou compromete o SEO?
  15. Cesar Augusto Graeff

    API REST com PHP

    Boa Tarde, Estou fazendo um painel de controle utilizando AngularJS para isto estou fazendo uma API REST com PHP e banco de dados MySQL Escolhi utilizar o framework Slim para desenvolver a API, porém estou com dificuldade em fazer um sistema de busca por parâmetros via query como mostrado abaixo: exemplo.com.br/api/v1/clientes?id=1&nome=teste A maior dificuldade seria fazer a passagem de parametros para condições com > , < , <= , >=, IN(), LIKE %% e etc. Alguém já fez um sistema de busca por query parecido com este ou conhece algum framework que faça isto?
  16. Olá amigos.. tenho uma rotina onde recebo os dados de um http post, jogo eles num array e faço update no banco como no exemplo a seguir: //filtro o input $Arr_ContatoUpdate = filter_input_array(INPUT_POST, FILTER_DEFAULT); //defino data/hora alteracao $Arr_ContatoUpdate['dh_alteracao'] = date("Y-m-d H:i:s"); //chamo funcao que atualiza tabela de contato, enviando o array com os campos AtualizarTabela('contato', $Arr_ContatoUpdate, "WHERE codigo = '" . $ContatoUpdate['Codigo'] . "'"); Acontece que, no formulário, se eu limpar algum campo e fazer o submit do form, esse campo que eu limpei (ou seja, value = '') não é enviado para o POST e isso faz com que o campo não seja incluso no meu update e consequentemente este mesmo campo não é atualizado. O campo só é atualizado se o formfield tiver algum valor.. Reparei que ao fazer POST, os campos vazios não são enviados.. Existe alguma solução para isso ou alguma maneira de contornar a situação, sem que eu tenha que tratar campo a campo do formulário? Alguém poderia dar uma dica? Obrigado, Renato
  17. Boa noite amigos Alguém conhece algum endereço na internet que disponibiliza serviço Rest´s para serem consumidos de forma experimental e para testes ? Att
  18. Léo95

    Como usar REST API com PHP

    Link: http://www.4shared.com/developer/docs/ Gostaria de saber como utilizar essa API em PHP, tipo não consigo se autenticar! Isso usa alguma class pra usar o REST API??
  19. Vitor Brangioni

    Como programar PHP Rest usando JSON

    Boa noite amigos. Preciso aprender PHP Rest usando JSON até amanhã. Alguém sabe de algum tutorial bom que ensina TUDO sobre PHP Rest usando JSON? Ou teria como me ensinar? Estou procurando, porém o que acho sobre isso é muito vago. Será que alguém poderia me ajudar, tenho uma prova terça para entrar em uma empresa. Obrigado a todos!!
  20. Clayder

    Como criar uma API "privada"

    Olá pessoal, recentemente eu comecei a estudar desenvolvimento de API, arquitetura rest essas coisas. Eu fiquei com dúvida em relação a segurança Vamos supor que você desenvolva uma API e você quer que apenas as suas aplicações (site e app) acessem as informações da sua API. Como que eu faço para a minha API reconhecer as minhas aplicações ? E como que eu posso restringir o acesso via url ? Obrigado.
  21. wneo

    Usar Rest com PHP

    Boa noite! Pessoal, estou precisando usar Rest com PHP. Estou tentando fazer assim: Uma classe de abstração: Abstrata.class.php <?php abstract class API { public function processAPI() { if (method_exists($this, $this->endpoint)) { return $this->_response($this->{$this->endpoint}($this->args)); } return $this->_response("No Endpoint: $this->endpoint", 404); } private function _response($data, $status = 200) { header("HTTP/1.1 " . $status . " " . $this->_requestStatus($status)); return json_encode($data); } private function _cleanInputs($data) { $clean_input = Array(); if (is_array($data)) { foreach ($data as $k => $v) { $clean_input[$k] = $this->_cleanInputs($v); } } else { $clean_input = trim(strip_tags($data)); } return $clean_input; } private function _requestStatus($code) { $status = array( 200 => 'OK', 404 => 'Not Found', 405 => 'Method Not Allowed', 500 => 'Internal Server Error', ); return ($status[$code])?$status[$code]:$status[500]; } /** * Property: method * The HTTP method this request was made in, either GET, POST, PUT or DELETE */ protected $method = ''; /** * Property: endpoint * The Model requested in the URI. eg: /files */ protected $endpoint = ''; /** * Property: verb * An optional additional descriptor about the endpoint, used for things that can * not be handled by the basic methods. eg: /files/process */ protected $verb = ''; /** * Property: args * Any additional URI components after the endpoint and verb have been removed, in our * case, an integer ID for the resource. eg: /<endpoint>/<verb>/<arg0>/<arg1> * or /<endpoint>/<arg0> */ protected $args = Array(); /** * Property: file * Stores the input of the PUT request */ protected $file = Null; /** * Constructor: __construct * Allow for CORS, assemble and pre-process the data */ public function __construct($request) { header("Access-Control-Allow-Orgin: *"); header("Access-Control-Allow-Methods: *"); header("Content-Type: application/json"); $this->args = explode('/', rtrim($request, '/')); $this->endpoint = array_shift($this->args); if (array_key_exists(0, $this->args) && !is_numeric($this->args[0])) { $this->verb = array_shift($this->args); } $this->method = $_SERVER['REQUEST_METHOD']; if ($this->method == 'POST' && array_key_exists('HTTP_X_HTTP_METHOD', $_SERVER)) { if ($_SERVER['HTTP_X_HTTP_METHOD'] == 'DELETE') { $this->method = 'DELETE'; } else if ($_SERVER['HTTP_X_HTTP_METHOD'] == 'PUT') { $this->method = 'PUT'; } else { throw new Exception("Unexpected Header"); } } switch($this->method) { case 'DELETE': case 'POST': $this->request = $this->_cleanInputs($_POST); break; case 'GET': $this->request = $this->_cleanInputs($_GET); break; case 'PUT': $this->request = $this->_cleanInputs($_GET); $this->file = file_get_contents("php://input"); break; default: $this->_response('Invalid Method', 405); break; } } } ?> Uma classe para receber a abstrata: <?php require_once 'Abstrata.class.php'; class MyAPI extends API { protected $User; public function __construct($request, $origin) { parent::__construct($request); // Abstracted out for example $APIKey = new Models\APIKey(); $User = new Models\User(); if (!array_key_exists('apiKey', $this->request)) { throw new Exception('No API Key provided'); } else if (!$APIKey->verifyKey($this->request['apiKey'], $origin)) { throw new Exception('Invalid API Key'); } else if (array_key_exists('token', $this->request) && !$User->get('token', $this->request['token'])) { throw new Exception('Invalid User Token'); } $this->User = $User; } /** * Example of an Endpoint */ protected function example() { if ($this->method == 'GET') { return "Your name is " . $this->User->name; } else { return "Only accepts GET requests"; } } } ?> E outra para exibir o resultado: <?php require "Concreta.class.php"; // Requests from the same server don't have a HTTP_ORIGIN header if (!array_key_exists('HTTP_ORIGIN', $_SERVER)) { $_SERVER['HTTP_ORIGIN'] = $_SERVER['SERVER_NAME']; } try { $API = new MyAPI($_REQUEST['request'], $_SERVER['HTTP_ORIGIN']); echo $API->processAPI(); } catch (Exception $e) { echo json_encode(Array('error' => $e->getMessage())); } ?> e a configuração do htaccess #habilita o modulo mod_rewrite.c <IfModule mod_rewrite.c> #Ligamos o motor de reescrita e vamos aplicar duas regras RewriteEngine On #As regras abaixo fazem a verificação da existência dos arquivos no diretório, correspondente a requisição da URI que for feita. RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d #Aqui fazemos as configurações das regras. Informe seu domínio. RewriteRule api/v1/(.*)$ seu_dominio.com.br/api.php?request=$1 [QSA,NC,L] #Abaixo o significado das flags utilizadas: #QSA - O nome da API será anexado a criação da nova URI #NC - Significa que nossa URI não é do caso sensitivo #L - Indica ao mod_rewrite que nenhuma regra adicional pode ser processada caso correspondam. </IfModule> A idéia é ter uma camada de abstração reutilizável. Mas não funciona... Alguem sabe como corrigir esse script acima? E alguma ideia para implementar o rest?
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.