改造邮政请求

时间:2017-10-28 10:13:02

标签: android retrofit2

我想将用户凭据发布到以下网址 :http://myurl/authenticate

参数:登录。类型(JSON) 用户名:字符串 密码:字符串

"login":{"username": "JohnDoe","password": "eoDnhoJ" }

如果成功

{
" r e s u l t " : " S u c c e s s " ,
"response": "Users Session ID"
}

这是我的代码

public interface APIService {

    @POST("/authenticate")
    @FormUrlEncoded
    Call<Login> savePost(@Field("username") String username,
                         @Field("password") String password);
}

public class ApiUtils {

    private ApiUtils() {}

    public static final String BASE_URL = "http://myurl/";

    public static APIService getAPIService() {

        return RetrofitClient.getClient(BASE_URL).create(APIService.class);
    }
}

public class Login {

@SerializedName("username")
@Expose
private String username;
@SerializedName("password")
@Expose
private String password;
//getters and setters
}

public class RetrofitClient {
    private static Retrofit retrofit = null;

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

public class LoginActivity extends AppCompatActivity {

    private EditText usernameEditText,passwordEditText;
    private Button button;
    private APIService mAPIService;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        usernameEditText=(EditText)findViewById(R.id.username);
        passwordEditText=(EditText)findViewById(R.id.password);
        button=(Button)findViewById(R.id.signup);

        mAPIService = ApiUtils.getAPIService();


        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String uname=usernameEditText.getText().toString();
                String pass=passwordEditText.getText().toString();
                if(TextUtils.isEmpty(uname)){
                    Toast.makeText(LoginActivity.this, "Username cannot be empty", Toast.LENGTH_SHORT).show();
                    return;
                }

                if(TextUtils.isEmpty(pass)){
                    Toast.makeText(LoginActivity.this, "Password cannot be empty", Toast.LENGTH_SHORT).show();
                    return;
                }

                if(pass.length()<4){
                    Toast.makeText(LoginActivity.this, "Password should be greater than four characters", Toast.LENGTH_SHORT).show();
                    return;
                }

                sendPost(uname, new StringBuilder(uname).reverse().toString());

            }
        });
    }


    public void sendPost(String username, String password) {
        mAPIService.savePost(username, password).enqueue(new Callback<Login>() {
            @Override
            public void onResponse(Call<Login> call, Response<Login> response) {

                if(response.isSuccessful()) {
                    showResponse(response.body().toString());
                    Log.i("Pritish", "post submitted to API." + response.body().toString());
                    Intent intent=new Intent(getApplicationContext(), MainActivity.class);
                    startActivity(intent);
                    finish();
                }
            }

            @Override
            public void onFailure(Call<Login> call, Throwable t) {
                Log.e("Pritish", "Unable to submit post to API.");
            }
        });
    }

    public void showResponse(String response) {
        Log.i("Abbu",response);
    }
}

每当我提交用户名和密码我得到空值时,有人可以帮助我吗?我怎么能得到sessionId.I我试着寻找各种各样的例子,但我现在非常担心。

4 个答案:

答案 0 :(得分:1)

而不是跟随代码

@POST("/authenticate")
@FormUrlEncoded
Call<Login> savePost(@Field("username") String username,
                     @Field("password") String password);

使用此代码

@POST("/authenticate")
Call<Login> savePost(@Query("username") String username,
                     @Query("password") String password);

答案 1 :(得分:1)

第1步:代替此代码

public interface APIService {

    @POST("/authenticate")
    @FormUrlEncoded
    Call<Login> savePost(@Field("username") String username,
                         @Field("password") String password);
}

使用此代码:

public interface APIService {

    @POST("/authenticate")
    Call<Login> savePost(@Body RequestBody body);
}

第2步:代替LoginActivity中的此代码

public void sendPost(String username, String password) {
        mAPIService.savePost(username, password).enqueue(new Callback<Login>() {
            @Override
            public void onResponse(Call<Login> call, Response<Login> response) {

                if(response.isSuccessful()) {
                    showResponse(response.body().toString());
                    Log.i("Pritish", "post submitted to API." + response.body().toString());
                    Intent intent=new Intent(getApplicationContext(), MainActivity.class);
                    startActivity(intent);
                    finish();
                }
            }

            @Override
            public void onFailure(Call<Login> call, Throwable t) {
                Log.e("Pritish", "Unable to submit post to API.");
            }
        });
    }

更改为以下代码:

public void sendPost(String username, String password) {


        HashMap<String, String> params = new HashMap<>();
        params.put("username", username);
        params.put("password", password);      
        String strRequestBody = new Gson().toJson(params);

    //create requestbody
        final RequestBody requestBody = RequestBody.create(MediaType.
                parse("application/json"),strRequestBody);

            mAPIService.savePost(requestBody).enqueue(new Callback<Login>() {
                @Override
                public void onResponse(Call<Login> call, Response<Login> response) {

                    if(response.isSuccessful()) {
                        showResponse(response.body().toString());
                        Log.i("Pritish", "post submitted to API." + response.body().toString());
                        Intent intent=new Intent(getApplicationContext(), MainActivity.class);
                        startActivity(intent);
                        finish();
                    }
                }

                @Override
                public void onFailure(Call<Login> call, Throwable t) {
                    Log.e("Pritish", "Unable to submit post to API.");
                }
            });
        }

答案 2 :(得分:0)

按照

替换您的登录类
 @SerializedName("result")
    @Expose
    private String rESULT;
    @SerializedName("response")
    @Expose
    private String response;

    public String getRESULT() {
        return rESULT;
    }

    public void setRESULT(String rESULT) {
        this.rESULT = rESULT;
    }

    public String getResponse() {
        return response;
    }

    public void setResponse(String response) {
        this.response = response;
    }

答案 3 :(得分:0)

  1. 添加ServiceGenerator类:

    public class ServiceGenerator {
    
    private static OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
    
    private static Retrofit.Builder builder =
            new Retrofit.Builder()
                    .baseUrl(BASEURL)
                    .addConverterFactory(ScalarsConverterFactory.create());
    
    public static <S> S createService(Class<S> serviceClass) {
        Retrofit retrofit = builder.client(httpClient.build()).build();
        return retrofit.create(serviceClass);
    }
    public static Retrofit getRetrofit()
    {
        return builder.client(httpClient.build()).build();
    }
    

    }

  2. 2.添加界面RetrofitAPI:

     public interface RetrofitApi {
                @POST("/api/v1/user")
                Call<ResponseBody> login(@Body RequestBody loginBody);
        }
    

    3.在经理类中添加登录方法:

    public void retrofitLogin(JSONObject login, final String tag) {
            RetrofitApi service = ServiceGenerator.createService(RetrofitApi.class);
            Call<ResponseBody> result = service.login(convertJsonToRequestBody(login));
            result.enqueue(new Callback<ResponseBody>() {
                @Override
                public void onResponse(Call<ResponseBody> call, retrofit2.Response<ResponseBody> response) {
                    retrofitCheckResponse(response, tag);
                }
                @Override
                public void onFailure(Call<ResponseBody> call, Throwable t) {
                    if (t instanceof IOException) {
                        Log.e("retrofit error", "retrofit error");
                        sendErrorRetrofit(mContext.getString(R.string.ERROR), 500, tag);
                    }
                }
            });
        }
    

    将JSONObject转换为RequestBody的方法:

     private RequestBody convertJsonToRequestBody(JSONObject jsonObject) {
                if (jsonObject != null) {
    
                    return RequestBody.create(okhttp3.MediaType.parse("application/json; charset=utf-8"), jsonObject.toString());
                } else {
                    return null;
                }
            }
    

    4.现在请调用您的retrofitLogin方法:

    JSONObject mLoginParams = new JSONObject();
    JSONObject mLoginObj = new JSONObject();
    mLoginParams.put("username", uname);   
    mLoginParams.put("password", pass);
    mLoginObj.put("appType","mobile");
    mLoginObj.put("user", mLoginParams);
    volleyRequest.retrofitLogin(mLoginObj, "Login");