如何在Retrofit 2(Android)

时间:2017-11-27 13:20:26

标签: java android post retrofit2

方法call.enqueue()没有调用。我放弃了解为什么?请帮忙。

我使用Retrofit2进行POST请求。这是我简单的项目示例。

我有名为 FaceAPI 类的API服务。代码:

package com.facelocation.testretrofit;

import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.http.Body;
import retrofit2.http.POST;


public interface FaceAPI {

    @POST("api/auth/register")
    Call<ResponseBody> registerUser(
            @Body RegistrationBody body
    );
}

我有一个 RegistrationBody 类,我试图以JSON格式推送服务器(仅限两个参数 - 电子邮件和密码)。代码:

package com.facelocation.testretrofit;

public class RegistrationBody {
    public String email;
    public String password;

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

我只有一个按钮,我有最简单的 MainActivity 类。代码:

package com.facelocation.testretrofit;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

public class MainActivity extends AppCompatActivity {

    String TAG = "Reg";

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

        Button button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Retrofit retrofit = new Retrofit.Builder()
                        .baseUrl("https://face-location.com/")
                        .addConverterFactory(GsonConverterFactory.create())
                        .build();

                FaceAPI api = retrofit.create(FaceAPI.class);
                RegistrationBody reg = new RegistrationBody("somenewemail111@gmail.com", "password12");

                Call<ResponseBody> call = api.registerUser(reg);
                Log.i(TAG, "Works until here");

                call.enqueue(new Callback<ResponseBody>() {
                    @Override
                    public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                        Toast.makeText(MainActivity.this, "Все прошло хорошо",Toast.LENGTH_SHORT).show();
                        Log.i(TAG, "THIS METHOD DOESN'T CALL! WHY?" + response.toString());

                    }

                    @Override
                    public void onFailure(Call<ResponseBody> call, Throwable t) {

                    }
                });
            }
        });
    }
}

当我运行此代码时,我没有收到任何错误。而且我没有得到任何服务器响应。这行代码适用于Log.i(TAG,&#34;直到这里工作&#34;);但我认为下一种方法并没有打电话。我无法理解为什么我没有收到任何错误或服务器响应。请帮助!

1 个答案:

答案 0 :(得分:0)

所以问题主要出现在RegistrationBody()

首先更改为字符串您的RegistrationBody()

您可以使用以下代码进行制作:

public static String modelAsString(Object obj) {
        String value;
        ObjectMapper mapper = new ObjectMapper();
        try {
            value = mapper.writeValueAsString(obj);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
            return e.getMessage();
        }
        return value;
    }

看起来像

RegistrationBody reg = new RegistrationBody("somenewemail111@gmail.com", "password12");
String modelAsString = modelAsString(req)

并在

等活动中添加您的mediaType
  public static final MediaType JSON = MediaType.parse("application/json; charset=utf-8");

之后使您的requestModel如下所示:

RequestBody requestBody = RequestBody.create(JSON, modelAsString);

别忘了!!这个请求正文来自okhttp3 , 这意味着您必须import okhttp3.RequestBody;

毕竟打电话就像;

Call<ResponseBody> call = api.registerUser(requestBody);

让我知道它是否有效!!!!