我有问题。我正在为REST API
创建Android
,但我的HttpPost
无效。我正在使用XAMPP
和Slim framework
解决此问题。
我创建了POST
方法,我希望在表Car
中添加一个新的cars
。
我的Car
对象的构造函数是:
public Car(int idCar, String name, Date dateBuyCar)
{
this.idCar = idCar;
this.name = name;
this.dateBuyCar = dateBuyCar;
}
我的POST
方法与Slim
类似:
$app->post("/cars/",function() use($app)
{
$idCar = $app->request->post("idCar");
$name = $app->request->post("name");
$dateCar = $app->request->post("dateCar");
try{
$connection = getConnection();
$dbh = $connection->prepare("INSERT INTO cars VALUES(?,?,?)");
$dbh->bindParam(1,$idCar);
$dbh->bindParam(2,$name);
$dbh->bindParam(3,$dateCar);
$dbh->execute();
$cars = $connection->lastInsertId();
$connection = null;
header("HTTP/1.1 200");
header("Content-Type:application/json; charset=utf-8");
echo json_encode($cars,JSON_UNESCAPED_UNICODE );
}catch(PDOException $e)
{
echo "Error: " . $e->getMessage();
}
});
我按照以下方式制作HttpPost
方法:
class addCarDatabase extends AsyncTask<Void, Integer, Void> {
private Car newCar;
addCarDatabase(Car newCar)
{
this.newCar = newCar;
}
protected void onPreExecute(){
}
protected Void doInBackground(Void... params) {
String date = null;
date = new SimpleDateFormat("yyyy-MM-dd").format(newCar.getDate());
String url = "http://IP of my computer/project/cars/";
HttpClient httpClient = new DefaultHttpClient();
HttpPost method = new HttpPost(url);
BasicNameValuePair idCarValuePair = new BasicNameValuePair("id", newCar.getIdCar());
BasicNameValuePair nameValuePair = new BasicNameValuePair("name", newCar.getName());
BasicNameValuePair dateValuePair = new BasicNameValuePair("date", newCar.getDateBuyCar());
List<NameValuePair> nameValuePairList = new ArrayList<NameValuePair>();
nameValuePairList.add(idCarValuePair);
nameValuePairList.add(nameValuePair);
nameValuePairList.add(dateValuePair);
try{
UrlEncodedFormEntity urlEncodedFormEntity = new UrlEncodedFormEntity(nameValuePairList);
method.setEntity(urlEncodedFormEntity);
} catch (UnsupportedEncodingException uee) {
System.out.println("An Exception given because of UrlEncodedFormEntity argument :" + uee);
uee.printStackTrace();
}
try {
HttpResponse response = httpClient.execute(method);
Log.d("Response", response.toString());
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
protected void onProgressUpdate(){
}
protected void onPostExecute(){
}
}
在我的MySQL
数据库中(我使用phpmyadmin
来管理它)我有三列,每列都是我要添加的新Car
的一个属性:
--> id(int)
--> name(String)
--> dt(date)
我认为这个问题是因为我的对象中有一个Date
,但我并不安全。我认为这可能是问题,因为我看到phpmyadmin
中的日期存储为2010-12-06
,当我使用我的应用程序时,我需要像06-12-2010
这样的日期,所以在应用程序中我解析它。我再次解析它,使用Car
中的格式输入新phpmyadmin
的日期(就像您在AsyncTask
中看到的那样)。
我知道所有信息都来自AsyncTask
,因为我使用了Logs
检查了所有信息,但当它到达HttpPost
时没有任何反应。
可能是什么问题?
P.S:我知道使用XAMPP
与数据库的连接是正确的,因为我制作了GET
方法并且它正常运行。
提前致谢!
答案 0 :(得分:1)
问题在于我在ID's
和AsyncTask
方法中使用了不同的POST
。
例如,当我尝试使用我的POST
方法检索来自AsyncTask
的信息:
$idCar = $app->request->post("idCar");
$name = $app->request->post("name");
$dateCar = $app->request->post("dateCar");
我使用的是ID's
:idCar
,name
和dateCar
。
但是当我尝试将信息发送到POST
上的AsyncTask
方法时:
BasicNameValuePair idCarValuePair = new BasicNameValuePair("id", newCar.getIdCar());
BasicNameValuePair nameValuePair = new BasicNameValuePair("name", newCar.getName());
BasicNameValuePair dateValuePair = new BasicNameValuePair("date", newCar.getDateBuyCar());
我使用的是ID's
:id
,name
和date
。
因此,POST
方法无法从AsyncTask
检索信息,因为我在那里使用的ID's
对POST
方法有不同的尊重。
要解决此问题,我必须从ID's
上发送的信息中更改AsyncTask
。代码如下:
BasicNameValuePair idCarValuePair = new BasicNameValuePair("idCar", newCar.getIdCar());
BasicNameValuePair nameValuePair = new BasicNameValuePair("name", newCar.getName());
BasicNameValuePair dateValuePair = new BasicNameValuePair("dateCar", newCar.getDateBuyCar());