при импорте моей БД с сервера на локальный сервер на моем ПК с использованием XAMPP, затем я пытаюсь извлечь данные из БД с помощью JSON Api и Retrofit. Я обнаружил, что ошибка
java.lang.IllegalStateException: Ожидаемый BEGIN_OBJECT, но в строке 1 путь 1 столбца 1 $
был STRING, я помещаю файлы Api.php и DB.php в файл C: \ xampp \ htdocs \ и заполняю детали БД из PHPMyAdminСервер БД после того, как я импортирую его в PHPMyAdmin, так что я думаю, что все в порядке.Я думаю, что ошибка в Api.php и Моем приложении. Это просто страница входа в MainActivity.java.
Api.php
<?php
include 'DB.php';
$db = DB::getInstance();
header("Content-Type: application/json;charset=utf-8");
function UserLoginMethod($username , $password , $lat, $long){
global $db;
$sql = "SELECT * FROM users WHERE user_email = ? AND user_password = ?
LIMIT 1";
$user_info = $db->query($sql, [$username, $password]);
CheckIsEmpty($user_info);
//echo $db->getSQL();
echo PrintJSON($user_info[0]);
}
switch (@$_GET['function']) {
case "Login":
UserLoginMethod(@$_GET['user_email'], @$_GET['user_password'], $_GET['user_location_latitude'], $_GET['user_location_longitude']);
break;
}
function CheckIsEmpty($query) {
if (is_null($query)||empty($query)){
die (json_encode(array('error' => 'no items funded.'),JSON_FORCE_OBJECT));
}
}
function PrintJSON($q){
$j = json_encode($q);
if (count($j) > 0 && !is_null($q) )
return $j;
else
die (json_encode(array('error' => 'no items funded.'),JSON_FORCE_OBJECT));
}
function CreateDieError($body){
die (json_encode(array("error" => $body),JSON_FORCE_OBJECT));
}
?>
ApiClient.java Для подключения к серверу
public class ApiClient {
public static final String BASE_URL = "http://192.168.1.38/";
public static final String PATH_URL = "/file/";//Path For Api
static Gson gson = new GsonBuilder()
.setLenient()
.create();
private static Retrofit retrofit = null;
public static Retrofit getClient() {
if (retrofit==null){
retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create(gson))
.build();
}
return retrofit;
}
}
ApiInterface.java
public interface ApiInterface {
@Headers("Content-type: application/json")
@GET(ApiClient.PATH_URL+"Api.php")
Call<UserAccount> Login(@Query("function") String function, @Query("user_email") String email, @Query("user_password") String password,
@Query("user_location_latitude") Double Latitude,
@Query("user_location_longitude") Double Longitude);
}
MainActivity.java
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
final Button loginBtn = findViewById(R.id.loginBtn);
TextView signupTxt = findViewById(R.id.txtSignup);
TextView forgetPassTxt = findViewById(R.id.txtForgetPassword);
loginBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ApiInterface apiInterface = ApiClient.getClient().create(ApiInterface.class);
EditText emailEditeText = findViewById(R.id.edtEmail);
EditText passEditeText = findViewById(R.id.edtPassword);
UserLogin(apiInterface, emailEditeText, passEditeText);
}
});
private void UserLogin(ApiInterface apiInterface, EditText emailEditeText,
EditText passEditeText){
Call<UserAccount> call = apiInterface.Login("Login", emailEditeText.getText().toString(), Utility.md5(passEditeText.getText().toString()), Utility.myLocation.getLatitude(), Utility.myLocation.getLongitude());
//make a call to server
call.enqueue(new Callback<UserAccount>() {
@Override
public void onResponse(Call<UserAccount> call, Response<UserAccount> response) {
String errorBody = response.errorBody().toString();
Log.d("Message", "code..."+response.code() + " message..." + response.message()+" body..."+errorBody);
boolean check = response.isSuccessful();
Log.i("log12", String.valueOf(check));
String val = response.body().getError();
Log.i("log1",val);
if (val == null) {
prefManager.setLogin(true, response.body());
Toast.makeText(LoginActivity.this, " Login success" + response.body().getUsername(), Toast.LENGTH_SHORT).show();
startActivity(new Intent(LoginActivity.this, MainActivity.class));
}else {
if (response.body().getError().equals("no items funded.")){
Toast.makeText(LoginActivity.this, "check Email and Password", Toast.LENGTH_SHORT).show();
}else {
Toast.makeText(LoginActivity.this, response.body().getError(), Toast.LENGTH_SHORT).show();
Log.e("error", response.body().getError());
}
}
}
@Override
public void onFailure(Call<UserAccount> call, Throwable t) {
Toast.makeText(LoginActivity.this, "Network Error", Toast.LENGTH_SHORT).show();
Log.e("login",t.getLocalizedMessage());
}
});
}
UserAccount.java
public class UserAccount {
private int userID;
private String username;
private String user_email;
private String user_phone;
private String user_password;
private Double user_location_latitude;
private Double user_location_longitude;
private String error;
// getter and setter
}
. Любые предложения могут помочь.Большое спасибо
Решение : Проблема в Api именно при функции count (). Я изменяю ее на функцию empty (), и она работает хорошо.