【问题标题】:Unable to send raw json data in post api data using Retrofit 2.0无法使用 Retrofit 2.0 在 post api 数据中发送原始 json 数据
【发布时间】:2017-01-21 19:19:32
【问题描述】:

无法使用Retrofit 2.0 发送POST api 数据中的原始JSON 数据

try {
  JSONObject myUserData = new JSONObject();
  myUserData.put("mobile", "917023847899");
  myUserData.put("displayName", "Deepuu");
  myUserData.put("info", "AD");
  myUserData.put("photo", "");
  myUserData.put("displayName", "Deepu");

  JSONObject deviceData = new JSONObject();
  ;
  deviceData.put("deviceId", "2124578910556991");
  deviceData.put("pnToken", "klklklkl");
  deviceData.put("os", "android");
  deviceData.put("targetTopic", "jkjkjkjkj");

  myUserData.put("device", "" + deviceData);
  OkHttpClient client = new OkHttpClient();

  Retrofit retrofit = new Retrofit.Builder()
                    .baseUrl(URL)
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();

  Api Ainterface = retrofit.create(Api.class);

  Call<Response> data = Ainterface.getResponse(myUserData);
  data.enqueue(new Callback<Response>() {
    @Override
    public void onResponse(Call<Response> call, retrofit2.Response<Response> response) {
      if (response.isSuccessful()) {
        Response rr = response.body();
        Integer ss = rr.getStatusCode();
        Log.e("I Am", "Success"  );
      }
    }

    @Override
    public void onFailure(Call<Response> call, Throwable t) {
      Log.e("I Am", "Failed");
    }
  });

我的界面:

@POST("appUsers/")
Call<Response> getResponse(@Body RequestBody value);

谁能建议使用Retrofit 2.0POST api 中发送原始JSON 数据的解决方案?我是使用 Retrofit 的新手;请帮忙,因为我在 onResponse 方法中得到了 null 响应。

【问题讨论】:

  • 添加你的 Api 和改造服务生成器类代码
  • 问题是我无法将这些 JSON 对象作为参数发送并得到空响应.. :(

标签: android api android-studio retrofit retrofit2


【解决方案1】:

您正在使用 GsonConverterFactory。因此,您应该将通过改造转换为字符串并添加到请求正文的模型类对象传递。但是在您的代码中,您传递了 JSONObject。

如下创建模型类并根据您的项目结构更改包名称:

import javax.annotation.Generated;
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

@Generated("org.jsonschema2pojo")
public class Device {

@SerializedName("deviceId")
@Expose
private String deviceId;
@SerializedName("pnToken")
@Expose
private String pnToken;
@SerializedName("os")
@Expose
private String os;
@SerializedName("targetTopic")
@Expose
private String targetTopic;

/**
*
* @return
* The deviceId
*/
public String getDeviceId() {
return deviceId;
}

/**
*
* @param deviceId
* The deviceId
*/
public void setDeviceId(String deviceId) {
this.deviceId = deviceId;
}

/**
*
* @return
* The pnToken
*/
public String getPnToken() {
return pnToken;
}

/**
*
* @param pnToken
* The pnToken
*/
public void setPnToken(String pnToken) {
this.pnToken = pnToken;
}

/**
*
* @return
* The os
*/
public String getOs() {
return os;
}

/**
*
* @param os
* The os
*/
public void setOs(String os) {
this.os = os;
}

/**
*
* @return
* The targetTopic
*/
public String getTargetTopic() {
return targetTopic;
}

/**
*
* @param targetTopic
* The targetTopic
*/
public void setTargetTopic(String targetTopic) {
this.targetTopic = targetTopic;
}

}
-----------------------------------com.example.Request.java-----------------------------------

package com.example;

import javax.annotation.Generated;
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

@Generated("org.jsonschema2pojo")
public class Request {

@SerializedName("mobile")
@Expose
private String mobile;
@SerializedName("info")
@Expose
private String info;
@SerializedName("photo")
@Expose
private String photo;
@SerializedName("displayName")
@Expose
private String displayName;
@SerializedName("device")
@Expose
private Device device;

/**
*
* @return
* The mobile
*/
public String getMobile() {
return mobile;
}

/**
*
* @param mobile
* The mobile
*/
public void setMobile(String mobile) {
this.mobile = mobile;
}

/**
*
* @return
* The info
*/
public String getInfo() {
return info;
}

/**
*
* @param info
* The info
*/
public void setInfo(String info) {
this.info = info;
}

/**
*
* @return
* The photo
*/
public String getPhoto() {
return photo;
}

/**
*
* @param photo
* The photo
*/
public void setPhoto(String photo) {
this.photo = photo;
}

/**
*
* @return
* The displayName
*/
public String getDisplayName() {
return displayName;
}

/**
*
* @param displayName
* The displayName
*/
public void setDisplayName(String displayName) {
this.displayName = displayName;
}

/**
*
* @return
* The device
*/
public Device getDevice() {
return device;
}

/**
*
* @param device
* The device
*/
public void setDevice(Device device) {
this.device = device;
}

}

并要求post如下:

@POST("yourpath")
    Call<YourResponseModelClass> getResponse(@Body RequestModelClass request);

根据您的请求和响应模型类更新 YourResponseModelClass 和 RequestModelClass。

可以从json生成模型类,http://www.jsonschema2pojo.org/

【讨论】:

  • 我不明白。我的 api 需要参数作为“原始”数据传递,我必须在 tha 中传递一个 json 对象。我唯一想知道的是我该怎么做。如果我传递一个模型类,它将如何作为 json 对象传递。
  • 感谢@USKMobility,我使用您的方法得到了回复。
【解决方案2】:

您可以在复古 2.0 中发布原始 jsonObject。需要像这样将其转换为 RequestBody

RequestBody requestBody =RequestBody.create(MediaType.parse("application/json"),myUserData.toString() );
Call<Response> data = Ainterface.getResponse(requestBody);

【讨论】:

  • 对添加和删除此斜线没有影响。
猜你喜欢
  • 2020-10-12
  • 2016-12-24
  • 1970-01-01
  • 2018-03-07
  • 1970-01-01
  • 2016-12-24
  • 2012-10-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多