【问题标题】:Android JSON POST MethodAndroid JSON POST 方法
【发布时间】:2019-01-29 03:14:56
【问题描述】:

我是 Android 的初学者,正在开发一个应用程序,该应用程序使用 PHP 脚本从 SQL localhost(临时)服务器获取数据以获取所需的表并提取字段。现在按照教程一切都很好,所以我有一个 ReyclerViewCustomAdapter 并且我正在使用 LoaderManager 所以我还有一个加载器,它在我的 Utils Class 中执行 fetchData 方法在那个类里面有用于制作 HttpUrlConnection 直到从我的 SQL 数据库中提取 JSON 数据,并提取到我的模型(Dish.Java)的 List<> 中,其中包含导体和吸气剂方法。

但现在我尝试将数据发送到另一个表,例如项目喜欢或为每个项目评分为此目的我创建了新表,其中只包含喜欢作为 INT(稍后附加到具有外键的项目),因此我确实搜索并找到了一个 PHP 脚本(它适合我获取数据的白痴情况)如下:

<?php

    if($_SERVER["REQUEST_METHOD"]=="POST"){

    require 'connection.php';

    updateLikes();

    }

    function updateLikes(){

        global $connect;
        $likes = $_POST['likes'];
        $query = "UPDATE likes SET likes = '$likes'";
        mysqli_query($connect,$query) or die (mysqli_error($connect));
        mysqli_close($connect);

    }
?>

如果我尝试发出 POST 请求而不是 PUT,例如 Postman 我能够更改我表中的 likes 字段。但不知道如何将其添加到我的查询中 因此,例如在评级后获取Ratingbar 的值并将其累积到喜欢字段中的服务器(我知道这很荒谬)。 我发现我可以将setRequestMethodHttpUrlConnection 设置为“POST”并像这样使用DataOutputStream

class UpdateLikes extends AsyncTask<String, Void, Void> {
    String URL = "http://localhost:81/likes.php";

    @Override
    protected Void doInBackground(String... params) {
        String jsonData = params[0];
        String charset = "UTF-8";
        try {
            java.net.URL url = new URL(URL);

            HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
            httpURLConnection.setRequestMethod("POST");
            httpURLConnection.setRequestProperty("Accept-Charset", charset);
            httpURLConnection.setRequestProperty("Content-Type", "application/json;charset=" + charset);
            httpURLConnection.setDoInput(true);
            httpURLConnection.setDoOutput(true);
            httpURLConnection.connect();

            //send data
            DataOutputStream os = new DataOutputStream(httpURLConnection.getOutputStream());
            os.writeBytes(jsonData.toString());

            //OutputStream dos = httpURLConnection.getOutputStream();
            //dos.write(Integer.parseInt(jsonData.toString()));

            //receive & read data response
            InputStream is = httpURLConnection.getInputStream();
            StringBuilder result = new StringBuilder();
            int byteCharacter;
            while ((byteCharacter = is.read()) != -1) {
                result.append((char) byteCharacter);
            }
            Log.d("json api", "DoUpdateProduct.doInBackground Json return: " + result);
            os.flush();
            is.close();
            os.close();
            httpURLConnection.disconnect();
        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }

}

这是我在 ratingbar 监听器中执行 AsyncTask doInBackground 的代码

String counter = String.valueOf(rating);
                    Like likes = new Like(counter);
                try {
                    JSONObject jsonObject =  new JSONObject();
                    JSONArray jsonArray = new JSONArray();

                    jsonObject.put("likes",likes.likes);
                    jsonArray.put(jsonObject);

                    Log.d("json api", "Json array converted from Product: " + jsonArray.toString());
                    String jsonData = String.valueOf(jsonArray);

                    new UpdateLikes().execute(jsonData);
                } catch (JSONException e) {
                    e.printStackTrace();
                }
                Log.e(MondayActivity.LOG_TAG, "Rating is:" + rating);
            }
        });

然后执行的事情是,当我调试时,我可以获得评级并将其设置为数组,建立连接,但它不会更新我的数据库中的任何内容。

因此,我将不胜感激任何我如何实现这一目标的建议,或者可能有完全另一种方式甚至可以重新考虑。

这是我的课程,所以你看看发生了什么

QuerUtils.Java

public class QueryUtils {
        public static long date;
        public static ArrayList<String> ls;

        public QueryUtils() {
        }

        private static URL createUrl(String strUrl) {
            URL url = null;

            try {
                url = new URL(strUrl);
            } catch (MalformedURLException e) {
                e.printStackTrace();
                Log.e(LOG_TAG, "Problem building the URL ", e);
            }
            return url;
        }

        private static String makeHttpRequest(URL url) throws IOException {

            String jsonResponse = "";
            //TODO new
            if (url == null) {
                return jsonResponse;
            }
            HttpURLConnection urlConnection = null;
            InputStream inputStream = null;

            try {
                urlConnection = (HttpURLConnection) url.openConnection();
                urlConnection.setReadTimeout(10000);
                urlConnection.setConnectTimeout(15000);
                urlConnection.setRequestMethod("GET");
                urlConnection.connect();
                inputStream = urlConnection.getInputStream();
                jsonResponse = readFromStream(inputStream);

            } catch (IOException e) {
                Log.e(LOG_TAG, "Problem retrieving the JSON results.", e);
            } finally {
                if (urlConnection != null) {
                    urlConnection.disconnect();
                }
                if (inputStream != null) {
                    inputStream.close();
                }
            }
            return jsonResponse;
        }

        private static String readFromStream(InputStream inputStream) throws IOException {
            StringBuilder output = new StringBuilder();

            if (inputStream != null) {

                InputStreamReader inputStreamReader = new InputStreamReader(inputStream, Charset.forName("UTF-8"));
                BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

                String line = bufferedReader.readLine();

                while (line != null) {
                    output.append(line);
                    line = bufferedReader.readLine();
                }
            }
            return output.toString();
        }

        public static List<Dish> fetchData(String requestUrl) {
          /*  try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
    */
            URL url = createUrl(requestUrl);

            String jsonResponse = "";

            try {
                jsonResponse = makeHttpRequest(url);
            } catch (IOException e) {
                Log.e(LOG_TAG, "Problem making the HTTP request.", e);
            }

            List<Dish> dishes = extractFeatureFromJson(jsonResponse);
            Log.i(LOG_TAG, "QueryUtils returns " + dishes);
            return dishes;
        }
        private static List<Dish> extractFeatureFromJson(String jsonResponse) {
            if (TextUtils.isEmpty(jsonResponse)) {
                return null;
            }

            List<Dish> dishes = new ArrayList<>();

            try {

                JSONObject jsonObject = new JSONObject(jsonResponse);
                JSONArray jsonArray = jsonObject.getJSONArray("data");

                JSONObject jsonObject1 = null;
                //dishes = new ArrayList<>();

                ls = new ArrayList<>();

                for (int i = 0; i < jsonArray.length(); i++) {
                    jsonObject1 = (JSONObject) jsonArray.get(i);
                    if (jsonObject1 != null) {
                        String name = jsonObject1.getString("dish");
                        String daytime = jsonObject1.getString("daytime");
                        String dishName = jsonObject1.getString("dish");
                        String component = jsonObject1.getString("component");
                        double price = jsonObject1.getDouble("price");
                        String day = jsonObject1.getString("weakday");
                        int iconId_1 = jsonObject1.getInt("iconid_1");
                        int iconId_2 = jsonObject1.getInt("iconid_2");
                        date = jsonObject1.getLong("date");
                        int likesCounter = jsonObject1.getInt("likes");
                        String likes = String.valueOf((int) likesCounter);
                        Log.e(LOG_TAG, String.valueOf(date));

                        ls.add(jsonObject1.getString("date"));
                        Dish dish = new Dish(name, daytime, dishName,
                                component, price, day, date, iconId_1, iconId_2, likes);
                        dishes.add(dish);

                    }
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }

            return dishes;
        }

    }

DishAdapterTest.java

  public class DishAdapterTest extends RecyclerView.Adapter<DishAdapterTest.ViewHolder> {
        private List<Dish> dishes;
        private Context context;

        public DishAdapterTest(Context context, List<Dish> dishes) {
            this.context = context;
            this.dishes = dishes;
        }

        @NonNull
        @Override
        public DishAdapterTest.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

            View itemView = LayoutInflater.from(parent.getContext()).inflate(
                    R.layout.list_item_dish, parent, false);

            return new ViewHolder(itemView);
        }

        @RequiresApi(api = Build.VERSION_CODES.N)
        @Override
        public void onBindViewHolder(@NonNull final ViewHolder holder, int position) {
            final Dish dish = dishes.get(position);
            holder.daytimeTextView.setText(dish.getmDayTime());

            holder.dishTextView.setText(dish.getmDish());
            holder.componentTextView.setText(dish.getmComponent());
            double originalPrice = dish.getmPrice();
            NumberFormat format = NumberFormat.getCurrencyInstance(Locale.GERMANY);
            String price = format.format(originalPrice);

            //String format2 = new DecimalFormat("#,###.00").format(dish.getmPrice());
            holder.priceTextView.setText(price);

            int icon_id = getIcon(dish.getmImageResId1());
            holder.iconImageView.setImageResource(icon_id);
            int icon_id2 = getIcon(dish.getmImageResId2());
            holder.icon1ImageView.setImageResource(icon_id2);
            holder.likesTextView.setText(dish.getmLikes());


            holder.mRatingbar.setOnRatingBarChangeListener(new RatingBar.OnRatingBarChangeListener() {
                @Override
                public void onRatingChanged(RatingBar ratingBar, float rating, boolean fromUser) {
                    Log.e(MondayActivity.LOG_TAG, "Rating is:" + rating);
                }
            });
        }

        public void setData(List<Dish> data) {
            dishes.clear();
            dishes.addAll(data);
            notifyDataSetChanged();
        }

        @Override
        public int getItemCount() {
            Log.i("DishAdapter Mensa ", "dishes.size() = " + dishes.size());
            return dishes.size();
        }

        public class ViewHolder extends RecyclerView.ViewHolder {
            // The ViewHolder design pattern
            private TextView daytimeTextView;
            private TextView dishTextView;
            private TextView componentTextView;
            private TextView priceTextView;
            private ImageView iconImageView;
            private ImageView icon1ImageView;
            private RatingBar mRatingbar;
            private TextView likesTextView;


            public ViewHolder(View view) {
                super(view);
                this.daytimeTextView = view.findViewById(R.id.daytime_text_view);
                this.dishTextView = view.findViewById(R.id.dish_text_view);
                this.componentTextView = view.findViewById(R.id.component_text_view);
                this.priceTextView = view.findViewById(R.id.price_text_view);
                this.iconImageView = view.findViewById(R.id.icon_image_view);
                this.icon1ImageView = view.findViewById(R.id.icon_image_view1);
                this.mRatingbar = view.findViewById(R.id.ratingBar);
                this.likesTextView = view.findViewById(R.id.likes_counter_text_view);
            }
        }
    }

就在与此相关的主要活动中,我有我的适配器 我有我的加载程序覆盖方法

@Override
    public Loader<List<Dish>> onCreateLoader(int i, Bundle bundle) {
        Log.e(LOG_TAG, "Initializing OnCreate Loader");
        if (dishList1.size() > 0) {
            dishList1.clear();
            dishAdapter.notifyDataSetChanged();
        }
        return new DishLoader(this, REQUEST_URL);
    }

 @Override
    public void onLoadFinished(Loader<List<Dish>> loader, List<Dish> dishes) {
        Log.e(LOG_TAG, "Initializing onFinished");
        View loadingIndicator = findViewById(R.id.loading_indicator);
        loadingIndicator.setVisibility(View.GONE);
        dishList1.clear();
        Log.e(LOG_TAG, "Initializing onFinished Clear Adapter");
        if (dishes != null && !dishes.isEmpty()) {
            dishList1.clear();
            dishList1 = dishes;
            dishAdapter.setData(dishes);

        }
    }

【问题讨论】:

    标签: php android sql jsonparser


    【解决方案1】:

    请检查您的 php 脚本中的更新查询。

    $query = "UPDATE tableName SET columnName = 'values', columnName = 'values' WHERE columnName = 'values';
    
    
    $query = "UPDATE likes SET likes = '$likes'";
    

    您忘记了WHERE 子句。

    【讨论】:

    • 所以当我第一次遇到问题时我尝试了这个,现在我再次尝试并调试我得到了这个响应:未定义的索引:喜欢 C:\Apache24\htdocs\likes.php 第 16 行
      。我也不知道应该在 php 脚本中指定表名,因为它没有声明只有表中的字段和语句来更新表中的字段。
    • 您收到此响应是因为未定义符号“$likes”。您应该参考此链接以了解 UPDATE 查询 w3schools.com/php/php_mysql_update.asp
    • 好的,所以我应用了你所说的并添加了 WHERE id atrr。现在它可以工作并转到该字段并更新它,但将其设置为 null 并且在日志中具有相同的响应。我会更新上面的json代码
    • 现在检查你的android端你有什么数据要发送到服务器。还要检查你必须通过什么值。如果您没有得到任何解决方案,请参考此链接androidhive.info/2014/05/android-working-with-volley-library-1希望它对您有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-05
    • 2020-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多