请求在Android中进行改造

发布于 2025-02-13 07:38:51 字数 3097 浏览 0 评论 0原文

我想在我的应用中使用请求帖子。 我使用了这个,但我有问题。 当我想创建一个帐户时,我会面临这个问题。

状态代码403

您可以看到我的代码:

api.kt

interface Api {
@Headers("Content-Type: application/x-www-form-urlencoded")
@POST("users/signup")
@FormUrlEncoded
fun createUser(
    @Field("first_name") fName: String,
    @Field("last_name") lName: String,
    @Field("email") email: String,
    @Field("username") username: String,
    @Field("password") password: String,
) : Call<UserResponse>
}

userresponse.kt

data class UserResponse(
val email: String,
val first_name: String,
val password: String,
val last_name: String,
val username: String
)

Inbupactivity.kt

binding.btnSignUp
        .setOnClickListener {

            val username = binding.etUsername.text.toString().trim()
            val password = binding.etPw.text.toString().trim()
            val fName = binding.etFName.text.toString().trim()
            val lName = binding.etLName.text.toString().trim()
            val email = binding.etEmail.text.toString().trim()

            if (username.isEmpty()) {
                binding.etUsername.error = "Password required"
                binding.etUsername.requestFocus()
                return@setOnClickListener
            }

            if (password.isEmpty()) {
                binding.etPw.error = "Password required"
                binding.etPw.requestFocus()
                return@setOnClickListener
            }

            val logging = HttpLoggingInterceptor()
            logging.level = HttpLoggingInterceptor.Level.BODY

            val httpClient = OkHttpClient.Builder()

            httpClient.addInterceptor(logging)
            val instance: Api by lazy {

                val retrofit: Retrofit = Retrofit.Builder()
                    .baseUrl(BASE_URL)
                    .addConverterFactory(GsonConverterFactory.create())
                    .client(httpClient.build())
                    .build()
                retrofit.create(Api::class.java)
            }
            instance.createUser(fName, lName, email, username, password)
                .enqueue(object : Callback<UserResponse> {
                    override fun onFailure(call: Call<UserResponse>, t: Throwable) {
                        Toast.makeText(applicationContext, t.message, Toast.LENGTH_LONG).show()
                    }

                    override fun onResponse(
                        call: Call<UserResponse>,
                        response: Response<UserResponse>
                    ) {
                        Toast.makeText(applicationContext, response.code(), Toast.LENGTH_LONG)
                            .show()
                    }
                })

        }

我在Postman上使用此请求,并且效果很好

在这里输入图像描述

但是在Android Studio中它不起作用 我有这个错误 在这里输入图像描述

我希望你能帮助我

I want use request post in my app.
I used this but I have a problem.
I face this problem when I want to create an account.

status code 403

You can see my code:

Api.kt

interface Api {
@Headers("Content-Type: application/x-www-form-urlencoded")
@POST("users/signup")
@FormUrlEncoded
fun createUser(
    @Field("first_name") fName: String,
    @Field("last_name") lName: String,
    @Field("email") email: String,
    @Field("username") username: String,
    @Field("password") password: String,
) : Call<UserResponse>
}

UserResponse.kt

data class UserResponse(
val email: String,
val first_name: String,
val password: String,
val last_name: String,
val username: String
)

SignUpActivity.kt

binding.btnSignUp
        .setOnClickListener {

            val username = binding.etUsername.text.toString().trim()
            val password = binding.etPw.text.toString().trim()
            val fName = binding.etFName.text.toString().trim()
            val lName = binding.etLName.text.toString().trim()
            val email = binding.etEmail.text.toString().trim()

            if (username.isEmpty()) {
                binding.etUsername.error = "Password required"
                binding.etUsername.requestFocus()
                return@setOnClickListener
            }

            if (password.isEmpty()) {
                binding.etPw.error = "Password required"
                binding.etPw.requestFocus()
                return@setOnClickListener
            }

            val logging = HttpLoggingInterceptor()
            logging.level = HttpLoggingInterceptor.Level.BODY

            val httpClient = OkHttpClient.Builder()

            httpClient.addInterceptor(logging)
            val instance: Api by lazy {

                val retrofit: Retrofit = Retrofit.Builder()
                    .baseUrl(BASE_URL)
                    .addConverterFactory(GsonConverterFactory.create())
                    .client(httpClient.build())
                    .build()
                retrofit.create(Api::class.java)
            }
            instance.createUser(fName, lName, email, username, password)
                .enqueue(object : Callback<UserResponse> {
                    override fun onFailure(call: Call<UserResponse>, t: Throwable) {
                        Toast.makeText(applicationContext, t.message, Toast.LENGTH_LONG).show()
                    }

                    override fun onResponse(
                        call: Call<UserResponse>,
                        response: Response<UserResponse>
                    ) {
                        Toast.makeText(applicationContext, response.code(), Toast.LENGTH_LONG)
                            .show()
                    }
                })

        }

I use this request on postman and it works good

enter image description here

but in android studio it didn't work
and I have this error
enter image description here

I hope u can help me

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

逆蝶 2025-02-20 07:38:51

这是一些修改,您可以进行:

步骤:1在androidMenifest.xml文件步骤中添加

<uses-permission android:name="android.permission.INTERNET"/>

权限

public class UserResponse {

    @SerializedName("id")
    @Expose
    private Integer id;
    @SerializedName("first_name")
    @Expose
    private String firstName;
    @SerializedName("last_name")
    @Expose
    private String lastName;
    @SerializedName("email")
    @Expose
    private String email;
    @SerializedName("username")
    @Expose
    private String username;
    @SerializedName("groups")
    @Expose
    private List<Object> groups = null;
    @SerializedName("permissions")
    @Expose
    private List<Object> permissions = null;

    public Integer getId() {
        return id;
    }

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

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getEmail() {
        return email;
    }

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

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public List<Object> getGroups() {
        return groups;
    }

    public void setGroups(List<Object> groups) {
        this.groups = groups;
    }

    public List<Object> getPermissions() {
        return permissions;
    }

    public void setPermissions(List<Object> permissions) {
        this.permissions = permissions;
    }

}

。将此方法添加到您的活动中,并在您的ongreate()或适当的位置中调用方法apicall()

private fun getClient(): Retrofit? {
        val interceptor = HttpLoggingInterceptor()
        interceptor.setLevel(HttpLoggingInterceptor.Level.BODY)
        val client: OkHttpClient = OkHttpClient.Builder()
            .addInterceptor(interceptor)
            .retryOnConnectionFailure(true)
            .build()
        return Retrofit.Builder()
            .baseUrl("http://194.62.43.26:1337/api/")
            .addConverterFactory(GsonConverterFactory.create())
            .client(client)
            .build()
    }

    private fun apiCall() {

        val firstname = "123"
        val lastname = "234"
        val email = "[email protected]"
        val username = "132456"
        val pw = "12345678"

        val call = getClient()!!.create(Api::class.java).createUser(
            firstname,
            lastname,
            email,
            username,
            pw
        )

        call.enqueue(object : Callback<UserResponse> {
            override fun onResponse(call: Call<UserResponse>, response: Response<UserResponse>) {
                Toast.makeText(this@MainActivity, response.code().toString()
                        + " " + response.body().toString(), Toast.LENGTH_SHORT).show()
            }

            override fun onFailure(call: Call<UserResponse>, t: Throwable) {
                Toast.makeText(this@MainActivity, t.localizedMessage!!.toString(),
                    Toast.LENGTH_SHORT).show()
            }
        })
    }

步骤:4响应在屏幕截图中 ”屏幕截图

快乐编码:-)

Here are the some modification, you can make :

step: 1 Add this permission in your AndroidMenifest.xml file

<uses-permission android:name="android.permission.INTERNET"/>

step: 2

UserResponse.java

public class UserResponse {

    @SerializedName("id")
    @Expose
    private Integer id;
    @SerializedName("first_name")
    @Expose
    private String firstName;
    @SerializedName("last_name")
    @Expose
    private String lastName;
    @SerializedName("email")
    @Expose
    private String email;
    @SerializedName("username")
    @Expose
    private String username;
    @SerializedName("groups")
    @Expose
    private List<Object> groups = null;
    @SerializedName("permissions")
    @Expose
    private List<Object> permissions = null;

    public Integer getId() {
        return id;
    }

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

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getEmail() {
        return email;
    }

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

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public List<Object> getGroups() {
        return groups;
    }

    public void setGroups(List<Object> groups) {
        this.groups = groups;
    }

    public List<Object> getPermissions() {
        return permissions;
    }

    public void setPermissions(List<Object> permissions) {
        this.permissions = permissions;
    }

}

Step: 3 -> Add this methods to your activity and call method apiCall() in your onCreate() or appropriate place.

private fun getClient(): Retrofit? {
        val interceptor = HttpLoggingInterceptor()
        interceptor.setLevel(HttpLoggingInterceptor.Level.BODY)
        val client: OkHttpClient = OkHttpClient.Builder()
            .addInterceptor(interceptor)
            .retryOnConnectionFailure(true)
            .build()
        return Retrofit.Builder()
            .baseUrl("http://194.62.43.26:1337/api/")
            .addConverterFactory(GsonConverterFactory.create())
            .client(client)
            .build()
    }

    private fun apiCall() {

        val firstname = "123"
        val lastname = "234"
        val email = "[email protected]"
        val username = "132456"
        val pw = "12345678"

        val call = getClient()!!.create(Api::class.java).createUser(
            firstname,
            lastname,
            email,
            username,
            pw
        )

        call.enqueue(object : Callback<UserResponse> {
            override fun onResponse(call: Call<UserResponse>, response: Response<UserResponse>) {
                Toast.makeText(this@MainActivity, response.code().toString()
                        + " " + response.body().toString(), Toast.LENGTH_SHORT).show()
            }

            override fun onFailure(call: Call<UserResponse>, t: Throwable) {
                Toast.makeText(this@MainActivity, t.localizedMessage!!.toString(),
                    Toast.LENGTH_SHORT).show()
            }
        })
    }

Step: 4 Response is in the screen shot screen shot - response

Happy Coding :-)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文