【问题标题】:How can I get token with Retrofit2?如何使用 Retrofit2 获得令牌?
【发布时间】:2018-10-07 22:36:43
【问题描述】:

我有一个用于令牌登录的 Web 服务链接。但是在这个链接中,链接末尾没有“/”。并且 android studio 会出错,称为baseUrl must end in /。当我输入/ 时,它没有得到令牌并说token is not truth :(,因为我认为链接不正确。我使用retrofit2library。请帮我解决。

MainActivity.java

public class MainActivity extends AppCompatActivity {

  Retrofit.Builder builder = new Retrofit.Builder()
    .baseUrl("http://website.net/token")
    .addConverterFactory(GsonConverterFactory.create());

Retrofit retrofit = builder.build();
UserClient userClient = retrofit.create(UserClient.class);

 @Override
 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_login);


    Button loginButton=(Button)findViewById(R.id.btn_login);
    loginButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            login();
           /* Intent intentLogin=new Intent(MainActivity.this,MainPageActivity.class);
            startActivity(intentLogin);*/
        }
    });



}
private static String token;
private void login() {
    Login login = new Login("abcd", "1234");
    Call<User> call = userClient.login(login);

    call.enqueue(new Callback<User>() {
        @Override
        public void onResponse(Call<User> call, Response<User> response) {
            if (response.isSuccessful()){
                Toast.makeText(MainActivity.this, response.body().getToken(), Toast.LENGTH_SHORT).show();
                token = response.body().getToken();
            }
            else {
                Toast.makeText(MainActivity.this, "Token is not truth :(", Toast.LENGTH_SHORT).show();
            }
        }

        @Override
        public void onFailure(Call<User> call, Throwable t) {
            Toast.makeText(MainActivity.this, "error!", Toast.LENGTH_SHORT).show();
        }
    });
}
}

   `Login.java

     public class Login {
private String user;
private String password;

public Login(String user, String password) {
    this.user = user;
    this.password = password;
}
}

 User.java

 public class User {
private int id;
private String email;
private String token;

public int getId(){
    return id;
}

public void setId(){
    this.id = id;
}
public String getEmail(){
    return  email;
}

public void setEmail(String email){
    this.email = email;
}
public String getToken(){return token;}
public void setToken(String token){this.token = token;}
}


 UserClient.java

 import com.squareup.okhttp.ResponseBody;

 import retrofit2.Call;
 import retrofit2.http.Body;
 import retrofit2.http.GET;
 import retrofit2.http.Header;
  import retrofit2.http.POST;

 public interface UserClient {
@POST("Login")
Call<User> login(@Body Login login);

//    @GET("secretinfo")
//    Call<ResponseBody> getSecret(@Header("Authorization") String authToken);
}

【问题讨论】:

  • 改一下public interface UserClient { @POST("/Login") Call&lt;User&gt; login(@Body Login login); }
  • 它不工作。完整链接是 website.net/token。 /之后没有登录。
  • 那么,为什么要这样写@POST("Login")?下面给出的答案应该有效。除非有另一个错误,否则您还可以在您放置token is not truth toast 的其他位置记录响应错误消息:)
  • 我从视频中学习了这种方法,所以我对这个登录没有任何想法。:D 我添加了 Log.message 但它显示令牌为空。好像你说的还有一个问题。感谢您的帮助:)
  • 不用担心,您在请求类型@POST / @GET / @PUT 之后使用的字符串实际上是(该baseUrl 的)终点

标签: java android jwt retrofit2


【解决方案1】:

中使用 upto this
Retrofit.Builder builder = new Retrofit.Builder()
.baseUrl("http://website.net/")
.addConverterFactory(GsonConverterFactory.create());

在 UserClient 接口类中

public interface UserClient { 
@POST("token") Call<User> login(@Body Login login); 
}

【讨论】:

  • public interface UserClient { @POST("Login") Call login(@Body Login login); } 如何在其中添加令牌?
  • 能否贴出完整的api路径;是website.net/token/Login 还是别的什么?
  • 仅限 website.net/token。我将在问题中添加其他代码。
  • 我也编辑了答案,假设您的完整网址是“website.net/token”,它将登录作为正文参数
  • 谢谢它有效。但我仍然无法获得令牌。似乎还有另一个问题。不是来自链接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-24
  • 1970-01-01
  • 1970-01-01
  • 2018-09-01
  • 1970-01-01
  • 2020-06-13
相关资源
最近更新 更多