改造邮政请求

问题描述 投票:0回答:4

我想将用户凭据发布到以下网址: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);
    }
}

公共课登录{

@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我试着寻找各种各样的例子,但我现在非常担心。

android retrofit2
4个回答
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步:代替此代码

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.");
                }
            });
        }

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;
    }

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.添加界面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");
© www.soinside.com 2019 - 2024. All rights reserved.