2011-08-03 31 views
3

我想用java發送POST數據。這裏是方法我試圖使用方法:Java發送POST數據(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數組是空的。爲什麼?

回答

0

嘗試設置

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

這沒有奏效。我補充說,POST數據仍然是空的。 – Sam

0

我有完全相同的問題,在這裏找到了解決辦法: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); 

我沒有。