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

发布于 2024-11-27 21:36:47 字数 1303 浏览 0 评论 0原文

我正在尝试使用 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 数组为空。为什么?

I'm trying to send POST data using java. Here is the method I'm trying to use:

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();
}

And here is how I am testing it:

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

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

After some echo tests in the .php, the POST data is set, but the POST array is empty. Why?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

鹤仙姿 2024-12-04 21:36:48

我遇到了完全相同的问题,并在这里找到了解决方案: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")+
"¶m2="+URLEncoder.encode("value2","UTF-8")+
"¶m3="+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);

它也正确地发送了我没有发送

I had exactly the same problem and found the solution here: 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")+
"¶m2="+URLEncoder.encode("value2","UTF-8")+
"¶m3="+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();
}

The main difference between what I was doing and what the example does is it is generating a string and URL encoding it - where I was generating navevaluepairs and then converting them to a string.
It is also sending the length of the bytes correctly

conn.setFixedLengthStreamingMode(param.getBytes().length);

where I was not.

数理化全能战士 2024-12-04 21:36:48

尝试设置

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

Try setting

connection.setRequestProperty("Accept-Charset", 'UTF-8');
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文