代码之家  ›  专栏  ›  技术社区  ›  Nastromo

如何在改装2中发送POST请求(Android)

  •  1
  • Nastromo  · 技术社区  · 7 年前

    方法调用。enqueue()不调用。我放弃了去理解为什么?请帮忙。

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

    我的API服务名为 FaceAPI 班代码:

    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
        );
    }
    

    我有一个 注册主体 我正试图以JSON格式将其推送到服务器上的类(仅限两个参数-email和password)。代码:

    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;
        }
    }
    

    我有最简单的 主要活动 仅使用一个按钮初始化。代码:

    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) {
    
                        }
                    });
                }
            });
        }
    }
    

    当我运行这段代码时,我没有得到任何错误。我没有收到任何服务器响应。这行代码工作于日志。i(标签“工作到这里”);但我认为下一种方法不会调用。我不明白为什么我没有收到任何错误或服务器响应。请帮忙!

    2 回复  |  直到 7 年前
        1
  •  0
  •   Murat Güç    7 年前

    所以问题主要在于 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)
    

    并在活动中添加您的媒体类型,如

      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);
    

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

        2
  •  0
  •   Nastromo    7 年前

    @Murat Guc感谢您的详细回答,但正如“Pavneet_Singh”和“VÃ-Vêk BÃ¥rÃÔ所建议的那样,问题在于onFailure()方法。我只是忘了记录。i onFailure()中的错误消息。因此,POST请求与我的模型配合使用。