Дооснащение Отправка Json - PullRequest
       11

Дооснащение Отправка Json

0 голосов
/ 25 апреля 2018

Мне нужно отправить Json на платежный шлюз через Retrofit.Я действительно не знаю, что я плохо проверил почтальон и все работает хорошо.при попытке выполнить адаптацию в ответ я получаю только null.

Мой класс Utils

 public class ApiUtils {
        private ApiUtils() {}

 public static final String BASE_URL = "https://api.payulatam.com/";

        public static APIService getAPIService() {

            return RetrofitClient.getClient(BASE_URL).create(APIService.class);
        }
    }

Мой интерфейс Class

public interface APIService {

    @Headers({
            "Accept: application/json",
            "Content-Type: application/json"
    })
    @POST("payments-api/4.0/service.cgi/")
    Call<Ping> sendPing(@Body JsonObject jsonObject);

}

Мой POJO ответа сервера.

public class Ping {

    @SerializedName("code")
    @Expose
    private String code;
    @SerializedName("error")
    @Expose
    private Object error;
    @SerializedName("transactionResponse")
    @Expose
    private Object transactionResponse;

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public Object getError() {
        return error;
    }

    public void setError(Object error) {
        this.error = error;
    }

    public Object getTransactionResponse() {
        return transactionResponse;
    }

    public void setTransactionResponse(Object transactionResponse) {
        this.transactionResponse = transactionResponse;
    }

}

Основные действия, Ping - это метод, при котором я отправляю Json с требованиями, запрошенными шлюзом.Я всегда получаю ответ null

public class MainActivity extends AppCompatActivity {

    private JsonObject SendObj;
    private JsonObject objPing;
    private TextView mResponseTv;
    private APIService mAPIService;
    private String TAG = "MainActivity";

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

        Button submitBtn = (Button) findViewById(R.id.btn_submit);

        mAPIService = ApiUtils.getAPIService();

        submitBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Ping();
            }
        });
    }

    private void Ping(){
        JsonObject objMerchant = new JsonObject();
        objMerchant.addProperty("apiLogin", "XXXXXXXXXXX");
        objMerchant.addProperty("apiKey","XXXXXXXXXXXXXX");

        JsonObject objPing = new JsonObject();
        objPing.addProperty("test", "false");
        objPing.addProperty("language","es");
        objPing.addProperty("command","PING");
        objPing.add("merchant",objMerchant);
        SendPing(objPing);
        Log.i(TAG, "Obj" + objPing.toString());

    }


    public void SendPing(JsonObject body) {
        Call <Ping> call = mAPIService.sendPing(body);
        call.enqueue(new Callback<Ping>() {
            @Override
            public void onResponse(Call<Ping> call, Response<Ping> response) {
                Log.d(TAG,"Getting response from server : "+ response.body());
            }

            @Override
            public void onFailure(Call<Ping> call, Throwable t) {
                Log.d(TAG,"Getting response from server failure: "+ t);
            }
        });
    }




}

запрос почтальона

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

Вам не нужно упоминать, что:

@Headers({
        "Accept: application/json",
        "Content-Type: application/json"
})

Так что удалите это из своего кода.

test является логическим в вашем запросе почтальона, но здесь вы передаете как строку, так что изменитеследующее:

 JsonObject objMerchant = new JsonObject();
    objMerchant.addProperty("apiLogin", "XXXXXXXXXXX");
    objMerchant.addProperty("apiKey","XXXXXXXXXXXXXX");

    JsonObject objPing = new JsonObject();
    objPing.addProperty("test", "false");
    objPing.addProperty("language","es");
    objPing.addProperty("command","PING");
    objPing.add("merchant",objMerchant);

to:

 JsonObject objMerchant = new JsonObject();
    objMerchant.addProperty("apiLogin", "XXXXXXXXXXX");
    objMerchant.addProperty("apiKey","XXXXXXXXXXXXXX");

    JsonObject objPing = new JsonObject();
    objPing.addProperty("test", false);
    objPing.addProperty("language","es");
    objPing.addProperty("command","PING");
    objPing.add("merchant",objMerchant);

Атрибут test является логическим в вашем запросе почтальона, но здесь вы передавались как строка.

0 голосов
/ 25 апреля 2018

Почему в @POST нет конечной точки ("./")?

В основном BASE_URL должен быть https://api.payulatam.com/, а ваша конечная точка POST должна быть

@POST("payments-api/4.0/service.cgi/")

Кроме того, почему вы создаете тело запроса вручную?Вы можете использовать класс POJO для сериализации запроса, и я думаю, что так будет легче обрабатывать.Например,

public class Request{ @SerializedName("language") public String language; //you can use private as well }

и для создания запроса:

Request request = new Request(); request.language = "es";

Итак, в вашем интерфейсе это можно выразить так:

Call<Ping> sendPing(@Body Request request);

Можете ли вы попробовать это и посмотреть?

Обновлен объект запроса из запроса почтальона:

public class Request {@SerializedName("test")
    public boolean test;

    @SerializedName("language")
    public String language;

    @SerializedName("command")
    public String command;

    @SerializedName("merchant")
    public Merchant merchant;

    public class Merchant{
        @SerializedName("apiLogin")
        public String apiLogin;

        @SerializedName("apiKey")
        public String apiKey;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...