1

When I send request from JSP I use this code

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>

<form method="post"  action="http://translate.intelsoft.az" id="tform" name="ftext">
<input class="gogo1"  value="a" name="l" id="l1" /> <div class="il">
<p>Rusca</p>
<textarea class="ilkin1" name="t" id="t1" >
выыававыавыавыавфыа
выыававыавыавыавфыа
выыававыавыавыавфыа
выыававыавыавыавфыа</textarea>
<div><input class="gogo" type="submit" value="Tərcümə1" name="b1" /></div></div>    </form>

</body>
</html> 

and the response is correct, so that I see my parameter's value. But when I send from Java I get no correct response. I think that the parameters are not sent correctly. Here's my Java code:

String urlParameters = "t=выыававыавыавыавфыа&l=a";
String request = "http://translate.intelsoft.az";
URL url = null;
try {
    url = new URL(request);
} catch (MalformedURLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} 
HttpURLConnection connection = null;
try {
    connection = (HttpURLConnection) url.openConnection();
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}           
connection.setDoOutput(true);
connection.setDoInput(true);
connection.setInstanceFollowRedirects(false); 
try {
    connection.setRequestMethod("POST");
} catch (ProtocolException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} 
connection.setRequestProperty("Content-Type", "text/html"); 
connection.setRequestProperty("charset", "utf-8");
connection.setRequestProperty("Content-Length", "" + Integer.toString(urlParameters.getBytes().length));
connection.setUseCaches (false);

DataOutputStream wr;
try {
    wr = new DataOutputStream(connection.getOutputStream ());
    wr.writeBytes(urlParameters);
    wr.flush();

    BufferedReader rd = new BufferedReader(new InputStreamReader(connection.getInputStream()));
    String line;
    while ((line = rd.readLine()) != null) {
        System.out.println(line);
    }
    wr.close();





    connection.disconnect();
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

What is wrong here?

Gilles 'SO- stop being evil'
  • 92,660
  • 35
  • 189
  • 229
Qafqaz Qafqaz
  • 89
  • 1
  • 2
  • 8
  • You *could* use a library, like apache commons httpclient, or even Apache CXF's JAX-RS client, to spare you a lot of this fiddly stuff. – bmargulies Sep 14 '12 at 18:08

1 Answers1

8

First, your JSP page is using UTF-8 character encoding.

<%@ page ... pageEncoding="UTF-8"%>

However, your Java code isn't using the same character encoding.

DataOutputStream wr;
try {
    wr = new DataOutputStream(connection.getOutputStream ());
    wr.writeBytes(urlParameters); // <--- Wrong! Uses platform default encoding.
    wr.flush();

You need to replace that troublesome piece by

try {
    connection.getOutputStream().write(urlParameters.getBytes("UTF-8"));

Note that the whole DataOutputStream decoration is unnecessary. It serves an entirely different purpose (namely writing of .dat type files). Don't forget to specify the same charset in the way how you've set your Content-Length header.


Second, the parameter names/values themselves should be URL-encoded in order to be extracted properly form the HTTP request.

String urlParameters = "t=" + URLEncoder.encode("выыававыавыавыавфыа", "UTF-8")
                     + "&l=" + URLEncoder.encode("a", "UTF-8");

Third, your request headers are actually also wrong:

connection.setRequestProperty("Content-Type", "text/html"); 
connection.setRequestProperty("charset", "utf-8");

You aren't sending text/html data at all. You are sending application/x-www-form-urlencoded data. Also, that charset should have been an attribute of the Content-Type header, thus so:

connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");

See also:

Community
  • 1
  • 1
BalusC
  • 992,635
  • 352
  • 3,478
  • 3,452
  • but connection.setRequestProperty("charset", "utf-8")? – Qafqaz Qafqaz Sep 14 '12 at 17:48
  • 1
    It just tells the other side what encoding you've used to encode the bytes in the request body. It doesn't perform the actual encoding at all. By the way, this header is actually wrong (the `Content-Type` also). See the updated answer (and the "See also" link, it's all therein). – BalusC Sep 14 '12 at 17:48
  • Thank you @BalusC but i think my problem is other, because no change. – Qafqaz Qafqaz Sep 14 '12 at 17:55
  • Especially that cyrillic request parameter value needs to be URL-encoded. – BalusC Sep 14 '12 at 18:03
  • do you think problem is ?. "Note: whenever you'd like to submit a HTML form programmatically, don't forget to take the name=value pairs of any elements into the query string and of course also the name=value pair of the element which you'd like to "press" programmatically (because that's usually been used in the server side to distinguish if a button was pressed and if so, which one)." – Qafqaz Qafqaz Sep 14 '12 at 18:05
  • You've already sent that input field, but not the submit button. The submit button has a name=value of `b1=Tərcümə1`. – BalusC Sep 14 '12 at 18:08
  • let us [continue this discussion in chat](http://chat.stackoverflow.com/rooms/16707/discussion-between-qafqaz-qafqaz-and-balusc) – Qafqaz Qafqaz Sep 14 '12 at 18:12