HttpURLConnection响应返回空

时间:2014-02-05 06:15:07

标签: php android httpurlconnection

更新3

现在一切正常。我使用了thisthis,而不是我用于POST的内容。

更新2

我刚刚注意到,如果我按降序排列更新,看起来组织得更好。

我在我的OP(下方)中编辑了我的代码,添加了一些注释,并使用ReadHttpResponse(String url)中的here替换了输入流阅读器。这使我将我的PHP脚本分为update.php和get.php而不是updateandget.php。

事实证明,get.php工作正常,在有限的意义上它只是查询数据(不发布任何值)。处理与该URL的连接的update.php或Java代码在某种程度上搞乱了。

至少我发现我没有正确发布。我还更新了OP以显示update.php。

OP

这是运行AsyncTask的doInBackground()的代码

 try{
         //HttpURLConnection<-url.openConnection()
    URL url = new URL(address);
    HttpURLConnection conn =(HttpURLConnection) url.openConnection(); //remember to close
    conn.setReadTimeout(10000);
    conn.setConnectTimeout(15000);
    conn.setRequestMethod("POST");
    conn.setDoInput(true);
    conn.setDoOutput(false);
    // Write data to Server
        //exctract parameters
    String username = (String)arg0[0];
    String lastLong = (String)arg0[1];
    String lastLat = (String)arg0[2];
        //encode parameters
    String data  = URLEncoder.encode("username", "UTF-8")+ "=" + URLEncoder.encode(username, "UTF-8");
    data += "&" + URLEncoder.encode("lastLong", "UTF-8")+ "=" + URLEncoder.encode(lastLong, "UTF-8");
    data += "&" + URLEncoder.encode("lastLat", "UTF-8")+ "=" + URLEncoder.encode(lastLat, "UTF-8");
        //Build outputstream handler (socket?)
    DataOutputStream wr = new DataOutputStream(conn.getOutputStream()); 
        //write,flush,close
    wr.writeBytes( data ); 
    wr.flush(); 
    wr.close();
        // Read Server Response
    //BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
    //StringBuilder sb = new StringBuilder();
    //String line = null;
    //String returnmessage="";
    //while((line = reader.readLine()) != null)
    //{
    //  returnmessage="There is something at least";
    //   sb.append(line);
    //   break;
    //}
    //reader.close();
    conn.disconnect();

    //return returnmessage;
    return ReadHttpResponse("http://www.pixeldonut.com/testing/tutorial/get.php");
 }catch(Exception e){
    return new String("Exception: " + e.getMessage());
 }

阅读没有问题,(或使用ReadHttpResponse)。显然有其他一切问题。

update.php:

    <?php //lastknownlocation updateandget
//open con
$con=mysqli_connect("details");
if (mysqli_connect_errno($con))
{
   echo "Failed to connect to MySQL: " . mysqli_connect_error();
   die();
}
//=========================================================statistics snippet
            if(array_key_exists('REMOTE_ADDR', $_SERVER)){
                $ip=$_SERVER['REMOTE_ADDR'];
                $address=$_SERVER['SERVER_ADDR'];
                if (array_key_exists('HTTP_X_FORWARDED_FOR', $_SERVER)){
                    $ip2=$_SERVER['HTTP_X_FORWARDED_FOR'];
                }else{
                    $ip2="_";
                }
                $query="INSERT INTO statistics (ip,ip2,address) VALUES (";
                $query.="'$ip','$ip2','$address'";
                $query.=")";//echo $query;
                $db_return=mysql_query($query);
                if(!$db_return){
                    //echo "Your entry was unsuccessfully logged.";
                }else{
                    //echo "Your entry was successfully logged.";
                }
            }
            //==============================================================================
    //update-insert
$username = $_POST['username'];
$param1= $_POST['param1'];
$param2= $_POST['param2'];
$query = "UPDATE users SET";
$query .=" param1='$param1'";
$query .=",param2='$param2' ";
$query .="WHERE username='$username'";//echo $query;
$result = mysqli_query($con,$query);
if(!result){
    //couldnt find user, aborting
    die();
}


//close con
mysqli_close($con);
?>

感谢您的持续支持和热情,Ebichuhamster。

2 个答案:

答案 0 :(得分:1)

我看到一些可能是导致问题的原因。或者至少他们值得关注以避免将来出现问题:

<强>爪哇

实施看起来很不错。我将添加一些代码来检查您的请求的HTTP状态代码并添加更多代码,以确保即使发生错误也可以关闭连接和流。我建议使用抽象库而不是HttpURLConnection。如果您选择DavidWebb,您的代码将如下所示,您可以确定所有流都已关闭,正确的标头已设置以及其他一些内容:

String username = "scott";
String lat = "47.49706";
String lng = "12.63244";

Webb webb = Webb.create();

Response<String> response = webb
        .post("http://my-server:8888/updateandget.php")
        .param("username", username)
        .param("param1", lng)
        .param("param2", lat)
        .readTimeout(10000)
        .connectTimeout(15000)
        .asString();

if (response.isSuccess()) {
    String json = response.getBody();
    // go on
} else {
    // handle error
    if (response.getStatusCode() >= 500) {
        // a server error, in case of "503 Service Unavailable" retry later?
    }
}

<强> PHP

在日志记录片段中输出echo "Your entry was unsuccessfully logged.";。这会产生不正确的JSON。因为你只得到<br/>这不是你现在的问题。

更新语句似乎是正确的,但它可能是一个安全问题,因为它是为SQL注入打开的。

获得结果的陈述可能有两个问题:

"SELECT username,param1,param2FROM table WHERE username!='$username'";
  • param2和FROM之间必须是空格
  • 您可能不希望返回用户拥有的所有 行,是吗? (再一次注入SQL的危险)

寻找解决方案

我建议你首先尝试检查你的PHP脚本是否已经到达,通过将其更改为绝对没有任何东西,但返回一些静态JSON内容(你知道结构)。如果可行,您可以添加越来越多的语句,看看它是否有效。

答案 1 :(得分:0)

同样有问题,我尝试使用:

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

它有效。以前我只使用OutputStream,当我的Android应用程序向我的mysql服务器(本地)发送请求时,它给我空$ _POST。