当前位置: 首页 > 知识库问答 >
问题:

通过现场改造传递参数

张和颂
2023-03-14

我正在学习一门改造课程,在这门课程中,我创建了一个带有api的小型后端,其中我有一个POST方法来执行教师登录。在课程中,他所做的是创建一名教师,并使用set方法向他传递电子邮件和密码,这是该方法在API中接收的内容。

我希望这样做,在电话改造中,您可以直接通过此电子邮件和密码,我已通过以下方式完成:

public class LoginActivity extends AppCompatActivity {

    private EditText etPasswordLogin, etEmailLogin;
    private Button btLogin;
    private TextView tvSignUp;

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

        setupView();
    }

    private void setupView() {

        etPasswordLogin = findViewById(R.id.loginEditTextPassword);
        etEmailLogin = findViewById(R.id.loginEditTextEmail);
        btLogin = findViewById(R.id.buttonSignUp);
        tvSignUp = findViewById(R.id.textViewSignUp);

        btLogin.setOnClickListener(v -> userSignUp());
        tvSignUp.setOnClickListener(v -> startActivity(new Intent(getApplicationContext(), SignUpActivity.class)));
    }

    private void userSignUp() {

        String email = etEmailLogin.getText().toString().trim();
        String password = etPasswordLogin.getText().toString().trim();

        if (email.isEmpty()) {

            etEmailLogin.setError(getResources().getString(R.string.email_error));
            etEmailLogin.requestFocus();
            return;
        }

        if (!Patterns.EMAIL_ADDRESS.matcher(email).matches()) {

            etEmailLogin.setError(getResources().getString(R.string.email_doesnt_match));
            etEmailLogin.requestFocus();
            return;
        }

        if (password.isEmpty()) {

            etPasswordLogin.setError(getResources().getString(R.string.password_error));
            etPasswordLogin.requestFocus();
            return;
        }

        if (password.length() < 4) {

            etPasswordLogin.setError(getResources().getString(R.string.password_error_less_than));
            etPasswordLogin.requestFocus();
            return;
        }

        login(email, password);
    }

    private void login(String email, String password) {

        String BASE_URL = "http://10.0.2.2:8040";

        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build();

        WebServiceApi api = retrofit.create(WebServiceApi.class);
        Call<List<Profesor>> call = api.login(email, password);

        call.enqueue(new Callback<List<Profesor>>() {
            @Override
            public void onResponse(Call<List<Profesor>> call, Response<List<Profesor>> response) {
                if (response.code() == 200) {
                    Log.d("TAG1", "Profesor logeado");
                } else if (response.code() == 404) {
                    Log.d("TAG1", "Profesor no existe");
                } else {
                    Log.d("TAG1", "Error desconocido");
                }
            }

            @Override
            public void onFailure(Call<List<Profesor>> call, Throwable t) {
                Log.d("TAG Error: ", Objects.requireNonNull(t.getMessage()));
            }
        });

    }
}

这就是我的模范老师:

public class Profesor {

    @SerializedName("id")
    private Long id;
    @SerializedName("nombre")
    private String nombre;
    @SerializedName("email")
    private String email;
    @SerializedName("password")
    private String password;
    @SerializedName("foto")
    private String photo;

    public Profesor(){}

    public Profesor(Long id, String nombre, String email, String photo) {
        this.id = id;
        this.nombre = nombre;
        this.email = email;
        this.photo = photo;
    }

    public Profesor(String email, String password){
        this.email = email;
        this.password = password;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getPhoto() {
        return photo;
    }

    public void setPhoto(String photo) {
        this.photo = photo;
    }
}

最后,我呼吁进行以下改造:

@FormUrlEncoded
@POST("api/login")
Call<List<Profesor>> login(@Field("email") String email, @Field("password") String password);

然而,当我运行应用程序并通过表单传递电子邮件和密码时,在日志中我返回“Error desconocido”,然而在postman中,我给出的答案没有问题:

知道我做错了什么吗?

共有1个答案

贺正祥
2023-03-14

您的邮递员请求不是URL编码的表单,而是原始表单。您需要将json作为请求而不是字段发送。所以要解决这个问题,您可以更改API,处理表单URL编码的请求,或者以这种方式更改Android代码。

public class LoginCredentials {
    @SerializedName("email")
    private String email;
    @SerializedName("password")
    private String password;

    public LoginCredentials(String email, String password) {
        this.email = email;
        this.password = password;
    }
}

并改变这一点

@FormUrlEncoded
@POST("api/login")
Call<List<Profesor>> login(@Field("email") String email, @Field("password") String password);

对此

@POST("api/login")
Call<List<Profesor>> login(@Body LoginCredentials credentials);

希望这能有所帮助。

 类似资料:
  • 问题内容: 我正在使用PhantomJS page.evaluate()进行抓取。我的问题是我传递到Webkit页面的代码是沙盒化的,因此无法访问我的主要幻象脚本的变量。这使得很难使抓取代码通用。 如何将参数推入页面? 问题答案: 我遇到了确切的问题。可以使用一些技巧,因为它也可以接受字符串。 有几种方法可以执行此操作,但是我使用了一个称为的包装器,该包装器接受其他参数以传递给必须在Webkit端

  • 问题内容: 我使用JavaScript来执行JNLP,最终将执行我的客户端。 我试图通过JavaScript执行将参数传递给JNLP,并在客户端中通过JNLP传递这些参数。 JavaScript正在执行以下URL,例如: 现在,我的JNLP将尝试以这种方式获取参数: 但这没有用。 我无法以这种方式在客户端代码中检索这些参数: JNLP位于APACHE2.2中 知道有什么问题吗? 问题答案: 为了能

  • 问题内容: 我正在尝试使用杰克逊对物体进行去电 我有这个例外: 我知道这正在发生,因为这是我的构造函数: 因此,我的构造函数接收到HttpResponse参数,但我没有传递它,但我不知道该怎么做。我不能用一个空的构造函数过度计费,因为我需要以这种方式接收HttpResponse对象。当我调用readValue()方法时,有什么方法可以传递此构造函数参数?或者在这种情况下最好的选择是什么?我感谢您的

  • 问题内容: 没有参数 带参数 我想得到。我怎么才能得到它? 问题答案: 试试这个: 并在您的职能:

  • 问题内容: 这是我的Java代码: 我这样称呼它: 问题是呼叫保持发布零零零,似乎我没有正确传递x和y。 更新资料 回答之后,我将请求更改为: 服务是: 但我仍然有同样的问题。这是服务器的响应: 您可以在末尾看到零:( 问题答案: (请注意,不是)是表单数据()向其发送了请求的正文,其中您的资源方法应更像 并且以下请求将起作用 注意: 在Windows中,必须使用双引号() 您甚至可以分离键值对

  • 问题内容: 我使用window.open方法打开了带有参数的新站点,我必须通过post方法来传递它。我找到了解决方案,但不幸的是它不起作用。这是我的代码: 接下来,我创建数组: 并通过以下方式调用函数: 但是,当我单击此按钮时,站点test.asp为空(当然,我尝试获取传递值- )。 我怎么解决这个问题,为什么我不能获得通过值? 问题答案: 无需将表单写入新窗口(要用HTML代码中的值进行编码就很