Skip to main content

HTTP requests and response in Java

Java has excellent support of HTTP client side. In this blog post we will have a look at how to make HTTP request in Java and download the response , saving it in a buffer.

Java implements a simple HTTP client in a class java.net.HttpURLConnection.

So our first step is to make an instance of java.net.HttpURLConnection. To do this we need java.net.URL class. We will use its constructor which takes url in a form of string as a parameter and then call its openConnection method casting the returned object to HttpURLConnection.

Here is how it is done
String strUrl="http://google.com";
URL url=new URL(strUrl);
HttpURLConnection httpConn=(HttpURLConnection)url.openConnection();
We now have HttpURLConnection object to use. Please note right now no request has been sent to the server (in our case google.com). To complete the process of sending actual request and start getting response we have to use getInputStream method of HttpURLConnection class. Actually getInputStream method is in URLConnection class which is inherited by HttpURLConnection.

We can modify some properties of HttpURLConnection like
1) HTTP Request method
2) If we want to send request body or not.
3) Modify/Add any headers in HTTP request.
etc etc.

I have saved their explanation for a separate blog post where I will show you how you can POST HTTP data or upload a file etc. And we will also write a very simple HTTP download manager.

But for now lets keep it to default settings. Request method is GET , no body with request only headers.

Here is how we will get InputStream.
InputStream iStream=httpConn.getInputStream();
Now if no error has occured, we have InputStream of the underlying connection and we can read the response sent by Webserver using this InputStream.

First lets see how many bytes of data server has returned using HTTP's Content-Length header.
String connLenValue=httpConn.getHeaderField("Content-Length");
We will be storing our response in buffer. ByteBuffer class will come handy here. Before reading response first create ByteBuffer object using its static method allocate which takes capacity of type int as a parameter.
ByteBuffer buffer=ByteBuffer.allocate(Integer.parseInt(connLenValue));
We have everything in place, so lets start reading the response from InputStream and push it into the buffer. We will use put method of ByteBuffer class which takes byte array, offset and length as parameter.
//it will hold bytes from InputStream before pushing into buffer
byte[] tempBuff=new byte[1024];
//bread will hold number of bytes read from InputStream. -1 indicates end of response (stream)
int bread=iStream.read(tempBuff,0,1024);while(bread!=-1){
    buffer=buffer.put(tempBuff,0,bread);
    bread=iStream.read(tempBuff,0,1024);
}
httpConn.disconnect();

Comments

Popular posts from this blog

Decoding JPEG image file using libavcodec

I got a chance to work on a video encoding application that decodes series of jpeg files and convert them into ogg theora video file. I used the infamous libavcodec library that is used in FFMPEG . I decided to write blog posts explaining how I decode jpeg images and convert them into ogg video file. This is the first part and in this I will explain how to decode jpeg images using libavcodec. To learn how to write decoded images as a ogg video file please read http://random-stuff-mine.blogspot.com/2017/07/encoding-raw-images-to-ogg-theora-video.html Before reading this blog post you must be aware of using and setting up libavcodec. I highly recommend this tutorial to get basics of using libavcodec http://www.ffmpeg.org/doxygen/0.6/api-example_8c-source.html Allocating input format context We will first allocate input format for reading the file. We will use avformat_open_input function that will allocate AVFormatContext structure passed to it , the function detects input typ

CryptographicException: An error occurred while trying to encrypt the provided data. Refer to the inner exception for more information

I created a new Blazor Server app in Visual Studio 2019 and tried to run it. But I was getting this error CryptographicException: An error occurred while trying to encrypt the provided data. Refer to the inner exception for more information. I couldn't find any reason or solution to this problem. I tried creating the project multiple times but same error. I created a new .Net Core Web App and added a new razor component and included that component in a razor page (cshtml file) like this @(await Html.RenderComponentAsync<GeofenceWork>(RenderMode.ServerPrerendered)) and <component type="typeof(GeofenceWork)" render-mode="serverprerendered" /> As soon as I navigate to this page that has component added I got the same error: CryptographicException: An error occurred while trying to encrypt the provided data. Refer to the inner exception for more information. This was very frustrating. After hours of trying and searching I figured out the solution. 

Multithreaded C# TCP server to handle multiple clients

I decided to write a minimal multithreaded TCP based server as a blog post. Following class can serve as a skeleton for any small or large scale multithreaded TCP socket server. It do not contain much error handling , it is only to give an idea that how multithreaded server works and how it can process multiple clients using threading. using System; using System.Text; using System.Net; using System.Net.Sockets; using System.Threading; using System.Collections.Generic; namespace RandomStuffMine { public class MTServer {     public int Port{get;set;}     public Socket ServerSocket{get;set;}     private List<Client> Clients=new List<Client>();     private bool runServer=true;     public MTServer(int port)     {         Port=port;         ServerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);     }     public void Start()     {         Thread thr=new Thread(new ThreadStart(StartServer));         thr.IsBackground=t