Skip to main content

HTTP POST request in Java

In one blog post I wrote about how we can make HTTP requests and receive response in Java. That post was only about sending GET request. This time we will learn how to make POST (submitting form etc) request in Java. 
This post assumes that you are familiar with HttpURLConnection found in java.net package. If you are not please read this blog post
http://random-stuff-mine.blogspot.com/2013/06/http-request-and-response-java.html

HTTP POST request
Lets say you entered username/password in a website and pressed "Login" button. Most probably the web browser makes a HTTP POST request containing your username/password. A simple POST request would look like this
POST /path/to/script HTTP/1.1
User-Agent: RemzyHttpBot
Content-Type: application/x-www-form-urlencoded
Content-Length: 32
 
username=rameez&password=test
In the above request you see that username and password are sent inside the request body and content-type of request is set to application/x-www-form-urlencoded. This content type tells the webserver that POST parameters are in url encoded form. Now lets mimic this request with Java code

POSTing a form using java code
First we will create HttpURLConnection and set its parameters for POST request.
URL postUrl=new URL("http://localhost:8080/testpost.php");
HttpURLConnection conn=(HttpURLConnection)postUrl.openConnection();
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
conn.setRequestProperty("User-Agent","RemzyHttpBot");
conn.setRequestProperty("Content-Length",lengthOfPostBody);
conn.setDoInput(true);
conn.setDoOutput(true); //we are POSTing so we will write data to outputstream
After creating HttpURLConnection we will open its output stream to write our POST data (username/password) in url encoded form
OutputStream os=conn.getOutputStream();
String postBody="username="+URLUTF8Encoder.encode("rameez");
postBody+="&password="+URLUTF8Encoder.encode("test");
os.write(postBody.getBytes()); //write our post data to outputstream
In above code you see the reference to URLUTF8Encoder class. This class is provided by w3.org as a helper class to convert string data into url safe form. You can get this class from here.

Now our POST data is sent to OutputStream of HttpURLConnection. Its time to read the response returned from server. For that we will use InputStream of HttpURLConnection
InputStream is=conn.getInputStream();
String connLenValue=conn.getHeaderField("Content-Length");
ByteBuffer buffer=ByteBuffer.allocate(Integer.parseInt(connLenValue));
//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=is.read(tempBuff,0,1024);while(bread!=-1){
    buffer=buffer.put(tempBuff,0,bread);
    bread=is.read(tempBuff,0,1024);
}
is.close();
os.close();
conn.disconnect();
So this is how you make HTTP POST request using your java code.

In next blog post we will see how to make a Multipart POST request which involve file uploading through java code. 

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. 

Encoding raw images to Ogg Theora video using libavcodec

In one of the blog posts we learned how to decode jpeg images using libavcodec. This is the second part of that post. In this we will learn how to encode decoded images (raw images) to theora and write them in ogg video file. In the end of the first part we saved our raw image in raw_data variable and its length in raw_data_size variable. Lets assume that we packaged all our decoding code in one function called "decode_jpeg_image" which has following signature int decode_jpeg_image(char *filename,int file_name_size,uint8_t *raw_data,int *raw_data_size) filename = name of jpeg file to decode file_name_size = length of jpeg file's name raw_data = contains decoded raw image on return raw_data_size = contains length of raw_data on return Now let's start working on how to encode this image in raw_data to theora and write that image to ogg video file. Finding Theora encoder We first have to find encoder for THEORA which is represented by AVCodec structure. He