【问题标题】:Retrofit2 - having issues sending POSt request to APIRetrofit2 - 向 API 发送 POST 请求时遇到问题
【发布时间】:2018-09-13 13:11:34
【问题描述】:

我真的非常感谢我能得到的任何帮助!抱歉问了这么长的问题。

我正在创建这个 android 应用,在哪里注册,用户将输入他们的电话号码并提交它,以通过短信获取验证码。

我已经完成了本教程: https://code.tutsplus.com/tutorials/sending-data-with-retrofit-2-http-client-for-android--cms-27845

我已将他们应用程序中的 2 个字段缩减为一个字段 - 一个用于电话号码的文本字段,以及一个下方的提交按钮。此电话号码将发送到 API。

我真的是 Retrofit 的新手,我已经尝试了一段时间来成功发送对 API 的调用。我已经使用“Postman”桌面应用程序测试了 API 调用,并且 API 处于活动状态并做出响应...我只是无法形成发送到 API 的有效请求。

我们的 API 人员设计的 JSON 模式......为此活动只需要一个字符串,电话号码:

{
  "phone_number": "string"
}

然后如果它是一个有效的电话号码并且用户不在数据库中,你会得到一个 200 响应

    {
    "message": "string"
    }

或者您可以从 API 返回 400 响应

{
  "error": "string",
  "description": "string"
}

我的改造接口,称为 APIService.java 如下所示:

import retrofit2.Call;
import retrofit2.http.Field;
import retrofit2.http.Body;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.POST;

public interface APIService {

    @POST("/verifications/signup/send")
    @FormUrlEncoded
    Call<Post> sendPhoneNumber(@Field("phone_number") String phone_number);
}

我真的是retrofit2的新手,在上面,我能感觉到一个我不知道如何解决的问题。从我得到的 API 模式来看,我发送给 API 的这个参数应该是“body”......而不是“field”。也许在改造@Body ...我不太确定如何在上面的这个java文件中实现它。

现在,我在下面所做的可能真的很愚蠢……我不明白应该如何改造 java 'model' 类。我遵循了一个在 RESPONSE 之后对类建模的教程,而不是数据调用。因此,我修改了他们的 Post 类(我称之为 ?JSON 对象以发送单个电话号码)。所以我的 Post 类看起来像这样:

public class Post {

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

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    @Override
    public String toString() {
        //return "Post{" + "message = " + message + '}';
        return "This is a return message string";
    }
}

老实说,我认为我所做的可能是完全错误的,但我不确定如何设计 object(Post) 类,因为我什至不知道这个类将用于什么......除了收到回复了吗?

public class MainActivity extends Activity {


    private TextView mResponseTv;
    private APIService mAPIService;

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

        final EditText phoneNumberEt = (EditText) 
findViewById(R.id.et_phoneNumber);

        Button submitBtn = (Button) findViewById(R.id.btn_submit);
        mResponseTv = (TextView) findViewById(R.id.tv_response);

        mAPIService = ApiUtils.getAPIService();

        submitBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
            String phoneNumber = phoneNumberEt.getText().toString().trim();
            if (!TextUtils.isEmpty(phoneNumber)) {
                sendPost(phoneNumber);
            }
        }
    });
}

public void sendPost(String phone_number) {
    mAPIService.sendPhoneNumber(phone_number).enqueue(new Callback<Post>() {
        @Override
        public void onResponse(Call<Post> call, Response<Post> response) {

            int statusCode = response.code();

            if (response.isSuccessful()) {
                showResponse("Response code is " + statusCode + ". Submitted successfully to API - " + response.body().toString());
                Log.i(TAG, "post submitted to API." + response.body().toString());
            }
        }

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

                showResponse("Unable to submit post to API.");
                Log.e(TAG, "Unable to submit post to API.");
            }
        });
    }

    public void showResponse(String response) {
        if (mResponseTv.getVisibility() == View.GONE) {
            mResponseTv.setVisibility(View.VISIBLE);
        }
        mResponseTv.setText(response);
    }

}

我的其他文件与上面教程链接中的文件非常相似。这就是我修改后的简单文本字段版本。

当我能够得到它以联系 API 并且我可以读取响应时,我会将它合并到我正在开发的真实应用程序中。

目前,该应用程序已编译并在我的手机(以及模拟器)上运行。当我提交电话号码时,提交按钮下方的文本字段没有显示任何应有的消息......所以我确定曾经有问题

mAPIService.sendPhoneNumber(phone_number).enqueue(new Callback<Post>() {
            @Override
            public void onResponse(Call<Post> call, Response<Post> response) 
{

在 MainActivity 中到达。

【问题讨论】:

  • 使用可以使用这个站点创建一个模型类进行改造..jsonschema2pojo.org
  • 在邮递员中你是发送表单数据还是原始数据
  • 在邮递员中我发送 100.60.100.48:8080/api/v1/verifications/signup/send?phone_number=1112223334

标签: java android api post retrofit


【解决方案1】:

我认为这个api需要JsonObject中的参数。所以试试这个

在您的 APIService 中

@POST("/verifications/signup/send")

Call<JsonObject> sendPhoneNumber(@Body JsonObject phone_number);

发送数据时使用这个

JsonObject object=new JsonObject();

object.addProperty("phone_number",yourPhoneNumber);

在您的发送帖子方法中

mAPIService.sendPhoneNumber(object).enqueue(new Callback<JsonObject>() {
        @Override
        public void onResponse(Call<JsonObject> call, Response<JsonObject> response) {

            int statusCode = response.code();

            if (response.isSuccessful()) {
                showResponse("Response code is " + statusCode + ". Submitted successfully to API - " + response.body().toString());
                Log.i(TAG, "post submitted to API." + response.body().toString());
            }
        }

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

                showResponse("Unable to submit post to API.");
                Log.e(TAG, "Unable to submit post to API.");
            }
        });
    }

请尝试让我知道它是否有效。

【讨论】:

  • 你好。感谢您的时间和精力……我完全按照您上面的建议尝试了……没有回应。那个 Post.java 文件怎么样...您的解决方案不使用它...我们不需要某种“模型”类吗?我不确定发送 JSON 对象是否是正确的想法。这是 API 规范的快照ibb.co/dyb5SH
  • @Hideyoshi 如果我们没有得到响应,那么创建模型类有什么用。首先检查您是否使用我上面提供的方法得到正确的响应,然后我们将着手创建模型类。
  • 谢谢。这导致它工作。导致问题的另一个问题是,Retrofit 的基本 URL 以正斜杠结尾存在问题。所以我发现当改造在连接到 API 时遇到问题时,请调查基本 url 末尾和特定请求 url 开头的正斜杠。感谢您的所有帮助@AbhayBohra
  • 我很高兴它有帮助
【解决方案2】:

根据带有电话号码的 JSON 模式,您需要在 API 的正文中传递电话号码。不要使用@Field 注释,而是使用@Body 注释,其中参数将是RequestBody 类的一个实例。

@Field 文档https://square.github.io/retrofit/2.x/retrofit/retrofit2/http/Field.html

使用字段电话号码创建新的 RequestBody 类。

public class RequestBody {

   @Expose
   @SerializedName("phone_number")
   private String phoneNumber;

   public void setPhoneNumber(String phoneNumber) {
   this.phoneNumber = phoneNumber;
   }

   public String getPhoneNumber() {
   return phoneNumber;
   }

在要传递电话号码的活动中,创建RequestBody 类的对象,在setPhoneNumber() 方法中传递电话号码。然后把这个对象作为参数传入APIService。

在 MainActivity.class 中,

public void sendPost(String phone_number) {

RequestBody requestBody = new RequestBody();
requestBody.setPhoneNumber(phone_number);
mAPIService.sendPhoneNumber(requestBody).enqueue(new Callback<Post>() {
        @Override
        public void onResponse(Call<Post> call, Response<Post> response) 
{

您的 APIService 将因此看起来像

public interface APIService {

    @POST("/verifications/signup/send")
    @FormUrlEncoded
    Call<Post> sendPhoneNumber(@Body RequestBody requestBody);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-21
    • 1970-01-01
    • 2020-02-08
    • 1970-01-01
    • 2018-12-07
    • 2015-09-16
    • 2019-08-08
    • 2014-11-02
    相关资源
    最近更新 更多