java - 如何在android中使用Retrofit登录Django服务器?

标签 java android django retrofit

您好,我刚刚创建了一个界面,如下所示:

public interface UserClient {

    @POST("login")
    Call<UserInfo> login(@Body Login login);

}

用户信息类:

public class UserInfo {
private String token;

public String getToken(){
    return token;
}

public void setToken(String token){
   this.token = token;
  }
}

这里是主要代码:

Retrofit.Builder builder = new  Retrofit.Builder()         
 .baseUrl("http://amirhoseinbidar.pythonanywhere.com/")
                .addConverterFactory(GsonConverterFactory.create());

    Retrofit retrofit = builder.build();

    UserClient userClient = retrofit.create(UserClient.class);
    Login login = new Login("plantdg", "1234");

    Call<UserInfo> userCall = userClient.login(login);
    userCall.enqueue(new Callback<UserInfo>() {
        @Override
        public void onResponse(Call<UserInfo> call, Response<UserInfo> response) {
            if (response.isSuccessful()){
                Toast.makeText(Main2Activity.this, "connection successful " +
                        response.body().getToken(), Toast.LENGTH_SHORT).show();
            }else {
                textView.setText(response.raw().toString());
                //The message is : Response{protocol=http/1.1, code=500, message=Internal Server Error, url=http://amirhoseinbidar.pythonanywhere.com/login}
            }
        }

        @Override
        public void onFailure(Call<UserInfo> call, Throwable t) {
            Toast.makeText(Main2Activity.this, t.getMessage(), Toast.LENGTH_SHORT).show();
        }
    });

所以问题是响应不成功。任何人都可以提供帮助?

注意:登录类包含两个变量(用户名、密码)和一个构造函数。

最佳答案

我解决了。我将原始数据类型而不是表单数据类型发布到服务器。所以我在界面上做了一些小改动:

@Headers( "Content-Type: application/json" )
@POST("login/")
Call<UserInfo> login(@Body JsonObject login);

注意:反斜杠对我来说很重要。

我使用了一个返回 JsonObject 的方法:

private JsonObject returnRaw() {

    JsonObject gson = new JsonObject();

    try {

        JSONObject jsonObj_ = new JSONObject();
        jsonObj_.put("username", "plantdg");
        jsonObj_.put("password", "1234");
        JsonParser jsonParser = new JsonParser();
        gson = (JsonObject) jsonParser.parse(jsonObj_.toString());

    } catch (JSONException e) {
        e.printStackTrace();
    }

    return gson;
}

在主要代码中,我将 returnRaw() 作为参数传递给登录方法:

Call<UserInfo> userCall = userClient.login(returnRaw());

关于java - 如何在android中使用Retrofit登录Django服务器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54270267/

相关文章:

java - JNI - 如何填充从 C++ 传递到 Java 的字符串

java - 在 JTable 中,如何呈现带有脏标记的复选框列?

java - java(oracle db)中字符串表示形式的持续时间相减

安卓 Volley ECONNRESET

python - Django:我可以将 objects.filter() 用于通用外键吗?

python - Django查询优化: find a list of objects based on a many-to-one to a many-to-many

python - Django UncompressableFileError

java - 具有动态 localName 值的 JacksonXmlRootElement

java - 正则表达式匹配 Java 中的未转义逗号

java - 将异常抛出回调用方法