Невозможно использовать API отдыха с помощью resttemplate - PullRequest
0 голосов
/ 05 ноября 2018

У меня есть этот API, я пытаюсь потреблять, и это ссылка https://www.live-rates.com/api/price?key=123456&rate=EUR_USD

Я пробовал это в моем контроллере

@ResponseBody
    @RequestMapping(value = { "/start" }, method = RequestMethod.GET)
    public String start() { 
RestTemplate restTemplate = new RestTemplate();

        String quote = restTemplate.getForObject("https://www.live-rates.com/api/price?key=123456&rate=EUR_USD", String.class);
        return quote.toString();
    }

и это в моей программе планирования

package com.boilerplate.components;


import java.util.Date;
import org.slf4j.Logger;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Async;

import com.boilerplate.services.MessageListenerService;
import java.util.Random;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.query.Query;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.client.RestTemplate;

@Repository
@Transactional
@Configuration
@EnableAsync
@EnableScheduling
public class Scheduler {
//Database read and update and delete
    @Autowired
    private RabbitTemplate rabbitTemplate;

    private static final Logger LOGGER = org.slf4j.LoggerFactory.getLogger(MessageListenerService.class);

    @Autowired 
    private SessionFactory sessionFactory;

    @Async
    @Scheduled(cron="*/60 * * * * *")
    public void doSomething(){

        RestTemplate restTemplate = new RestTemplate();

        String quote = restTemplate.getForObject("https://www.live-rates.com/api/price?key=123456&rate=EUR_USD", String.class);
        LOGGER.info(quote.toString());

  }


    }

и все они не могут получить обменный курс.

Я получаю эту ошибку при использовании планировщика

SEVERE: произошла непредвиденная ошибка при вызове асинхронного метода public void com.boilerplate.components.Scheduler.doSomething ()». org.springframework.web.client.HttpClientErrorException: 403 запрещено в org.springframework.web.client.DefaultResponseErrorHandler.handleError (DefaultResponseErrorHandler.java:91) в org.springframework.web.client.RestTemplate.handleResponse (RestTemplate.java:641) в org.springframework.web.client.RestTemplate.doExecute (RestTemplate.java:597) в org.springframework.web.client.RestTemplate.execute (RestTemplate.java:557) в org.springframework.web.client.RestTemplate.getForObject (RestTemplate.java:264) на com.boilerplate.components.Scheduler.doSomething (Scheduler.java:53) на com.boilerplate.components.Scheduler $$ FastClassBySpringCGLIB $$ 17802b05.invoke () в org.springframework.cglib.proxy.MethodProxy.invoke (MethodProxy.java:204) в org.springframework.aop.framework.CglibAopProxy $ CglibMethodInvocation.invokeJoinpoint (CglibAopProxy.java:720) в org.springframework.aop.framework.ReflectiveMethodInvocation.proceed (ReflectiveMethodInvocation.java:157) в org.springframework.transaction.interceptor.TransactionInterceptor $ 1.proceedWithInvocation (TransactionInterceptor.java:99) в org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction (TransactionAspectSupport.java:281) в org.springframework.transaction.interceptor.TransactionInterceptor.invoke (TransactionInterceptor.java:96) в org.springframework.aop.framework.ReflectiveMethodInvocation.proceed (ReflectiveMethodInvocation.java:179) в org.springframework.aop.interceptor.AsyncExecutionInterceptor $ 1.call (AsyncExecutionInterceptor.java:115) в java.util.concurrent.FutureTask.run (FutureTask.java:266) at java.lang.Thread.run (Thread.java:748)

и это при использовании контроллера

HTTP ОШИБКА 500

Проблема доступа / шаблон / запуск. Причина:

Server Error

Причина:

org.springframework.web.util.NestedServletException: Запрос обработка не удалась; вложенное исключение org.springframework.web.client.HttpClientErrorException: 403 запрещено в org.springframework.web.servlet.FrameworkServlet.processRequest (FrameworkServlet.java:979) в org.springframework.web.servlet.FrameworkServlet.doGet (FrameworkServlet.java:858) в javax.servlet.http.HttpServlet.service (HttpServlet.java:687) в org.springframework.web.servlet.FrameworkServlet.service (FrameworkServlet.java:843) в javax.servlet.http.HttpServlet.service (HttpServlet.java:790) в org.eclipse.jetty.servlet.ServletHolder.handle (ServletHolder.java:800) в org.eclipse.jetty.servlet.ServletHandler $ CachedChain.doFilter (ServletHandler.java:1669)

Я пытался использовать другие json apis, такие как https://jsonplaceholder.typicode.com/posts/1, и я могу получить json без проблем.

Почему я не могу получить обменный курс, используя шаблон остальных.

Ответы [ 3 ]

0 голосов
/ 05 ноября 2018

Вы пытались добавить код ниже. Вы пытаетесь вызвать с HTTPS.

CloseableHttpClient httpClient = HttpClients.custom().setSSLHostnameVerifier(new NoopHostnameVerifier()) .build(); HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(); requestFactory.setHttpClient(httpClient); RestTemplate restTemplate = new RestTemplate(requestFactory); String quote = restTemplate.getForObject("https://www.live-rates.com/api/price?key=123456&rate=EUR_USD", String.class);

0 голосов
/ 05 ноября 2018

Не связано с исходным вопросом, но если переменная «quote» уже имеет тип «String», зачем вам вызывать метод «toString ()» для нее?

0 голосов
/ 05 ноября 2018

Вам не нужно использовать @Async с аннотацией @Scheduled. Планировщик все равно будет работать в своем собственном потоке. Конечно, один или несколько работающих планировщиков будут работать последовательно, но это можно изменить. Для вашего случая, однако, что касается документации, может показаться, что вам может потребоваться предоставить restTemplate через внедрение зависимостей. Таким образом, @Autowire может добиться цели. Документация, раздел 27.4.2 .

Обратите внимание, что запланированные методы должны иметь возвраты void и не должно ожидать никаких аргументов. Если метод должен взаимодействовать с другие объекты из контекста приложения, то эти обычно были предоставлены путем внедрения зависимости.

Таким образом, удаление @Async и добавление внедрения зависимости restTemplate может помочь.

Если вам нужно знать, как запустить несколько планировщиков в разных потоках, вы можете проверить этот ответ .

...