【问题标题】:Retrofit Sending Json改造发送 Json
【发布时间】:2018-04-25 16:48:35
【问题描述】:

我需要通过 Retrofit 将 Json 发送到支付网关。我真的不知道我对邮递员进行了哪些糟糕的测试,并且一切正常。当试图通过改造来适应时,我只会得到 null 作为响应。

我的课堂实用工具

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

我的界面类

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 的方法。我总是得到一个空的答案

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




}

postman request

【问题讨论】:

  • 你能告诉你的邮递员吗? post请求和响应结果

标签: android retrofit retrofit2


【解决方案1】:

这个就不用说了:

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

到:

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

您的邮递员请求中的测试属性是布尔值,但在这里您是作为字符串传递的。

【讨论】:

  • 还分享来自邮递员的发送请求正文,它会为您提供成功响应。我想检查你是否正确地制作了 json。
  • 嗨,更新我的出版物最后是我的邮递员的链接。
  • 好友我更新了答案实施建议的更改,这将起作用。祝你好运!
  • 我得到相同的答案从服务器获取响应:null。使用作为字符串“false”发送的邮递员进行测试,并与邮递员同样工作,改装似乎是我的问题。
【解决方案2】:

为什么@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&lt;Ping&gt; 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;
    }
}

【讨论】:

  • 嗨。尝试你的方式我仍然得到相同的答案 null
  • 你能分享一下 RetrofitClient 代码吗?或者您可以添加 HttpLoggingInterceptor 以便您可以更轻松地跟踪请求和响应。 HttpLoggingInterceptor 拦截器 = new HttpLoggingInterceptor();拦截器.setLevel(HttpLoggingInterceptor.Level.BODY); builder.addInterceptor(拦截器);
  • Hi Vision,我已根据您的邮递员要求更新了我的答案。您可以尝试使用提供的请求对象。
猜你喜欢
  • 2023-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-07
  • 2016-10-06
  • 2016-09-05
  • 1970-01-01
相关资源
最近更新 更多