发送请求到服务器

时间:2020-06-16 11:33:24

标签: java android

我目前是第一次在android studio上的应用中工作。我目前面临一个问题,我不知道从哪里开始……我花了几个小时来寻找文档以及所有内容,但是我没有找到对我有用的东西。

所以我的应用程序是订购汉堡的应用程序。我从服务器获取数据时使用了我构建的API(一个简单的php文件,用于连接到db,获取我提供给应用程序的汉堡包),然后使用获取的数据进行查看。

当我在这里时,用户可以选择要订购的数量,然后需要将命令发送到服务器。 但是我不知道该怎么做。我尝试了发现互联网的操作,但从未收到服务器响应。不精打细算会很难工作。 这是我的应用程序设计: App View from user perspective

这是我的代码:

  1. 主要活动
public class MainActivity extends AppCompatActivity {
        ListView listView;

            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
                listView = findViewById(R.id.listView);
                downLoadJson("http://192.168.0.5/API/burger.php");
            }

            private void downLoadJson(final String urlWebService) {
                DownLoadJson getJson = new DownLoadJson(urlWebService, this);
                getJson.execute();
            }

        }
  1. 这是我的DownLoadJson类
import android.app.Activity;
import android.os.AsyncTask;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ListView;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;

public class DownLoadJson extends AsyncTask<Void, Void, String> {
    final String urlWebService;
    final Activity activity;
    private ArrayList<Burger> burgersList;

    public DownLoadJson(String url, Activity activity) {
        this.urlWebService = url;
        this.activity = activity;
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        //Toast.makeText(activity.getApplicationContext(),"DOWNLOADING",Toast.LENGTH_LONG).show();
    }

    @Override
    protected void onPostExecute(String s) {
        super.onPostExecute(s);
        try {
            renderView(s);
            Button btnSend = activity.findViewById(R.id.btnSend);
            btnSend.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Log.d("ENVOYER", ""+burgersList.toString());
                    new SendPostRequestToServer().execute("http://192.168.0.5/API/ServiceCommandes.php",burgersList.toString());
                }
            });
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

    @Override
    protected String doInBackground(Void... voids) {
        try {
            // Ouverture de la connexion avec l'api
            URL url = new URL(urlWebService);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            StringBuilder stringBuilder = new StringBuilder();
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            String json;
            while ((json = bufferedReader.readLine()) != null) {
                stringBuilder.append(json + "\n");
            }
            return stringBuilder.toString().trim();
        } catch (MalformedURLException e) {
            Log.d("ERROR", "WRONG URL");
            e.printStackTrace();
            return null;
        } catch (IOException e) {
            Log.d("ERROR", "Connection I/O error ");
            e.printStackTrace();
            return null;
        } catch (Exception e) {
            return null;
        }
    }

    private void renderView(String json) throws JSONException {
        JSONArray jsonArray = new JSONArray(json);
        JSONObject jsonObject = jsonArray.getJSONObject(0);
        if (jsonObject.has("recette")) {
            burgersList = Burger.fromJson(jsonArray);
            BurgerAdapter adapter = new BurgerAdapter(activity, burgersList);
            ListView listView = (ListView) activity.findViewById(R.id.listView);
            listView.setAdapter(adapter);
            //adapter.addAll(burgersList);
            Log.d("DEBUG", "BURGER LIST = " + burgersList.size());
        }
    }

    public ArrayList<Burger> returnArrayList() {
        return burgersList;
    }
}
  1. 这是我找到互联网的我的SendPostRequestToServer
    import android.os.AsyncTask;
    import android.util.Log;

    import java.io.DataOutputStream;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.net.HttpURLConnection;
    import java.net.URL;

    public class SendPostRequestToServer extends AsyncTask<String, Void, String> {
        @Override
        protected String doInBackground(String... params) {

            String data = "";

            HttpURLConnection httpURLConnection = null;
            try {

                httpURLConnection = (HttpURLConnection) new URL(params[0]).openConnection();
                httpURLConnection.setRequestMethod("POST");

                httpURLConnection.setDoOutput(true);

                DataOutputStream wr = new DataOutputStream(httpURLConnection.getOutputStream());
                wr.writeBytes("PostData=" + params[1]);
                wr.flush();
                wr.close();

                InputStream in = httpURLConnection.getInputStream();
                InputStreamReader inputStreamReader = new InputStreamReader(in);

                int inputStreamData = inputStreamReader.read();
                while (inputStreamData != -1) {
                    char current = (char) inputStreamData;
                    inputStreamData = inputStreamReader.read();
                    data += current;
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (httpURLConnection != null) {
                    httpURLConnection.disconnect();
                }
            }

            return data;
        }

        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);
            Log.e("POST :", result); // this is expecting a response code to be sent from your server upon receiving the POST data
        }
    }
  1. Php文件:
<?php
// Headers
header("Access-Control-Allow-Origin: *");
header("Content-Type: application/json; charset=UTF-8");
header("Access-Control-Allow-Methods: POST");
$PostData = json_decode(file_get_contents("php://input"));
if(!empty(($PostData)){
    http_response_code(200);
    echo json_encode(array("message" => "DATA RECEIVE"));

}else{
    http_response_code(503);
    echo json_encode(array("message" => "DATA ERROR"));
}

$con=mysqli_connect("localhost","root","","fastfood");
// check erreur
if (mysqli_connect_errno())
{
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
}
mysqli_close($con);
?>

当我检查file_get_contents(“ php:// input”); 我明白了 : ''' 2020-06-16 15:16:06.174 12488-12488 / com.example.fastfood D / POST ::%5B%7B%22id%22%3A +%221%22%2C%22nom%22%3A +%22Hamburger%22 %2C%22quantite%22%3A +%220%22%7D%2C +%7B%22id%22%3A +%222%22%2C%22nom%22%3A +%22Cheeseburger%22%2C%22quantite%22%3A +%220 %22%7D%2C +%7B%22id%22%3A +%223%22%2C%22nom%22%3A +%22Giant%22%2C%22quantite%22%3A +%220%22%7D%2C +%7B%22id %22%3A +%224%22%2C%22nom%22%3A +%22Giant + Max。%22%2C%22quantite%22%3A +%220%22%7D%2C +%7B%22id%22%3A +%225% 22%2C%22nom%22%3A +%22Bacon + Max。%22%2C%22quantite%22%3A +%220%22%7D%2C +%7B%22id%22%3A +%226%22%2C%22nom%22 %3A +%22Supreme + Cheese%22%2C%22quantite%22%3A +%220%22%7D%2C +%7B%22id%22%3A +%227%22%2C%22nom%22%3A +%22Supreme + Pepper%22 %2C%22quantite%22%3A +%220%22%7D%2C +%7B%22id%22%3A +%228%22%2C%22nom%22%3A +%22Supreme + Chicken%22%2C%22quantite%22%3A + %220%22%7D%2C +%7B%22id%22%3A +%229%22%2C%22nom%22%3A +%22Fish + Burger%22%2C%22quantite%22%3A +%220%22%7D%2C + %7B%22id%22%3A +%2210%22%2C%22nom%22%3A +%22鸡肉+汉堡%22%2C%22quantite%22%3A +%220%22%7D%2C +%7B%22id%22%3A + %2211%22%2 C%22nom%22%3A +%22Diabolo%22%2C%22quantite%22%3A +%220%22%7D%2C +%7B%22id%22%3A +%2212%22%2C%22nom%22%3A +%22Barbecue% 22%2C%22quantite%22%3A +%220%22%7D%5D

'''

我检查互联网,当我将其解码为json时得到: JSON DECODE

1 个答案:

答案 0 :(得分:0)

我有一个错误,因为我正在发送一个非Json数组。 在方法doinbackground中,我使用urlEncode,当我检查该功能在做什么时,我读:

将空格字符“”转换为加号“ +”。

这就是为什么当我json_decode file_get_contents(“ php:// input”)时我有一个错误的jsonArray