Skip to main content

Using HttpURLConnection

Usually when I want to make a request over network in java I familiar to use Socket class like this.
Socket theSock = new Socket(server,port);
PrintStream ps = new PrintStream(theSock.getOutputStream());

then uses ps.println() to send a request and uses theSock.getInputStream() to reciece response to see everything that sent over output stream. But this maybe not suitable for all situation.

Talking with web server will be done through HTTP message[request,response] that consists of header and body. So to make a post,get http request [with Socket class]
//Post
ps.println("POST uri HTTP/1.1");
ps.println("Content-Length: "+body.length());
ps.println("Content-Type: "+contenttype);
ps.println();
ps.println(body);

//or Get
ps.println("GET uri HTTP/1.1");
ps.println("Connection: Close");
ps.println();

and web server will responds with HTTP response like. Here's the example.
HTTP/1.1 200 OK
Date: Wed, 04 Jul 2007 10:14:54 GMT
.
Content-Length: 7
Connection: close
Content-Type: text/html

body

With this format it's hard to manage if we get the reponse via getInputStream() of Socket instance. How about Cookie or Session? or actual data in body. If the response is in xml format and we try to parse it like this
SAXBuilder builder = new SAXBuilder();
Document doc = builder.build(theSock.getInputStream());

It will throw "SAXException: Parsing Error : The root element is required in a well-formed document".
Instead of using using Socket class that saw only bits transfer over the network. HttpURLConnection class will alows us to read parameters in header and data in body. see the code.
//to make HTTP Post request with HttpURLConnection
URL url = new URL("http://server/uri");
HttpURLConnection conn = (HttpURLConnection)url.openConnection();

then set some properties and make a request
conn.setRequestMethod("POST");
conn.setAllowUserInteraction(false); // no user interact [like pop up]
conn.setDoOutput(true); // want to send
conn.setRequestProperty( "Content-type", "text/xml" );
conn.setRequestProperty( "Content-length", Integer.toString(contentx.length()));
OutputStream ost = conn.getOutputStream();
PrintWriter pw = new PrintWriter(ost);
pw.print(body); // here we "send" our body!
pw.flush();
pw.close();

for Get Exam just change setRequestMethod to conn.setRequestMethod("GET").

To get body,cookie or other header parameter of HTTP response
int i=1;// this will print all header parameter
String hKey;
while ((hKey=conn.getHeaderFieldKey(i))!=null){
String hVal = conn.getHeaderField(i);
System.out.println(hKey+"="+hVal);
i++;
}
//and InputStream from here will be body
conn.getInputStream()


note: some time http get need to pass some parameter value, url to create in new URL("url") will end with something like field1=value1&field2=value2... This url must be encode with static method URLEncoder.encode(String) first.

Comments

Anonymous said…
It's useful

Thanks
Saiful said…
was looking for this kind of post about why i should use HttpURLConnection...help me a lot thanks :)

Popular posts from this blog

Fixing sendmail take a long time to start

I notice that my database box[FC6+Oracle10.2] take along time to startup. Sendmail and sm-client very very slow to start[ about 5 minutes ]. There's something wrong in /etc/hosts file. 'newalises' command take long time to update and finish with error below. [root@ora10g ~]# newaliases WARNING: local host name (ora10g) is not qualified; see cf/README: WHO AM I? /etc/aliases: 76 aliases, longest 10 bytes, 765 bytes total [root@ora10g ~]# cat /etc/hosts # Do not remove the following line, or various programs # that require network functionality will fail. 127.0.0.1 localhost.localdomain localhost 192.168.1.55 ora10g [root@ora10g ~]# To fix this, custom hostname[ora10g] need to append to localhost line in /etc/hosts. [root@ora10g ~]# cat /etc/hosts # Do not remove the following line, or various programs # that require network functionality will fail. 127.0.0.1 localhost.localdomain localhost ora10g 192.168.1.55 ora10g [root@ora10g ~]# newaliases /etc/alia

using Class.getResource() load resource file in Eclipse

There are many ways to load resource file in java app. What sun recommended is using Class.getResource(" resource_name ") or Class.getResourceAsStream(" resource_name ") then you will get URL and InputStream respectively. If resource_name is specified without "/", it will be prepend with Class package. So resource file must be in same place[folder structure] as the Class. What I love to do is call getResource() with "/" and put resource file at the root of package. This way i can have separate resource folder. below is in Eclipse, 1. From Package explorer right click src folder->click import 2. In import dialog, Choose General->File System ->next 3. from directory:->Browse to your resource folder. 4. to folder:-> I add "resource" as a folder name under src folder. then click "Finish". In the code, load resource with this.getClass().getResource("/resource/buttons1.png") or this.getClass().getResourceAs

Converting dat to mpeg file, to burn vcd on ubuntu

Creating vcd [from dat file] on WinXP, I use "Nero Burning Rom". It can burn dat file to vcd directly. On ubuntu, AFAIK, No burning cd software to burn dat to vcd. I use k3b but it can't burn dat file. It support only mpeg-1 and mpeg-2 format. Dat file need to convert to mpeg first. Thist post will show how I install and use vcdgear to convert dat file to mpeg file. pnix@pnix-a7n:~/progdl$ wget http://www.vcdgear.com/files/vcdgear176-040415_linux.tar.gz --04:21:14-- http://www.vcdgear.com/files/vcdgear176-040415_linux.tar.gz => `vcdgear176-040415_linux.tar.gz' Resolving www.vcdgear.com... 66.98.192.104 Connecting to www.vcdgear.com|66.98.192.104|:80... connected. HTTP request sent, awaiting response... 200 OK Length: 442,937 (433K) [application/x-tar] 100%[====================================>] 442,937 105.23K/s ETA 00:00 04:21:20 (87.02 KB/s) - `vcdgear176-040415_linux.tar.gz' saved [442937/442937] pnix@pnix-a7n:~/progdl$ tar xzf vcdgear