Retrofit2 - 向API

时间:2018-04-04 04:59:26

标签: java android api post retrofit

我真的很感激我能得到的任何帮助!很抱歉这个问题很长。

我正在创建此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);
}

我真的很擅长改造2,而且上面,我能感觉到一个问题,我不知道如何解决。从我给出的API模式中,我发送给API的这个参数应该是&#39; body&#39; .... not&#39; field&#39;。也许在改装@Body ......我不太确定如何在上面的java文件中实现它。

现在,我在下面做的可能真的很蠢......我不明白改造java&#39;模型&#39;应该上课。我遵循了一个在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";
    }
}

老实说,我认为我所做的可能完全错了,但我不知道如何设计对象(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中达到

2 个答案:

答案 0 :(得分:0)

根据带有电话号码的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);
}

答案 1 :(得分:0)

我认为这个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.");
            }
        });
    }

请尝试让我知道它是否正常工作。