【问题标题】:How do I send a request to get specific data from server using HttpUrlConection in android?如何在android中使用HttpUrlConection发送请求以从服务器获取特定数据?
【发布时间】:2016-03-04 07:40:50
【问题描述】:

我对 android 比较陌生。有很多使用 HttpClient、HttpPost 从服务器获取数据的示例。但不幸的是,我找不到通过 HttpUrlConnection 从服务器获取特定数据的任何选项。

我想知道, 如何从我的 android 应用程序将数据传递到服务器中的 PHP 文件 以及如何从 PHP 文件中读取该数据

我找到了一种方法,可以将查询到的数据从 PHP 文件重新发送到 android 应用程序,并使用 json 从 android 应用程序读取该数据。

【问题讨论】:

  • '我找到了一种方法,可以将查询到的数据从 PHP 文件重新发送到 android 应用程序,并使用 json 从 android 应用程序读取该数据。'。那么你就完成了。你还需要什么?
  • 我想获取特定的数据,例如有一个名为“Person”的表,它具有“name”、“age”、“city”等属性。然后我想获取那些是 20 岁或以上。所以我想将 20 从我的 Android 应用程序发送到 php 脚本以查询该数据。我如何从 android 应用程序发送 20,以及我如何在服务器的 PHP 脚本中读取它。

标签: php android


【解决方案1】:

GET 请求:

InputStream is = null;
URL url = new URL( "http://my_url/index.php?par1=val1&par2=val2" );
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout( 20000 );       // if you want to set the Read timeout
conn.setConnectTimeout( 30000 );    // if you want to set the Connect timeout
conn.setRequestMethod( "GET" );
conn.setDoInput( true );
conn.connect();
if( conn.getResponseCode() == HttpURLConnection.HTTP_OK )
{
    is = conn.getInputStream();
    Reader reader = new InputStreamReader( is, "UTF-8" );
    char[] buffer = new char[10240];
    int len = reader.read( buffer );
    // ...
}
if( is != null ) is.close();

POST 请求:

URL url = new URL( address );
int len = params.getBytes().length;
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setUseCaches( false );
// conn.setDoInput( true );    // input channel needed?
conn.setDoOutput( true );
conn.setInstanceFollowRedirects( false );
conn.setRequestMethod( "POST" );
conn.setRequestProperty( "Content-Type", "application/x-www-form-urlencoded" ); 
conn.setRequestProperty( "charset", "utf-8" );
conn.setRequestProperty( "Content-Length", "" + Integer.toString( len ) );
conn.setFixedLengthStreamingMode( len );
DataOutputStream dos = new DataOutputStream( conn.getOutputStream() );
dos.writeBytes( params );
dos.flush();
dos.close();
conn.disconnect();

当然还有尝试/捕获所需的异常。

更新:示例 Android POST 参数“年龄”:

params = "age=20";

PHP 行读取“年龄”:

$age = intval( $_POST['age'] );

【讨论】:

  • 感谢您的回复。那么如何从服务器的 PHP 脚本中读取这些数据呢?
  • @MFaizan:尝试从var_dump( $_REQUEST );开始-然后深入查看PHP predefined variables或在其他问题中搜索,有很多类似的请求
  • 什么是参数?没有人可以看到您正在发送哪些或哪些数据。例如没有 20。
  • Params 是带参数的字符串,例如:String params = "par1=val1&par2=val2"; - what is 20?
【解决方案2】:

我找到了一种从服务器获取数据的方法

这是我的 Android MainActivity

package com.example.mfjaleel.myPackage;

import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;

public class MainActivity extends AppCompatActivity {
    Button btn;
    TextView tv;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn = (Button)findViewById(R.id.button);
        tv = (TextView)findViewById(R.id.tv);
        btn.setOnClickListener(
                new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        new JSONTask().execute("Ur link","parameters");
                    }
                }
        );

    }


   public class JSONTask extends AsyncTask<String,Void,String >{
       ProgressDialog loading;
       @Override
       protected String doInBackground(String... params) {
           HttpURLConnection connection = null;
           BufferedReader reader = null;

           URL url ;
           try {
               url = new URL(params[0]);
               connection = (HttpURLConnection) url.openConnection();
               //connection.connect();
               connection.setRequestMethod("POST");
               connection.setDoInput(true);
               connection.setDoOutput(true);

               HashMap<String,String > data = new HashMap<String, String>();
               data.put("id",params[1]);



               OutputStream os = connection.getOutputStream();
               BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os, "UTF-8"));
               writer.write(getPostDataString(data));

               writer.flush();
               writer.close();
               os.close();

               int responseCode=connection.getResponseCode();

              String response = "";
               if (responseCode == HttpURLConnection.HTTP_OK) {
                   reader=new BufferedReader(new InputStreamReader(connection.getInputStream()));
                   response = reader.readLine();
               }
               else {
                   response="Error Registering";
               }

               return response;


           } catch (MalformedURLException e) {
               e.printStackTrace();
               return "MalformedURLException Exception";
           } catch (IOException e) {
               e.printStackTrace();
               return "IO Exception";
           }
           //return "Error";
       }

       @Override
       protected void onPreExecute() {
           super.onPreExecute();
           loading = ProgressDialog.show(MainActivity.this, "Please Wait", null, true, true);
       }

       @Override
       protected void onPostExecute(String s) {
           super.onPostExecute(s);
           loading.dismiss();
           tv.setText(s);
       }

       private String getPostDataString(HashMap<String, String> params) throws UnsupportedEncodingException {
           StringBuilder result = new StringBuilder();
           boolean first = true;
           for(Map.Entry<String, String> entry : params.entrySet()){
               if (first)
                   first = false;
               else
                   result.append("&");

               result.append(URLEncoder.encode(entry.getKey(), "UTF-8"));
               result.append("=");
               result.append(URLEncoder.encode(entry.getValue(), "UTF-8"));
           }

           return result.toString();
       }
   }

}

这是我在服务器中的 PHP 脚本

function getAll($id){
    $con = new mysqli("localhost","root","password","db_name");
    if($con->connect_error){
        die("Connection Failed ".$con->connect_error);
    }

    $sql = "SELECT * from TABLE_NAME WHERE id = $id";
    $query = $con->query($sql);

    while($r = $query->fetch_assoc()){
        $output[] = $r;     
    }

    $con->close();
    return json_encode($output);
}

$x = 2;
if($_SERVER['REQUEST_METHOD']=='POST'){
    $x = $_POST["id"];
}
$p = getAll($x);
echo $p;

感谢 @mat 和 @greenapps 的帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-01
    • 1970-01-01
    • 2014-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-03
    • 2010-12-03
    相关资源
    最近更新 更多