![](/img/trans.png)
[英]How to authenticate in sharepoint 2010 using username & password in Java?
[英]How to authenticate api using bearer token when passed with username and password in Android Java?
我正在使用 Retrofit 庫通過 API 向服務器發出發布請求,發送用戶名和密碼並獲得 session 令牌作為響應。 我正在使用這個令牌(在 header 作為不記名令牌)向服務器發出經緯度的 POST 以獲取數據,但該方法在 enqueue() 的 onFailure 方法中反復結束。
@POST("api/auth/login/username/{username}/password/{password}")
Call<ResponseBody> login(@Path("username")String username, @Path("password")String password);
@POST("api/products/get")
Call<ResponseBody> getData(@Header("Authorization") String authorization);Call<ResponseBody>
在 MainActivity 中:
Retrofit.Builder builder=new Retrofit.Builder()
.baseUrl("fake url")
.addConverterFactory(GsonConverterFactory.create());
Retrofit retrofit=builder.build();
DataApi companyApi=retrofit.create(DataApi.class);
private String Token="";tokenCall=comapnyApi.login("data","!fakedata");
tokenCall.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
if (response.isSuccessful()){
try {
Toast.makeText(MainActivity.this, response.body().string(), Toast.LENGTH_SHORT).show();
} catch (IOException e) {
e.printStackTrace();
}
}
else {
Toast.makeText(MainActivity.this, "Wrong Username and password", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
Toast.makeText(MainActivity.this, "Couldn't connect to Fake company Server Api", Toast.LENGTH_SHORT).show();
}
});
Call<ResponseBody> Data=companyApi.getData(Token);
Data.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
if (response.isSuccessful()){
try {
Toast.makeText(MainActivity.this, response.body().string(), Toast.LENGTH_SHORT).show();
} catch (IOException e) {
e.printStackTrace();
}
}
else {
Toast.makeText(MainActivity.this, "Api Token Expired", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
Toast.makeText(MainActivity.this, "Couldn't connect to Fake Company Server", Toast.LENGTH_SHORT).show();
}
});
我認為這是因為您在完成第一個請求之后提出了第二個請求。 enqueue 是異步的,所以當你第一次請求時,我的意思是 tokenCall.enqueue(),它的響應稍后出現,所以第二個 api 調用或 Data.enqueue() 使用 token == "" 調用。 因此,在第一個 api 調用的 onResponse 中進行第二個 api 調用。
private String Token="";
tokenCall=comapnyApi.login("data","!fakedata");
tokenCall.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
if (response.isSuccessful()){
try {
Toast.makeText(MainActivity.this, response.body().string(), Toast.LENGTH_SHORT).show();
Token = response.body().string();
Call<ResponseBody> Data=companyApi.getData(Token);
Data.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
if (response.isSuccessful()){
try {
Toast.makeText(MainActivity.this, response.body().string(), Toast.LENGTH_SHORT).show();
} catch (IOException e) {
e.printStackTrace();
}
}
else {
Toast.makeText(MainActivity.this, "Api Token Expired", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
Toast.makeText(MainActivity.this, "Couldn't connect to Fake Company Server", Toast.LENGTH_SHORT).show();
}
});
} catch (IOException e) {
e.printStackTrace();
}
}
else {
Toast.makeText(MainActivity.this, "Wrong Username and password", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
Toast.makeText(MainActivity.this, "Couldn't connect to Fake company Server Api", Toast.LENGTH_SHORT).show();
}
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.