繁体   English   中英

使用Retrofit2无法获得POST响应

[英]Unable to get POST response using Retrofit2

我是一名新的android开发人员,我正尝试从服务器中获取响应,但尝试时只会遇到onFailure。 我遍历了一个教程,并尝试更改我的代码以使其按我希望的方式工作。 我的代码应将用户名和密码发送到我在服务器上创建的api,并获取响应。 这是我的代码:

LoginPage.java(MainActivity):

package com.example.azo.loginapp;

//Android packages
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.content.Intent;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

//Project packages
import com.example.azo.loginapp.data.model.Post;
import com.example.azo.loginapp.data.remote.APIService;
import com.example.azo.loginapp.data.remote.ApiUtils;

//Retrofit packages
import org.json.JSONException;
import org.json.JSONObject;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;

public class LoginPage extends AppCompatActivity{
    private EditText Name;
    private EditText Password;
    private TextView Info;
    private Button Login;
    private int counter = 5;

    private APIService mAPIService;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.login_page);
        mAPIService = ApiUtils.getAPIService();
        Name = findViewById(R.id.etName);
        Password = findViewById(R.id.etPass);
        Info = findViewById(R.id.tvInfo);
        Login = findViewById(R.id.btnLogin);

        Info.setText("No of attempts remaining: 5");

        Login.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                validate(Name.getText().toString(),Password.getText().toString());
            }
        });
    }

    public void sendPost(String username, String password) {
        try {
            JSONObject paramObject = new JSONObject();
            paramObject.put("username", username);
            paramObject.put("password", password);
            Call<Post> postCall = mAPIService.savePost(paramObject.toString());
            postCall.enqueue(new Callback<Post>(){
                @Override
                public void onResponse(Call<Post> call,Response<Post> response) {
                    Toast.makeText(LoginPage.this, "It worked!",Toast.LENGTH_SHORT).show();
                }

                @Override
                public void onFailure(Call<Post> call, Throwable t) {
                    Toast.makeText(LoginPage.this, "Something went wrong :(", Toast.LENGTH_SHORT).show();
                }
            });
        }catch(JSONException e){
            e.printStackTrace();
        }
    }

    private void validate(String userName, String userPass){
        if(!TextUtils.isEmpty(userName) && !TextUtils.isEmpty(userPass)){
            sendPost(userName, userPass);
        }else{
            counter--;
            Info.setText("No of atttempts remaining: " + String.valueOf(counter));
            if(counter == 0) {
                Login.setEnabled(false);
            }
        }
    }
}

APIService.java:

package com.example.azo.loginapp.data.remote;
import com.example.azo.loginapp.data.model.Post;
import retrofit2.Call;
import retrofit2.http.Body;
import retrofit2.http.Headers;
import retrofit2.http.POST;
/**
  * Created by azotherian on 11/1/17.
 */

public interface APIService {
    @Headers("Content-Type: application/json")
    @POST("login")
    Call<Post> savePost(@Body String body);
}

Post.java:

package com.example.azo.loginapp.data.model;
/**
 * Created by azotherian on 11/1/17.
*/
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

public class Post {
    @SerializedName("username")
    @Expose
    private String username;

    @SerializedName("password")
    @Expose
    private String password;

    public String getUsername(){
        return username;
    }

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

    public String getPassword(){
        return password;
    }

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

    @Override
    public String toString(){
        return "Post{" +
            "username='" + username + '\'' +
            ", password='" + password + '\'' +
            '}';
    }
}

RetrofitClient.java:

package com.example.azo.loginapp.data.remote;

import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

/**
 * Created by azotherian on 11/1/17.
 */

public class RetrofitClient {
    private static Retrofit retrofit = null;

    public static Retrofit getClient(String baseUrl) {
        if (retrofit==null) {
            retrofit = new Retrofit.Builder()
                .baseUrl(baseUrl)
                .addConverterFactory(GsonConverterFactory.create())
                .build();
        }
        return retrofit;
    }
}

ApiUtils.java:

package com.example.azo.loginapp.data.remote;

/**
 * Created by azotherian on 11/1/17.
 */

public class ApiUtils {
    private ApiUtils() {}

    public static final String BASE_URL = "http://107.170.239.46/";

    public static APIService getAPIService() {
        return RetrofitClient.getClient(BASE_URL).create(APIService.class);
    }
}

如果需要更多信息,请告诉我! 感谢您的时间!

经过一些研究和调试(由于使用了@AnkurKhandelwal和@JuanCruzSoler),我发现我的代码正在等待gson解码的响应。 由于我没有将任何东西从服务器传递回体内,因此我不得不将Call更改为使用void。 这段代码位于LoginPage.java内部:

Call<Void> voidCall = mAPIService.savePost(paramObject.toString());
voidCall.enqueue(new Callback<Void>(){
    @Override
    public void onResponse(Call<Void> call, Response<Void> response) {
        Toast.makeText(LoginPage.this, "It worked!", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onFailure(Call<Void> call, Throwable t) {
        Toast.makeText(LoginPage.this, "Something went wrong :(", Toast.LENGTH_SHORT).show();
        }
    });

我将<T>内的所有Post更改为Void。 谢谢您的帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM