Solucionado (ver solução)
Solucionado
(ver solução)
6
respostas

CRUD para uma URL externa

Ola, estou adornando o curso, porém fiz testes com angular 2 fazendo POST e GET para uma URL externa exemplo de uma API em java que montei para testar a aplicação "http://192.168.55.200:8080/foto/nova"; então tive vários erros, e não consegui resolver nenhum, gostaria de ajuda sobre como usar o Angular 2 fazendo CRUD para URL externas; Obrigado.

Aqui está o contoller da API pra teste

@Controller @RequestMapping("/foto/") public class FotoConctroller {

private List fotoList = new ArrayList<>();

@RequestMapping(value = "nova", consumes = "application/json; charset=UTF-8", produces = "application/json; charset=UTF-8") public ResponseEntity novo(@RequestBody Foto foto) { System.out.println(foto); fotoList.add(foto);

return new ResponseEntity<>(foto, HttpStatus.CREATED); }

@RequestMapping(value = "lista", produces = "application/json; charset=UTF-8") public ResponseEntity> getLista() {

return new ResponseEntity<>(fotoList, HttpStatus.OK); } }

JS do Angular

cadastrar(event) { event.preventDefault();

console.log(this.foto) let headers = new Headers(); headers.append("Content-Type", "application/json");

let body = JSON.stringify(this.foto); console.log(body); this.http .post("http://192.168.55.200:8080/foto/nova", body, { headers: headers }) .subscribe(() => { this.foto = new FotoComponent(); console.log("Foto salva com sucesso!"); }, error => console.log(error));

}

Os erros

zone.js:1382 OPTIONS http://192.168.55.200:8080/foto/nova 415 (Unsupported Media Type)

XMLHttpRequest cannot load http://192.168.55.200:8080/foto/nova. Response for preflight has invalid HTTP status code 415

Response {body: ProgressEvent, status: 0, ok: false, statusText: "", headers: Headers, …} headers : Headers {headersMap: Map(0)} ok : false status : 0 statusText : "" type : 3 url : null body : ProgressEvent bubbles : false cancelBubble : false cancelable : false composed : false currentTarget : XMLHttpRequest {zone_symbolxhrSync: false, zone_symboleventTasks: Array(1), zone_symbolxhrTask: ZoneTask, readyState: 4, timeout: 0, …} defaultPrevented : false eventPhase : 0 isTrusted : true lengthComputable : false loaded : 0 path : [] returnValue : true srcElement : XMLHttpRequest {zone_symbolxhrSync: false, zone_symboleventTasks: Array(1), zone_symbolxhrTask: ZoneTask, readyState: 4, timeout: 0, …} target : XMLHttpRequest {zone_symbolxhrSync: false, zone_symboleventTasks: Array(1), zone_symbolxhrTask: ZoneTask, readyState: 4, timeout: 0, …} timeStamp : 100747.095 total : 0 type : "error" _proto : ProgressEvent __proto : Body

6 respostas

Bom dia.

Você não postou as mensagens de erro. No aguardo das mensagens.

Ola Flavio, alterei as informações de acordo com o que tenho, aguardo sua ajuda, obrigado.

O erro está na sua API do backend, não parece ser no Angular. Fez o backend com qual linguagem? Java né?Talvez você tenha mais chances de ser ajudado no fórum dessa linguagem ou Framework.

Mas tem uma coisa que é básica e padrão na criação de API. Se sua API é de outro endereço diferente da sua App ela precisa habilitar CORS ou você não conseguirá ter acesso. Pesquise sobre CORS e como habilita-lo em sua API.

Sua API também da resposta inválida

XMLHttpRequest cannot load http://192.168.55.200:8080/foto/nova. Response for preflight has invalid HTTP status code 415

De uma olhada sobre esse aqui

https://stackoverflow.com/questions/22566433/http-415-unsupported-media-type-error-with-json

É sobre código Java no backend.

solução!

Ola Flavio, depois de muita dor de cabeça achei o problema, agora esta funcionando perfeitamente.

@Component public class SimpleCORSFilter implements Filter {

@Override public void init(FilterConfig fc) throws ServletException {}

@Override public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { // TODO Auto-generated method stub HttpServletResponse response = (HttpServletResponse) resp;

response.setHeader("Access-Control-Allow-Origin", "*"); response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); response.setHeader("Access-Control-Max-Age", "3600"); response.setHeader("Access-Control-Allow-Headers", "Content-Type");

chain.doFilter(req, resp); }

@Override public void destroy() {}

}

Notícia boa! Mas o que era? Era o que eu falei?

Exato, a API esta em java, utilizei o Sprint boot, então faltava configurar o CORS.