Retrofit2 - проблема с отправкой запроса POSt API

92
12

Я действительно очень признателен за любую помощь, которую я могу получить от этого! Извините за длинный вопрос.

Я создаю это приложение для Android, и там, где нужно зарегистрироваться, пользователи будут вводить свой номер телефона и отправлять его, чтобы получить код подтверждения с помощью текстового сообщения.

Я отработал этот урок: https://code.tutsplus.com/tutorials/sending-data-with-retrofit-2-http-client-for-android--cms-27845

Я сократил 2 поля в своем приложении до одного поля - одно текстовое поле для номера телефона и кнопку отправки ниже. Этот номер телефона должен быть отправлен в API.

Я действительно новичок в Retrofit, и я уже давно пытаюсь успешно отправить вызов API. Я протестировал вызов API, используя настольное приложение "Почтальон", и API жив и отвечает... Я просто не смог сформировать действительный запрос для отправки в API.

Схема JSON, разработанная нашим парнем API... для этого действия требуется всего одна строка, номер телефона:

{
"phone_number": "string"
}

а затем, если это действительный номер телефона, а пользователь не находится в базе данных, вы получите ответ 200

    {
"message": "string"
}

ИЛИ вы можете вернуть ответ 400 из API

{
"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". Возможно, в retrofit @Body... Я не слишком уверен, как реализовать это в этом java файле выше.

Теперь то, что я сделал ниже, может быть действительно глупо... Я не понимаю, как должны быть модифицированы классы модели Java. Я последовал за одним учебником, который моделировал класс после 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.

спросил(а) 2018-04-04T07:59:00+03:00 2 года, 6 месяцев назад
1
Решение
70

Я думаю, что этот 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.");
}
});
}

Пожалуйста, попробуйте и дайте мне знать, если он работает.

ответил(а) 2018-04-04T09:04:00+03:00 2 года, 6 месяцев назад
42

Согласно схеме 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);
}

ответил(а) 2018-04-04T08:53:00+03:00 2 года, 6 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема