如何在 Micronaut 中从我的控制器调用另一个 rest api
How to call another rest api from my controller in Micronaut
从这个 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;
}
}
}
提前致谢。
可能是因为 @Header("Authorization") String authorization
返回类似 Bearer xyz...
的内容,而 bearerAuth
方法将 Bearer
添加到字符串中,因此您发送的是 Bearer Bearer xyz...
所以就这样 .header(HttpHeaders.AUTHORIZATION, authorization)
另请注意,您确实不应该在此方法中阻止 HTTP 调用。这不是世界末日,因为在这种情况下你阻塞了一个 IO 线程,但是应该避免这种类型的代码。
从这个 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;
}
}
}
提前致谢。
可能是因为 @Header("Authorization") String authorization
返回类似 Bearer xyz...
的内容,而 bearerAuth
方法将 Bearer
添加到字符串中,因此您发送的是 Bearer Bearer xyz...
所以就这样 .header(HttpHeaders.AUTHORIZATION, authorization)
另请注意,您确实不应该在此方法中阻止 HTTP 调用。这不是世界末日,因为在这种情况下你阻塞了一个 IO 线程,但是应该避免这种类型的代码。