Xiao Peng

My personal blog moves to xiaopeng.me , blogs about design patterns will be synced to here.
肖鹏,ThoughtWorks资深咨询师,目前关注于架构模式、敏捷软件开发等领域,并致力于软件开发最佳实践的推广和应用。
多次为国内大型企业敏捷组织转型提供咨询和培训服务,在大型团队持续集成方面具有丰富的经验。
  博客园  :: 首页  :: 联系 :: 订阅 订阅  :: 管理

Post parameters to server with Java

Posted on 2010-11-07 16:50  勇敢的鸵鸟  阅读(602)  评论(0编辑  收藏  举报

Sumary:

Use:

data = URLEncoder.encode("para1", "UTF-8") + "=" + URLEncoder.encode("value1", "UTF-8");

Don’t use:

data = URLEncoder.encode("para1=value1", "UTF-8");

 

Posting data to a server should be very easy. But for some newbies, it could make troubles. I’m a newbie.

Normally after googling, you should find something like this:

From:http://www.javadb.com/sending-a-post-request-with-parameters-from-a-java-class

        //Build parameter string
        String data = "width=50&height=100";
        try {
            
            // Send the request
            URL url = new URL("http://www.somesite.com");
            URLConnection conn = url.openConnection();
            conn.setDoOutput(true);
            OutputStreamWriter writer = new OutputStreamWriter(conn.getOutputStream());
            
            //write parameters
            writer.write(data);
            writer.flush();
            
            // Get the response
            StringBuffer answer = new StringBuffer();
            BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            String line;
            while ((line = reader.readLine()) != null) {
                answer.append(line);
            }
            writer.close();
            reader.close();
            
            //Output the response
            System.out.println(answer.toString());
            
        } catch (MalformedURLException ex) {
            ex.printStackTrace();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
 

If your parameters and values are as simple as this, everything is OK. But if not, you may need a URLEncoder! And that’s what makes me in trouble.

If you write your code as

            data = URLEncoder.encode(data, "UTF-8"); 
            //write parameters
            writer.write(data);
            writer.flush();

You are in trouble now. All “width=50&height=100” will be expained as ONE parameter name.

And think a little. Why we need an Encoder? We use an encoder to convert a special charactor into something like %xx, if your code is like above, “=”will be converted. And that now we supposed. So it should be like this:

data = URLEncoder.encode("para1", "UTF-8") + "=" + URLEncoder.encode("value1", "UTF-8");
data += "&" + URLEncoder.encode("para2", "UTF-8") + "=" + URLEncoder.encode("value2", "UTF-8");

That’s it!