Java发送POST数据(POST数据集为空)

4
我正在尝试使用Java发送POST数据。这是我正在尝试使用的方法:
public void doSubmit(String url, HashMap<String, String> data) throws Exception {
    URL siteUrl = new URL(url);
    HttpURLConnection conn = (HttpURLConnection) siteUrl.openConnection();
    conn.setRequestMethod("POST");
    conn.setDoOutput(true);
    conn.setDoInput(true);

    DataOutputStream out = new DataOutputStream(conn.getOutputStream());

    Set keys = data.keySet();
    Iterator keyIter = keys.iterator();
    String content = "";
    for(int i=0; keyIter.hasNext(); i++) {
        Object key = keyIter.next();
        if(i!=0) {
            content += "&";
        }
        content += key + "=" + URLEncoder.encode(data.get(key), "UTF-8");
    }
    System.out.println(content);
    out.writeBytes(content);
    out.flush();
    out.close();
    BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
    String line = "";
    while((line=in.readLine())!=null) {
        System.out.println(line);
    }
    in.close();
}

以下是我测试的方式:

 HashMap<String, String> data = new HashMap<String, String>();
 data.put("img", "someuser");

 doSubmit("http://www.blah.com/b.php", data);

在.php文件中进行了一些回声测试后,POST数据已设置,但是POST数组为空。为什么?


尝试转储有关$_REQUEST HTTP请求变量的信息,以确认是否已接收到数据。 - steven7mwesigwa
2个回答

1
我曾经遇到过完全相同的问题,并在这里找到了解决方案:http://digitallibraryworld.com/?p=189
//import these on your header

import java.io.IOException;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Scanner;
//do this wherever you are wanting to POST
URL url;
HttpURLConnection conn;

try{
//if you are using https, make sure to import java.net.HttpsURLConnection
url=new URL("http://somesite/somefile.php");

//you need to encode ONLY the values of the parameters
String param="param1=" + URLEncoder.encode("value1","UTF-8")+
"&param2="+URLEncoder.encode("value2","UTF-8")+
"&param3="+URLEncoder.encode("value3","UTF-8");

conn=(HttpURLConnection)loginUrl.openConnection();
//set the output to true, indicating you are outputting(uploading) POST data
conn.setDoOutput(true);
//once you set the output to true, you don't really need to set the request method to post, but I'm doing it anyway
conn.setRequestMethod("POST");

//Android documentation suggested that you set the length of the data you are sending to the server, BUT
// do NOT specify this length in the header by using conn.setRequestProperty("Content-Length", length);
//use this instead.
conn.setFixedLengthStreamingMode(param.getBytes().length);
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
//send the POST out
PrintWriter out = new PrintWriter(conn.getOutputStream());
out.print(param);
out.close();

//build the string to store the response text from the server
String response= "";

//start listening to the stream
Scanner inStream = new Scanner(conn.getInputStream());

//process the stream and store it in StringBuilder
while(inStream.hasNextLine())
response+=(inStream.nextLine());

}
//catch some error
catch(MalformedURLException ex){  
Toast.makeText(MyActivity.this, ex.toString(), 1 ).show();

}
// and some more
catch(IOException ex){

Toast.makeText(MyActivity.this, ex.toString(), 1 ).show();
}

我所做的和示例所做的主要区别在于它生成一个字符串并对其进行URL编码,而我生成了navevaluepairs然后将它们转换为字符串。此外,它正确地发送了字节长度。
conn.setFixedLengthStreamingMode(param.getBytes().length);

我不在那里。


非常感谢您发布这篇文章。conn.setChunkedStreamingMode(0) 明显是使用 HttpURLConnection 时 POST 数据丢失的罪魁祸首。使用 setFixedLengthStreamingMode 对我来说解决了这个问题。奇怪的是,它只影响了 HTTP 而不是 HTTPS。 - Mike Weir

0

尝试设置

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

那没起作用。我加了那个,但POST数据仍为空。 - Sam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接