Friday, 31 May 2013

How to send HTTPRequest GET/POST Using Java or HttpClient

How to send HTTPRequest GET/POST Using Java or HttpClient

In this article I will show you with example of GET/POST Request via standard Java and apache client library.
I.e.  HttpURLConnection and HttpClient library.


1  : Java HttpURLConnection 

for example

package test.http;

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

import javax.net.ssl.HttpsURLConnection;

public class HttpURLConnectionTest {

/**
* @param args
*/
public static void main(String[] args) {
HttpURLConnectionTest http=new HttpURLConnectionTest();
//http.sendGETRequest();
http.sendPOSTRequest();

}
private void sendGETRequest(){
String url = "http://www.google.com";
try{
URL obj = new URL(url);
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
//con.setRequestProperty("User-Agent", USER_AGENT);
int responseCode = con.getResponseCode();
System.out.println("Sending GET request to URL : " + url);
System.out.println("Response Code : " + responseCode);

BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();

while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
}catch(Exception ex){
ex.printStackTrace();
}
}
private void sendPOSTRequest(){
String url = "http://www.mginger.com/login.jsp";
try{
URL obj = new URL(url);
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
//add reuqest header
con.setRequestMethod("POST");
//con.setRequestProperty("User-Agent", USER_AGENT);
con.setRequestProperty("Accept-Language", "en-US,en;q=0.5");
String urlParameters = "j_username=wakil&j_password=ahamad123343";
// Send post request
con.setDoOutput(true);
DataOutputStream wr = new DataOutputStream(con.getOutputStream());
wr.writeBytes(urlParameters);
wr.flush();
wr.close();
int responseCode = con.getResponseCode();
System.out.println("Sending POST request to URL : " + url);
System.out.println("Post parameters : " + urlParameters);
System.out.println("Response Code : " + responseCode);

BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();

//print result
System.out.println(response.toString());
}catch(Exception ex){
ex.printStackTrace();
}
}

}

When you run the following output comes here :

Sending GET request to URL : http://www.google.com
Response Code : 200
<!doctype html><html itemscope="itemscope" itemtype="http://schema.org/WebPage"><head><meta itemprop="image" content="/images/google_favicon_128.png"><title>Google</title><script>(function(){window.google={kEI:"CpupUZyyA4SIrAf164GQDA",getEI:function(a){for(var b;a&&(!a.getAttribute||!(b=a.getAttribute("eid")));)a=a.parentNode;return b||google.kEI},https:function()

-------------------------------------------------
-------------------------------------------------


Sending POST request to URL : http://www.mginger.com/login.jsp
Post parameters : j_username=wakil&j_password=ahamad123343
Response Code : 200
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.0//EN" "http://www.wapforum.org/DTD/xhtml-mobile10.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"><head> <title>Get Deals | Earn Rewards | Free SMS | Games | Coupons - mGinger.com</title> <style type="text/css">            @import "/mobile/css/style.css"; </style> 
--------------------------------------------------
--------------------------------------------------
</html>


2 : HttpClient 

for example 

package test.http;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
public class HttpClientTest {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
HttpClientTest http=new HttpClientTest();
http.sendGETRequest();
http.sendPOSTRequest();
}
// HTTP GET request
private void sendGETRequest() throws Exception {
 
String url = "http://www.google.com/search?q=developer";
HttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet(url);
// add request header
request.addHeader("User-Agent", USER_AGENT);
 
HttpResponse response = client.execute(request);
 
System.out.println("Sending GET request to URL : " + url);
System.out.println("Response Code : " + response.getStatusLine().getStatusCode());
 
BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
 
StringBuffer result = new StringBuffer();
String line = "";
while ((line = rd.readLine()) != null) {
result.append(line);
}
 
System.out.println(result.toString());
 
}
 
// HTTP POST request
private void sendPOSTRequest() throws Exception {
 
String url = "http://www.mginger.com/login";
HttpClient client = new DefaultHttpClient();
HttpPost post = new HttpPost(url);
// add header
post.setHeader("User-Agent", USER_AGENT);
 
List<NameValuePair> urlParameters = new ArrayList<NameValuePair>();
urlParameters.add(new BasicNameValuePair("j_username", "wakil"));
urlParameters.add(new BasicNameValuePair("j_password", "qwqweqe"));
post.setEntity(new UrlEncodedFormEntity(urlParameters));
HttpResponse response = client.execute(post);
System.out.println("Sending POST request to URL : " + url);
System.out.println("Post parameters : " + post.getEntity());
System.out.println("Response Code : " + response.getStatusLine().getStatusCode());
 
BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
 
StringBuffer result = new StringBuffer();
String line = "";
while ((line = rd.readLine()) != null) {
result.append(line);
}
System.out.println(result.toString());
}
 

}


Thursday, 30 May 2013

Generate Report in java using DynamicReports and JasperReports

Generate Reports in java using DynamicReports and JasperReports

This example shows you how to generate a simple report using DynamicReports and JasperReports
For developing this you must need to download DynamicReports the library and include it into their classpath. It allows you to produce documents that can be exported into many popular formats, It is based on JasperReport library.
1 : Create a DataSource and use it into report generation as
Class.forName(“com.mysql.jdbc.Driver”);
Connection con=DriverManager.getConnection(“jdbc:mysql://hostname:port/dbname”,”username”,”password”);
2 : Suppose mysql server contains a database test having table customer having fields
The table customer having fields
Column name
Data type
id
int
first_name
varchar(50)
last_name
varchar(50)
Created_date
datetime
age
int

We will create  report that will get all customers from the table and the data will be put into the report.

3 :Create a empty report object

JasperReportBuilder report = DynamicReports.report();

4: Now create a report colum for each database column

Columns.column("Customer Id", "id", DataTypes.integerType());
Where first parameter is column level
Second parameter is actual table field which is same as table column name.
Third parameter is datatype

5 : Add the report columns.

report
  .columns(
    Columns.column("Customer Id", "id", DataTypes.integerType()),
    Columns.column("First Name", "first_name", DataTypes.stringType()),
    Columns.column("Last Name", "last_name", DataTypes.stringType()),
    Columns.column("Created Date", "date", DataTypes.dateType()))
    Columns.column("Customer Age", "age", DataTypes.integerType()))

6 : Add a title text and page number to a report

.title(//title of the report
    Components.text("SimpleReportExample")
      .setHorizontalAlignment(HorizontalAlignment.CENTER))
  .pageFooter(Components.pageXofY())//show page number on the page footer

7 : Finally set the datasource query and connection

.setDataSource("SELECT id, first_name, last_name, created_date,age FROM customers ", connection);
Now below the full example here.
SimpleReportTest.java
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import net.sf.dynamicreports.jasper.builder.JasperReportBuilder;
import net.sf.dynamicreports.report.builder.DynamicReports;
import net.sf.dynamicreports.report.builder.column.Columns;
import net.sf.dynamicreports.report.builder.component.Components;
import net.sf.dynamicreports.report.builder.datatype.DataTypes;
import net.sf.dynamicreports.report.constant.HorizontalAlignment;
import net.sf.dynamicreports.report.exception.DRException;
public class DynamicSimpleTest {
  public static void main(String[] args) {
            Connection connection = null;
            try {
                        Class.forName("com.mysql.jdbc.Driver");
                        connection = DriverManager.getConnection(
                    "jdbc:mysql://localhost:3306/test","root", "admin123");
            } catch (SQLException e) {
                        e.printStackTrace();
                        return;
            } catch (ClassNotFoundException e) {
                        e.printStackTrace();
                        return;
            }
            JasperReportBuilder report = DynamicReports.report();//a new report
            report
              .columns(
                  Columns.column("Customer Id", "id", DataTypes.integerType()),
                  Columns.column("First Name", "first_name", DataTypes.stringType()),
                  Columns.column("Last Name", "last_name", DataTypes.stringType()),
                  Columns.column("Created_date", "created_date", DataTypes.dateType()),
                  Columns.column("Customer Age","age",DataTypes.integerType()))
                 

              .title(//title of the report
                  Components.text("SimpleReportExample")
                          .setHorizontalAlignment(HorizontalAlignment.CENTER))
                          .pageFooter(Components.pageXofY())//show page number on the page footer
                          .setDataSource("SELECT id, first_name, last_name, created_date,age FROM customers",
                                  connection);

            try {
                //show the report
                        report.show();

                //export the report to a pdf file
                        report.toPdf(new FileOutputStream("d:/report1.pdf"));
            } catch (DRException e) {
                        e.printStackTrace();
            } catch (FileNotFoundException e) {
                        e.printStackTrace();
            }
  }
After Running It, It generates a report in pdf as below.

Output is here :








Wednesday, 29 May 2013

How to use jcaptcha image service in our application

How to use jcaptcha image service in our application
How to install it
For maven users, you need to add the following dependency in your pom file.
<dependency>
    <groupId>com.octo.captcha</groupId>
    <artifactId>jcaptcha</artifactId>
    <version>1.0</version>
</dependency>
For without maven2 users
Add jcaptcha-all.jar (provided in bin-distribution) and commons-collection-3.2 or greater  to your application class path, i.e. in your WEB-INF/lib.
Implement a CaptchaService, It must be a singleton
package com.jcaptcha.test;
import com.octo.captcha.service.image.DefaultManageableImageCaptchaService;
import com.octo.captcha.service.image.ImageCaptchaService;
public class CaptchaServiceSingleton {
private static ImageCaptchaService instance = new DefaultManageableImageCaptchaService();
    public static ImageCaptchaService getInstance(){
        return instance;
    }
}

Create a servlet for captcha image.

package com.jcaptcha.test;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.octo.captcha.service.CaptchaServiceException;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;

public class ImageCaptchaServlet extends HttpServlet {
       private static final long serialVersionUID = 1L;
       public void init(ServletConfig servletConfig) throws ServletException {
        super.init(servletConfig);
    }

    protected void doGet(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws ServletException, IOException {
       byte[] captchaChallengeAsJpeg = null;
       // the output stream to render the captcha image as jpeg into
        ByteArrayOutputStream jpegOutputStream = new ByteArrayOutputStream();
        try {
        // get the session id that will identify the generated captcha.
        //the same id must be used to validate the response, the session id is a good candidate!
        String captchaId = httpServletRequest.getSession().getId();
        // call the ImageCaptchaService getChallenge method
            BufferedImage challenge = CaptchaServiceSingleton.getInstance().getImageChallengeForID(captchaId,httpServletRequest.getLocale());
            // a jpeg encoder
            JPEGImageEncoder jpegEncoder =JPEGCodec.createJPEGEncoder(jpegOutputStream);
            jpegEncoder.encode(challenge);
        } catch (IllegalArgumentException e) {
            httpServletResponse.sendError(HttpServletResponse.SC_NOT_FOUND);
            return;
        } catch (CaptchaServiceException e) {
            httpServletResponse.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
            return;
        }

        captchaChallengeAsJpeg = jpegOutputStream.toByteArray();
        // flush it in the response
        httpServletResponse.setHeader("Cache-Control", "no-store");
        httpServletResponse.setHeader("Pragma", "no-cache");
        httpServletResponse.setDateHeader("Expires", 0);
        httpServletResponse.setContentType("image/jpeg");
        ServletOutputStream responseOutputStream =httpServletResponse.getOutputStream();
        responseOutputStream.write(captchaChallengeAsJpeg);
        responseOutputStream.flush();
        responseOutputStream.close();
    }

}


In web.xml  You can add this as
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
       xmlns="http://java.sun.com/xml/ns/javaee"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
       http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  <display-name></display-name>
  <servlet>
        <servlet-name>jcaptcha</servlet-name>
        <servlet-class>ImageCaptchaServlet</servlet-class>
        <load-on-startup>0</load-on-startup>
    </servlet>

  <servlet-mapping>
        <servlet-name>jcaptcha</servlet-name>
        <url-pattern>/jcaptcha</url-pattern>
    </servlet-mapping>    
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>


In the form you must add this to display captcha image and input text box for submitting
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%
//String path = request.getContextPath();
//String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>JCaptcha Index Page</title>
      <meta http-equiv="pragma" content="no-cache">
      <meta http-equiv="cache-control" content="no-cache">
      <meta http-equiv="expires" content="0">   
      <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
      <meta http-equiv="description" content="How to create Captcha Image Service">
    </head>
 
  <body>
     <img src="jcaptcha">
     <input type='text' name='j_captcha_response' value=''>
  </body>
</html>

For Validation You can Implement validation service as
Handle the post (using a servlet, or whatever).
The validateCaptchaForId method will return true if the response is correct.
           Boolean isResponseCorrect =Boolean.FALSE;
           //remenber that we need an id to validate!
           String captchaId = httpServletRequest.getSession().getId();
           //retrieve the response
           String response = httpServletRequest.getParameter("j_captcha_response");
           // Call the Service method
            try {
                isResponseCorrect = CaptchaServiceSingleton.getInstance().validateResponseForID(captchaId,
                        response);
            } catch (CaptchaServiceException e) {
                 //should not happen, may be thrown if the id is not valid
           }

The Output are as Below :