【问题标题】:How to call another rest api from my controller in Micronaut如何在 Micronaut 中从我的控制器调用另一个 rest api
【发布时间】:2019-09-26 13:21:10
【问题描述】:

通过这个artcle,我已经在 micronaut gradle 应用程序中实现了从我的 REST API 方法调用另一个 REST API。由于我的 REST API 需要 jwt 令牌,因此我发送的令牌与我在当前请求中收到的令牌相同。即使令牌正在传递,我也看到 Unauthorized 错误。任何人都可以在这方面提供帮助。下面是我的代码。

import io.micronaut.http.HttpRequest;
import io.micronaut.http.HttpStatus;
import io.appter.clientmgmt.models.ClientContact;
import io.appter.clientmgmt.repositories.IClientContactRepository;
import io.micronaut.http.uri.UriTemplate;
import io.micronaut.security.annotation.Secured;
import io.micronaut.security.authentication.Authentication;
import io.micronaut.security.rules.SecurityRule;
import io.micronaut.http.annotation.*;
import io.micronaut.http.client.RxHttpClient;
import io.micronaut.http.client.annotation.Client;
import io.reactivex.Flowable;
import org.slf4j.LoggerFactory;
import org.slf4j.Logger;

import javax.validation.constraints.NotNull;
import java.security.Security;
import java.util.List;


@Controller("/clientcontact")
//@Secured(SecurityRule.IS_ANONYMOUS)
public class ClientContactController {
    private static final Logger LOG = LoggerFactory.getLogger(ClientContactController.class);
    private IClientContactRepository clientContactRepository;
    private final RxHttpClient httpClient;

    public ClientContactController(IClientContactRepository clientContactRepository,
                                   @Client("http://appterauthsvc-env.g2yapp2kcp.us-east-1.elasticbeanstalk.com") RxHttpClient httpClient) {
        this.clientContactRepository = clientContactRepository;
        this.httpClient = httpClient;
    }

    @Get("/")
    public HttpStatus index() {
        return HttpStatus.OK;
    }

    @Post("/")
    @Secured(SecurityRule.IS_AUTHENTICATED)
    public ClientContact createClientContact(@Body ClientContact clientContact,
                                             Authentication authentication,
                                             @Header("Authorization") String authorization) {
        try {
            List<ClientContact> existingClientContacts = clientContactRepository.getClientContactByClientId(clientContact.getClientId());
            LOG.info("current contacts count for the client " + clientContact.getClientId() + " is " + existingClientContacts.size());
            if (existingClientContacts.isEmpty()) {

                User userObj = new User();
                Long clientId = new Long(clientContact.getClientId());
                userObj.setClientId(clientId);
                userObj.setFirstName(clientContact.getFirstName());
                userObj.setLastName(clientContact.getLastName());
                userObj.setEmailId(clientContact.getEmailAddress());
                userObj.setPhoneNo(clientContact.getContactNumber());
                userObj.setIsActive(true);

                LOG.info("User Email set is: "+userObj.getEmailId());
                LOG.info("authorization token is: "+authorization);
                HttpRequest<?> request = HttpRequest.POST("/user", userObj).bearerAuth(authorization);

                String response = httpClient.toBlocking().retrieve(request);
                LOG.info("Request Object: "+ request.toString());
                LOG.info("Response Object: "+ response.toString());
                LOG.info("User API executed.. ");
            }


            return clientContactRepository.createClientContact(clientContact);
        } catch (Exception ex) {
            LOG.error(ex.getMessage(), ex);
            return null;
        }
    }
}

提前致谢。

【问题讨论】:

    标签: java gradle micronaut


    【解决方案1】:

    可能是因为@Header("Authorization") String authorization 正在返回类似Bearer xyz... 的内容,而bearerAuth 方法将Bearer 添加到字符串中,因此您发送Bearer Bearer xyz...

    那么就做.header(HttpHeaders.AUTHORIZATION, authorization)

    另外作为旁注,您真的不应该在此方法中阻止 HTTP 调用。这不是世界末日,因为在这种情况下你会阻塞一个 IO 线程,但是应该避免这种类型的代码。

    【讨论】:

    • 感谢@James 的更新。是的,一旦我在标头中设置了令牌,它就可以正常工作了。
    • 现在我正在尝试使用 micronaut 令牌传播将令牌传递给我的 API 调用。我再次看到未经授权的错误。我严格按照guides.micronaut.io/micronaut-token-propagation/guide/… 的说明进行操作,但没有工作。有人对此有想法吗?
    • @Buddha 这听起来像是一个单独的问题,应该是一个新话题。如果它解决了您的问题,请接受此答案
    • Kleesh,是的,您的回答解决了我的问题。正如你提到的,我为令牌传播创建了一个新主题/问题stackoverflow.com/questions/58166731/…
    猜你喜欢
    • 1970-01-01
    • 2017-10-14
    • 1970-01-01
    • 1970-01-01
    • 2022-12-16
    • 2016-01-01
    • 2017-03-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多