使用post方法无法从php api获取数据

时间:2019-03-07 18:46:41

标签: android api retrofit2

我正在尝试从API那里获取数据,在该API中我必须使用post方法作为初学者,我对改造的post方法没有经验,但是从其他其他StackOverflow问题中我可以完成代码,但是当我把用户名和密码错误400,因为我无法将数据传递到服务器 这是代码

API接口:

public interface APIInterface {
@POST("http://tvsfit.mytvs.in/reporting/vrm/api/test_new/int/gettabledata.php")
Call<LoginResponse> createUser(@Body LoginResponse login);
}

APIClient:

class APIClient {

public static final String BASE_URL = "http://tvsfit.mytvs.in/reporting/vrm/api/test_new/int/gettabledata.php/";
private static Retrofit retrofit = null;

public static Retrofit getClient() {
    if (retrofit == null) {
        retrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build();
    }
    return retrofit;
}
}

getter-setter:

public class LoginResponse {


@SerializedName("username")
public String UserId;
@SerializedName("FirstName")
public String FirstName;
@SerializedName("LastName")
public String LastName;
@SerializedName("ProfilePicture")
public String ProfilePicture;
@SerializedName("Password")
public String Password;
   public LoginResponse(String UserId, String Password) {
    this.UserId = UserId;
    this.Password = Password;
}

我遇到这样的错误

`Response {protocol = http / 1.1,code = 400,message = Bad Request,url = http://tvsfit.mytvs.in/reporting/vrm/api/test_new/int/gettabledata.php}'

任何方向我在做什么错都会有帮助 { “ username”:“ test”, “密码”:“ 123456” }  我必须得到的示例输出

{"TABLE_DATA":"{\"data\":[[\"Tiger Nixon\",\"System Architect\",\"Edinburgh\",\"5421\",\"2011\/04\/25\",\"$320,800\"]...

活动方法:

 private void loginRetrofit2Api(String userId, String password) {
    final LoginResponse login = new LoginResponse(userId, password);
    Call<LoginResponse> call1 = apiInterface.createUser(login);
    call1.enqueue(new Callback<LoginResponse>() {
        @Override
        public void onResponse(Call<LoginResponse> call, Response<LoginResponse> response) {
            Log.e("Login", response.toString());


        }

        @Override
        public void onFailure(Call<LoginResponse> call, Throwable t) {
            Toast.makeText(getApplicationContext(), "onFailure called ", Toast.LENGTH_SHORT).show();
            call.cancel();
        }
    });
}

public boolean checkValidation() {
    userId = et_Email.getText().toString();
    password = et_Pass.getText().toString();
    if (et_Email.getText().toString().trim().equals("")) {
        CommonMethod.showAlert("UserId Cannot be left blank", MainActivity.this);
        return false;
    } else if (et_Pass.getText().toString().trim().equals("")) {
        CommonMethod.showAlert("password Cannot be left blank", MainActivity.this);
        return false;
    }
    return true;
}

CommonMethod类:

public  static boolean isNetworkAvailable(Context ctx) {
    ConnectivityManager connectivityManager
            = (ConnectivityManager)ctx.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
    return activeNetworkInfo != null && activeNetworkInfo.isConnected();
}

public static void showAlert(String message, Activity context) {

    final AlertDialog.Builder builder = new AlertDialog.Builder(context);
    builder.setMessage(message).setCancelable(false)
            .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {

                }
            });
    try {
        builder.show();
    } catch (Exception e) {
        e.printStackTrace();
    }

}

数据:data recieved

3 个答案:

答案 0 :(得分:1)

您在这里做错了几件事。

首先,您需要正确设置基本网址。

public static final String BASE_URL = "http://tvsfit.mytvs.in/"

现在在方法调用中相应地更改路径。您需要设置将在基本URL之后添加的路径。

public interface APIInterface {
@POST("reporting/vrm/api/test_new/int/gettabledata.php")
Call<LoginResponse> createUser(@Body LoginResponse login);
}

序列化名称区分大小写,您需要将它们与参数名称完全匹配。

@SerializedName("password")    //in sample request you are using password and not Password
public String Password;

答案 1 :(得分:0)

您应该做的是:

public interface APIInterface {
@POST("http://tvsfit.mytvs.in/reporting/vrm/api/test_new/int/gettabledata.php")
Call<LoginResponse> createUser(@String userId, @String password);
}

LoginResponse是处理响应的类。因此,尝试进行登录时,将其作为参数传递并没有多大意义。 您将看起来像:

Call<LoginResponse> call1 = apiInterface.createUser(userId, password);

我当然可能是错的,因此请仔细阅读文档以确切了解所有参数。

答案 2 :(得分:0)

您是否在 Postman 上测试了此api,它是否运行良好 当我在邮递员测试此api时。它会显示错误 400 ,并显示错误消息 {“ ErrorDescription”:“必填参数丢失”,“ Error”:400} 。这表示您没有传递以下所有参数该api调用。看到这个截图。 api error screenshot