如何用Java发送POST请求?
当我从JSP发送请求时,我使用以下代码如何用Java发送POST请求?,java,jsp,httprequest,Java,Jsp,Httprequest,当我从JSP发送请求时,我使用以下代码 <%@ 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> &l
<%@ 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>
这里怎么了?首先,您的JSP页面使用UTF-8字符编码
<%@ page ... pageEncoding="UTF-8"%>
DataOutputStream wr;
try {
wr = new DataOutputStream(connection.getOutputStream ());
wr.writeBytes(urlParameters); // <--- Wrong! Uses platform default encoding.
wr.flush();
请注意,整个DataOutputStream
装饰是不必要的。它的用途完全不同(即编写.dat
类型文件)。不要忘记以设置内容长度的方式指定相同的字符集
其次,参数名称/值本身应该是URL编码的,以便从HTTP请求中正确提取
String urlParameters = "t=" + URLEncoder.encode("выыававыавыавыавфыа", "UTF-8")
+ "&l=" + URLEncoder.encode("a", "UTF-8");
第三,您的请求头实际上也是错误的:
connection.setRequestProperty("Content-Type", "text/html");
connection.setRequestProperty("charset", "utf-8");
您根本没有发送text/html
数据。您正在发送应用程序/x-www-form-urlencoded
数据。另外,charset
应该是内容类型
标题的属性,因此:
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");
另见:
首先,您的JSP页面使用UTF-8字符编码
<%@ page ... pageEncoding="UTF-8"%>
DataOutputStream wr;
try {
wr = new DataOutputStream(connection.getOutputStream ());
wr.writeBytes(urlParameters); // <--- Wrong! Uses platform default encoding.
wr.flush();
请注意,整个DataOutputStream
装饰是不必要的。它的用途完全不同(即编写.dat
类型文件)。不要忘记以设置内容长度的方式指定相同的字符集
其次,参数名称/值本身应该是URL编码的,以便从HTTP请求中正确提取
String urlParameters = "t=" + URLEncoder.encode("выыававыавыавыавфыа", "UTF-8")
+ "&l=" + URLEncoder.encode("a", "UTF-8");
第三,您的请求头实际上也是错误的:
connection.setRequestProperty("Content-Type", "text/html");
connection.setRequestProperty("charset", "utf-8");
您根本没有发送text/html
数据。您正在发送应用程序/x-www-form-urlencoded
数据。另外,charset
应该是内容类型
标题的属性,因此:
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");
另见:
但是connection.setRequestProperty(“charset”、“utf-8”)?它只是告诉另一方您在请求正文中使用了什么编码。它根本不执行实际的编码。顺便说一下,这个标题实际上是错误的(内容类型也是)。请参阅更新后的答案(以及“请参阅”链接,都在其中)。谢谢@BalusC,但我认为我的问题是其他的,因为没有更改。特别是西里尔文请求参数值需要URL编码。您认为问题是什么?。注意:每当您希望以编程方式提交HTML表单时,不要忘记将任何元素的name=value对放入查询字符串中,当然也要将要以编程方式“按下”的元素的name=value对放入查询字符串中(因为这通常在服务器端用于区分是否按下了按钮,如果是,则是哪个按钮)。”但是connection.setRequestProperty(“charset”,“utf-8”)?它只是告诉另一方您在请求正文中对字节进行编码所使用的编码。它根本不执行实际的编码。顺便说一句,这个标题实际上是错误的(内容类型也是)。请参阅更新的答案(以及“请参阅”链接,都在其中)。谢谢@BalusC,但我认为我的问题是其他的,因为没有更改。特别是西里尔文请求参数值需要URL编码。你认为问题是吗?。注意:每当您希望以编程方式提交HTML表单时,不要忘记将任何元素的name=value对放入查询字符串中,当然也要将要以编程方式“按下”的元素的name=value对放入查询字符串中(因为这通常在服务器端用于区分是否按下了按钮,如果按下了按钮,则是哪个按钮)。“您可以使用一个库,比如apache commons httpclient,甚至apache CXF的JAX-RS客户端,来为您节省大量这些繁琐的东西。您可以使用一个库,比如apache commons httpclient,甚至apache CXF的JAX-RS客户端,来为您节省大量这些繁琐的东西。