Получить информацию о базе данных Mysql из приложения для Android, используя Retrofit, PHP, JSON и WAMP

PHP файл хранится в www каталоге WAMP

<?php
//Response array JSON
$response = array();

//Connexion to the db local in WAMP
include("connexion_db.php");
$idcom = connexobject("database_app_android","myparam");

$sql = "SELECT * FROM products";

$result = $idcom->query($sql);

if(!$result)
{
//Cannot read
$response["success"] = 0;
$response["mesage"] = "SQL query has timed out";
}
else
{
if($result->num_rows > 0)
{
//Products founds
$response["products"] = array();

while($row = $result->fecth_object())
{
$product = array();
foreach ($row as $key => $value)
{
$product[$key] = $value;
}

//Add product to the response JSON array
array_push($response["products"], $product);
}

$response["success"] = 1;
}
else
{
//0 product found
$response["success"] = 0;
$response["mesage"] = "No products found";
}
}

//Encode and send response in JSON format
echo(json_encode($response));

$response->free();
$result->free();
$idcom->close();
?>

Android API

public interface CatalogAPI {
@GET("/products")
Call<List<Product>> getProductList();

@GET("/products/{product}")
Call<Product> getProduct(@Path("product") int productId);
}

Android-часть с использованием модернизации

//Retrofit
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://10.0.2.2:3000/MyAndroidApp/get_all_product.php")
.addConverterFactory(GsonConverterFactory.create())
.build();
CatalogAPI service = retrofit.create(CatalogAPI.class);
service.getProductList().enqueue(new Callback<List<Product>>() {
@Override
public void onResponse(Call<List<Product>> call, Response<List<Product>> response) {
Log.i("retrofit","DOWNLOAD OK");
for (Product p : response.body())
{
Log.i("retrofit","Product : " + p.getName());
catalog.add(p);
}
}

@Override
public void onFailure(Call<List<Product>> call, Throwable t) {

}
});

Пожалуйста, почему это не работает? Я использую эмулятор студии Android. Скрипт php кодирует в json все найденные продукты в базе данных mysql. База данных MySQL находится на локальном сервере

0

Решение

Пожалуйста, добавьте перехватчик регистрации к вашему клиенту дооснащения, это поможет найти, где проблема.

Gradle Change

compile 'com.squareup.okhttp3:logging-interceptor:3.3.1'

Изменение кода

HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
// set your desired log level
logging.setLevel(Level.BODY);

OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
// add your other interceptors …

// add logging as last interceptor
httpClient.addInterceptor(logging);  // <-- this is the important line!

Retrofit retrofit = new Retrofit.Builder()
.baseUrl(API_BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.client(httpClient.build())
.build();
0

Другие решения

В php файл напишите

while($row = $result->**fetch**_object())

вместо

while($row = $result->**fecth**_object())
0

Добрый день, я знаю, что это поздно, но проблема, похоже, заключается в том, как PHP кодирует в массив json.
PHP добавляет дополнительные функции, такие как «\ n \ r» и другие, для кодирования в массив json, что полностью отличается от того, что ожидает Retrofit 2.
Retrofit 2 ожидает что-то вроде:

[
{ "name": "John Doe", "address": "60, station road", "mobile": "1" },
{ "name": "Doe Chujwu", "address": "6, Morgan Estate", "mobile": "2" }
].

Следовательно, измените ваш вывод, чтобы повторить приведенный выше формат, и тогда ваш код будет работать.
Я надеюсь, что это помогает.
Примечание: также проверьте, что вы можете получить доступ к домашней странице вашего сервера в браузере эмуляторов. (Это делается для того, чтобы вы использовали правильный IP-адрес для подключения).

0
По вопросам рекламы [email protected]