Hi
I created a AEM servlet to call a external API and I tried to test it on local, my problem is that the CloseableHttpClient can not be executed.
@SlingServlet(paths={"/bin/test01"},methods= {"POST"},metatype=false)
public class OauthAuthServlet extends SlingAllMethodsServlet {
/**
*
*/
private static final long serialVersionUID = -4325654356300019990L;
private final Logger log = LoggerFactory.getLogger(OauthAuthServlet.class);
CloseableHttpClient httpPostClient = HttpClients.createDefault();
public static String OAUTH_SERVER_URL = "https://dm-us.informaticacloud.com/authz-service/oauth/token";
@Override
protected void doGet( SlingHttpServletRequest request, SlingHttpServletResponse response) {
this.doPost(request, response);
}
@Override
protected void doPost( SlingHttpServletRequest request, SlingHttpServletResponse response){
String cc= request.getParameter("CLIENT_CREDENTIALS");
String token = null;
setLocalHttpProxy();
CloseableHttpClient httpClient = HttpClients.createDefault();
HttpPost httpPost = new HttpPost(OAUTH_SERVER_URL);
String header = "Basic "+cc;
httpPost.addHeader("Authorization", header);
List<NameValuePair> formparams = new ArrayList<>();
formparams.add(new BasicNameValuePair("grant_type","client_credentials"));
try {
httpPost.setEntity(new UrlEncodedFormEntity(formparams));
RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(10000).setConnectTimeout(10000).build();
httpPost.setConfig(requestConfig);
CloseableHttpResponse httpResponse = httpClient.execute(httpPost);
try {
HttpEntity entity = httpResponse.getEntity();
token=EntityUtils.toString(entity);
}catch(Exception e) {
e.printStackTrace();
}finally {
httpResponse.close();
}
}catch(Exception e) {
e.printStackTrace();
}finally {
try {
httpClient.close();
}catch(Exception e) {
e.printStackTrace();
}
}
try {
response.getWriter().write(token);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
The servlet always skip this line "
CloseableHttpResponse httpResponse = httpClient.execute(httpPost);", I don't see any errors pop up in logs.
Please give me some advises, thank you.
Solved! Go to Solution.
Views
Replies
Total Likes
Hi @HanL1
I made few changes on your code and executed it on my local. Servlet is getting executed and response is coming back. Let me know if are still facing any issue.
@Component(
service=Servlet.class,
property={
Constants.SERVICE_DESCRIPTION + "=Custom Servlet",
"sling.servlet.methods=" + HttpConstants.METHOD_POST,
"sling.servlet.paths=" + "/bin/test"
}
)
public class OauthAuthServlet extends SlingAllMethodsServlet {
/**
*
*/
private static final long serialVersionUID = -4325654356300019990L;
private final Logger log = LoggerFactory.getLogger(OauthAuthServlet.class);
CloseableHttpClient httpPostClient = HttpClients.createDefault();
public static String OAUTH_SERVER_URL = "https://dm-us.informaticacloud.com/authz-service/oauth/token";
@Override
protected void doGet( SlingHttpServletRequest request, SlingHttpServletResponse response) {
this.doPost(request, response);
}
@Override
protected void doPost( SlingHttpServletRequest request, SlingHttpServletResponse response) {
CloseableHttpClient httpClient = null;
try {
String cc= request.getParameter("CLIENT_CREDENTIALS");
String token = null;
httpClient = HttpClients.createDefault();
HttpPost httpPost = new HttpPost(OAUTH_SERVER_URL);
String header = "Basic "+cc;
httpPost.addHeader("Authorization", header);
List<NameValuePair> formparams = new ArrayList<>();
formparams.add(new BasicNameValuePair("grant_type","client_credentials"));
httpPost.setEntity(new UrlEncodedFormEntity(formparams));
RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(10000).setConnectTimeout(10000).build();
httpPost.setConfig(requestConfig);
CloseableHttpResponse httpResponse = httpClient.execute(httpPost);
HttpEntity entity = httpResponse.getEntity();
token=EntityUtils.toString(entity);
response.getWriter().write(token);
httpClient.close();
}catch (IOException e) {
throw new RuntimeException(e);
} catch(Exception e) {
e.printStackTrace();
}
}}
Hi @HanL1
Your servlet looks good to me however, we can try few options:-
1. Comment out this line
RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(10000).setConnectTimeout(10000).build();
httpPost.setConfig(requestConfig);
2. Instead of using
CloseableHttpResponse httpResponse = httpClient.execute(httpPost);
try with,
org.apache.http.HttpResponse
Also, you have used lots of nested try and catch block, add only one try and catch block. Make these changes and give it a try.
Hi @HanL1
I made few changes on your code and executed it on my local. Servlet is getting executed and response is coming back. Let me know if are still facing any issue.
@Component(
service=Servlet.class,
property={
Constants.SERVICE_DESCRIPTION + "=Custom Servlet",
"sling.servlet.methods=" + HttpConstants.METHOD_POST,
"sling.servlet.paths=" + "/bin/test"
}
)
public class OauthAuthServlet extends SlingAllMethodsServlet {
/**
*
*/
private static final long serialVersionUID = -4325654356300019990L;
private final Logger log = LoggerFactory.getLogger(OauthAuthServlet.class);
CloseableHttpClient httpPostClient = HttpClients.createDefault();
public static String OAUTH_SERVER_URL = "https://dm-us.informaticacloud.com/authz-service/oauth/token";
@Override
protected void doGet( SlingHttpServletRequest request, SlingHttpServletResponse response) {
this.doPost(request, response);
}
@Override
protected void doPost( SlingHttpServletRequest request, SlingHttpServletResponse response) {
CloseableHttpClient httpClient = null;
try {
String cc= request.getParameter("CLIENT_CREDENTIALS");
String token = null;
httpClient = HttpClients.createDefault();
HttpPost httpPost = new HttpPost(OAUTH_SERVER_URL);
String header = "Basic "+cc;
httpPost.addHeader("Authorization", header);
List<NameValuePair> formparams = new ArrayList<>();
formparams.add(new BasicNameValuePair("grant_type","client_credentials"));
httpPost.setEntity(new UrlEncodedFormEntity(formparams));
RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(10000).setConnectTimeout(10000).build();
httpPost.setConfig(requestConfig);
CloseableHttpResponse httpResponse = httpClient.execute(httpPost);
HttpEntity entity = httpResponse.getEntity();
token=EntityUtils.toString(entity);
response.getWriter().write(token);
httpClient.close();
}catch (IOException e) {
throw new RuntimeException(e);
} catch(Exception e) {
e.printStackTrace();
}
}}
Thank you for your response , I tried it but still doesn't work. It turns out it's proxy issue since I am using company laptop.