android - 在 Retrofit2 API 值传递问题中需要帮助
问题描述
按下登录按钮后,只有这部分 url http://127.0.0.1/AdminaService/AdminaService.svc/Verify_User_And_Password_For_login已通过,请参阅我的日志。edttxt 字段中的值未添加或传递。
[我的 api] http://127.0.0.1/AdminaService/AdminaService.svc/Verify_User_And_Password_For_login/ {PUSER_ID}/{PPASSWORD}/{PUSER_SESSION_ID}/{PIPADDRESS}/{PAPPLICATION_ID}
1,2 定义有效或无效。json 格式 { "VerifyUserAndPasswordForLoginResult": "1" }
登录
public class LoginActivity extends AppCompatActivity {
private EditText edit_user, edit_pass;
private Button btn_login;
String user_id,pass;
ApiInterface apiInterface;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
getSupportActionBar().hide();
if (!isConnected(LoginActivity.this)) buildDialog(LoginActivity.this).show();
edit_user = findViewById(R.id.editText_username);
edit_pass = findViewById(R.id.editText_password);
btn_login=findViewById(R.id.button_signIn);
apiInterface= getapiInterface();
btn_login.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
userLogin();
}
});
}
private void userLogin() {
user_id = edit_user.getText().toString().trim();
pass = edit_pass.getText().toString().trim();
if (user_id.isEmpty()) {
edit_user.setError("Id Required");
edit_user.requestFocus();
return;
}
if (pass.isEmpty()) {
edit_pass.setError("Password Required");
edit_pass.requestFocus();
return;
}
Call<LoginUser> call;
call = getapiInterface().login(user_id,pass);
Log.wtf("URL Called", call.request().url() + "");
call.enqueue(new Callback<LoginUser>() {
@Override
public void onResponse(Call<LoginUser> call,Response<LoginUser> response) {
LoginUser loginUser =response.body();
if(response.isSuccessful()){
Toast.makeText(LoginActivity.this,"Logged id",Toast.LENGTH_LONG).show();
}
}
@Override
public void onFailure(Call<LoginUser> call,Throwable t) {
Toast.makeText(LoginActivity.this,t.getMessage(),Toast.LENGTH_LONG).show();
}
});
}
@Override
public void onStart() {
super.onStart();
}
@Override
public void onStop() {
super.onStop();
}
@Override
public void onResume() {
super.onResume();
}
@Override
public void onPause() {
super.onPause();
}
// To check the internet connectivity of the handset
public boolean isConnected(Context context) {
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netinfo = cm.getActiveNetworkInfo();
if (netinfo != null && netinfo.isConnectedOrConnecting()) {
android.net.NetworkInfo wifi = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
android.net.NetworkInfo mobile = cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
return (mobile != null && mobile.isConnectedOrConnecting()) || (wifi != null && wifi.isConnectedOrConnecting());
} else
return false;
}
//To show the error dialog if there is no internet connection
public AlertDialog.Builder buildDialog(Context c) {
AlertDialog.Builder builder = new AlertDialog.Builder(c);
builder.setTitle("No Internet Connection");
builder.setMessage("You need to have Mobile Data or wifi to access this. Press ok to Exit");
builder.setPositiveButton("Ok",new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,int which) {
finish();
}
});
return builder;
}
}
界面
public interface ApiInterface {
@FormUrlEncoded
@POST("Verify_User_And_Password_For_login/")
Call<LoginUser> login(@Query("{PUSER_ID}") String user_id ,@Query("{PPASSWORD}") String pass);
}
APIUtils
public class ApiUtils {
private static final String Base_url="http://127.0.0.1/AdminaService/AdminaService.svc/";
public static ApiInterface getapiInterface(){
return RetrofitClient.getClient(Base_url).create(ApiInterface.class);
}
}
Pojo类:
public class LoginUser {
@SerializedName("VerifyUserAndPasswordForLoginResult")
@Expose
private String verifyUserAndPasswordForLoginResult;
public String getVerifyUserAndPasswordForLoginResult() {
return verifyUserAndPasswordForLoginResult;
}
public void setVerifyUserAndPasswordForLoginResult(String verifyUserAndPasswordForLoginResult) {
this.verifyUserAndPasswordForLoginResult = verifyUserAndPasswordForLoginResult;
}
}
解决方案
由于这是一个发布请求,我认为您应该使用 @Field 而不是查询或路径。您的方法声明如下所示:
@FormUrlEncoded
@POST("Verify_User_And_Password_For_login/")
Call<LoginUser> login(@Field("PUSER_ID") String user_id ,@Field("PPASSWORD") String pass);
将值作为方法调用传递。
推荐阅读
- express-gateway - 在策略中访问 req.body 的最佳方式
- android - GeoFire没有获取位置
- php - php 中的 $_POST 未读取 Ajax 发布的数据
- node.js - 在发布请求传输节点/express js期间保护客户端/服务器之间的请求有效负载的最佳实践
- chart.js - chart.js horzontalBar 堆叠和分组 - 数据未显示 - 错误?
- javascript - React 不会渲染数组的所有组件
- python - 识别python DataFrame中相等的行...
- postgresql - 创建新结构并将其以一对多关系附加到数组
- c# - AddForce 方法在被按钮调用时不起作用
- javascript - 使用javascript修改URL并在URL之间添加参数