使用HTTPPost请求将数据从java代码发送到localhost中的PHP时出错

时间:2013-09-29 07:00:58

标签: java php

这是我通过HTTPPost请求发送数据的java代码:

import java.io.*;
import java.net.*;
class HttpURLConnectionEx{
    public static void main(String[] args) throws Exception{    
    URL targetURL = new URL("http://localhost/JAVA/post.php");
    HttpURLConnection conn =(HttpURLConnection) targetURL.openConnection();
    String body= "fName="+ URLEncoder.encode("value1","UTF-8")+"&lName=" + URLEncoder.encode("value2","UTF-8");
    conn.setDoOutput(true);
    conn.setInstanceFollowRedirects(true);
    conn.setRequestMethod("POST");
    conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
    conn.setRequestProperty("charset", "UTF-8");
    conn.setRequestProperty("Content-Length", Integer.toString(body.length()));
    try
    {
     OutputStreamWriter out = new OutputStreamWriter(conn.getOutputStream());
     out.write(body);

      // Get the response
      BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
      String line;
      while((line = rd.readLine()) != null) {
           System.out.println(line);
      }
      }catch(Exception e){
        e.printStackTrace();
      } 
   }
}

这是我在localhost中的PHP代码:

<?php
    $data = $_POST["fName"];
    $dbc = mysqli_connect('localhost','root','root123','JAVA')
           or die("error connecting to mysql server");
    $query = "INSERT INTO insert_table(data) VALUES('".$data."')";
    if($query){
        echo "data inserted sucessfully";
    }
    $result = mysqli_query($dbc,$query) or die("error querying database");
?>

这是我在命令行中运行时获得的输出: enter image description here

1 个答案:

答案 0 :(得分:0)

需要flushwrite

 out.flush();

修改

  

未定义的索引:fName

php错误很清楚,不是吗? $_POST数组不包含POST变量。

首先,我使用var_dump($_POST)

检查了帖子的内容
/* save the raw post to a file */
file_put_contents('/tmp/post.txt', file_get_contents('php://input'));

两者都是空的,因此我使用wireshark来检查HTTP / POST内容,但已完成但Content-Length: 0且没有body

很少谷歌搜索类似于您的代码的东西,我注意到flush表示OutputStreamWriter被缓冲,并且在发布请求时输出可能未被写入(发送到服务器)或仅部分,这是零内容长度的一个很好的理由。

此时我认为您不需要conn.setRequestProperty使用"Content-Length",它应该根据您的缓冲区内容长度进行更新。