java - 如何在 Micronaut 中从我的控制器调用另一个 rest api
问题描述
在这篇文章中,我已经在 micronaut gradle 应用程序中实现了从我的 REST API 方法调用另一个 REST API。由于我的 REST API 需要 jwt 令牌,因此我发送的令牌与我在当前请求中收到的令牌相同。我看到未经授权的错误,即使令牌正在传递。任何人都可以在这方面提供帮助。下面是我的代码。
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;
}
}
}
提前致谢。
解决方案
可能是因为@Header("Authorization") String authorization
正在返回类似的内容Bearer xyz...
并且该bearerAuth
方法正在添加Bearer
到字符串中,因此您正在发送Bearer Bearer xyz...
所以就这样做.header(HttpHeaders.AUTHORIZATION, authorization)
另外作为旁注,您真的不应该在此方法中阻止 HTTP 调用。这不是世界末日,因为在这种情况下你阻塞了一个 IO 线程,但是应该避免这种类型的代码。
推荐阅读
- flutter - 如何使用 SearchDelegate 在 Flutter 中显示最近的搜索历史?
- r - 试图将数据强制转换为高斯曲线,结果不如预期
- ssl - 来自 Https Angular 6 App 的 Http WebAPI 调用,SSL 无法在 IIS 中托管
- docker - 从 docker 容器中使用默认命名空间中的集群 IP 访问 k8s 服务
- php - PHP 组表
- linux - 有没有办法可靠地检查 systemd 是否支持 --user?
- java - de.hybris.platform.impex.jalo.ImpExException[HY--1] Hybris ImpEx 中的异常
- javascript - 接收不同字符集中的字符串并在屏幕上显示
- jestjs - 如何使用 jest 测试 HttpService.Post 调用
- php - 雄辩的关系 Laravel 将多个表连接在一起