0

我目前正在测试一些代码以用于 android 编程。我在这里找到了一些测试项目:http ://www.androidhive.info/2012/05/how-to-connect-android-with-php-mysql/

但问题是,我可以毫无问题地读取数据库,但这些功能不适用于 POST 仅 GET。因此,当我尝试添加新产品时,它会向我的 php 脚本发出请求,但根本没有 POST 数据。我是这样测试的:

<?php 
header("content-type:application/json; charset=UTF-8");
//print("fda");
/*
 * Following code will create a new product row
 * All product details are read from HTTP Post Request
 */

// array for JSON response
$response = array();

// check for required fields
//if (isset($_POST['name']) && isset($_POST['price']) && isset($_POST['description'])) {
//if (isset($_POST['name'])){
    $name = "test";//$_POST['name'];
    $price = 123; //$_POST['price'];
    $description = "desc"; //$_POST['description'];

foreach ($_POST as $key => $value)
 $data = $data." Field ".htmlspecialchars($key)." is ".htmlspecialchars($value);
    // include db connect class
//echo $data;
$url = $_SERVER['REQUEST_URI'];
    require_once __DIR__ . '/db_connect.php';

    // connecting to db
    $db = new DB_CONNECT();

    // mysql inserting a new row
    $result = mysql_query("INSERT INTO products(name, price, description, url) VALUES('$name', '$price', '$description','$data')");

    // check if row inserted or not
    if ($result) {
        // successfully inserted into database
        $response["success"] = 1;
        $response["message"] = "Product successfully created!.";

        // echoing JSON response
        echo json_encode($response);
    } else {
        // failed to insert row
        $response["success"] = 0;
        $response["message"] = "Oops! An error occurred.";

        // echoing JSON response
        echo json_encode($response);

    }
//} else {
//    // required field is missing
//    $response["success"] = 0;
//    $response["message"] = "Required field(s) is missing";
//
//    // echoing JSON response
//    echo json_encode($response);
//}
?>

如您所见,我将 POST 数据发布到数据库中。当我使用我自己的基于 Web 的测试脚本时,它可以完美运行,并在数据库中显示 POST 数据。

所以我的 android 代码实际上似乎并没有发送 POST 数据,因为当我添加产品但 testvars offcourse 时,它​​会在数据库中添加一行。问题是,当我从手机执行它时,数据库中的最后一个字段(url 或更好的参数)将保持为空。

这是来自android应用程序的代码:

package com.example.androidhive;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

public class NewProductActivity extends Activity {

    // Progress Dialog
    private ProgressDialog pDialog;

    JSONParser jsonParser = new JSONParser();
    EditText inputName;
    EditText inputPrice;
    EditText inputDesc;

    // url to create new product
    private static String url_create_product = "http://www.supergeilebus.nl/android_connect/create_product.php/";

    // JSON Node names
    private static final String TAG_SUCCESS = "success";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.add_product);

        // Edit Text
        inputName = (EditText) findViewById(R.id.inputName);
        inputPrice = (EditText) findViewById(R.id.inputPrice);
        inputDesc = (EditText) findViewById(R.id.inputDesc);

        // Create button
        Button btnCreateProduct = (Button) findViewById(R.id.btnCreateProduct);

        // button click event
        btnCreateProduct.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View view) {
                // creating new product in background thread
                new CreateNewProduct().execute();
            }
        });
    }

    /**
     * Background Async Task to Create new product
     * */
    class CreateNewProduct extends AsyncTask<String, String, String> {
        /**
         * Before starting background thread Show Progress Dialog
         * */
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            pDialog = new ProgressDialog(NewProductActivity.this);
            pDialog.setMessage("Creating Product..");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(true);
            pDialog.show();
        }

        /**
         * Creating product
         * */
        protected String doInBackground(String... args) {
            String name = inputName.getText().toString();
            String price = inputPrice.getText().toString();
            String description = inputDesc.getText().toString();

            // Building Parameters
            List<NameValuePair> params = new ArrayList<NameValuePair>();
            params.add(new BasicNameValuePair("name", name));
            params.add(new BasicNameValuePair("price", price));
            params.add(new BasicNameValuePair("description", description));

            // getting JSON Object
            // Note that create product url accepts POST method


            JSONObject json = jsonParser.makeHttpRequest(url_create_product,"POST", params);
            // check log cat fro response
            Log.d("Create Response", json.toString());

            // check for success tag
            try {
                int success = json.getInt(TAG_SUCCESS);

                if (success == 1) {
                    // successfully created product
                    Intent i = new Intent(getApplicationContext(), AllProductsActivity.class);
                    startActivity(i);

                    // closing this screen
                    finish();
                } else {
                    // failed to create product
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }

            return null;
        }

        /**
         * After completing background task Dismiss the progress dialog
         * **/
        protected void onPostExecute(String file_url) {
            // dismiss the dialog once done
            pDialog.dismiss();
        }

    }
}

我希望有一个人可以帮助我。我别无选择。当我将所有内容更改为 GET 时,它可以完美运行。我知道由于 sql 注入,它的编码很差,但我只想了解这一点。

问候和抱歉我的英语不好

4

1 回答 1

0

嗨用户我使用以下代码调用发布到网络服务。它可以帮助你。



**public String doPost(Activity activity, String urlString, String method, String value) 
                                                throws ClientProtocolException, IOException 
    {
        String responseString="";
        HttpURLConnection urlConnection = null;
        retryCount++;
        try 
        {
            URL url = new URL(urlString+method);
            urlConnection = (HttpURLConnection) url.openConnection();
            urlConnection.setRequestMethod("POST");
            urlConnection.setRequestProperty("Content-Type", "application/json");  
            urlConnection.setRequestProperty("Content-Length",value.length()+"" );  
            urlConnection.setDoInput( true );
            urlConnection.setDoOutput( true );
            DataOutputStream dos = new DataOutputStream( urlConnection.getOutputStream() );
            byte[] bs = value.getBytes();
            Log.d(tag, "Sending JSON String ->"+new String(bs));
            dos.write(bs);
            dos.flush();
            dos.close();
            Log.d(tag,"Responce ->"+urlConnection.getResponseMessage());
            if(urlConnection.getResponseMessage().toLowerCase().equals("ok"))
            {
                InputStream is = urlConnection.getInputStream();
                int ch;
                StringBuffer b =new StringBuffer();
                while( ( ch = is.read() ) != -1 )
                {
                    b.append( (char)ch );
                }
                responseString = b.toString();
                Log.d(tag,method + "','" + responseString);
                return method + "','" + responseString;
            }
            else
            {

                Log.d(tag, tag1+urlConnection.getResponseMessage());
            }
            dos.close();
        } 
        catch (SocketException e) 
        {

            Log.d(tag, tag1+e);

    }
        catch (Exception e) 
        {

            Log.e(tag,"-->"+ e);
        }

        return "";
    }**

这里 urlString 和 method 构成了 Web 服务方法的整个 URL。

于 2013-03-08T04:45:49.220 回答