我目前是第一次在android studio上的应用中工作。我目前面临一个问题,我不知道从哪里开始……我花了几个小时来寻找文档以及所有内容,但是我没有找到对我有用的东西。
所以我的应用程序是订购汉堡的应用程序。我从服务器获取数据时使用了我构建的API(一个简单的php文件,用于连接到db,获取我提供给应用程序的汉堡包),然后使用获取的数据进行查看。
当我在这里时,用户可以选择要订购的数量,然后需要将命令发送到服务器。 但是我不知道该怎么做。我尝试了发现互联网的操作,但从未收到服务器响应。不精打细算会很难工作。 这是我的应用程序设计: App View from user perspective
这是我的代码:
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();
}
}
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;
}
}
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
}
}
<?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
答案 0 :(得分:0)
我有一个错误,因为我正在发送一个非Json数组。 在方法doinbackground中,我使用urlEncode,当我检查该功能在做什么时,我读:
将空格字符“”转换为加号“ +”。
这就是为什么当我json_decode file_get_contents(“ php:// input”)时我有一个错误的jsonArray