【问题标题】:Android koush/ion lib unable to post and receive JSON responseAndroid koush/ion lib 无法发布和接收 JSON 响应
【发布时间】:2014-08-06 06:10:58
【问题描述】:

我正在使用 ION 来获取/发布 REST 并将图像放入 ListView 但我无法使用 POST 方法并以 JSON 形式接收响应 我使用的 ION 版本是 1.3.7。在模拟器和真实设备 4.1.1、4.2.2 和 4.4 上测试

ION Link on gitHub

验证成功后,单击按钮将调用此代码以发布到服务器。这是在 gradle 中定义的支持片段 v4:20

compile 'com.android.support:support-v4:20.+'

///////////////////

Ion.with(getActivity())
    .load(URLStr)
    .addQuery("action", "dummyAction")
    .addHeader("Content-Type", "application/json")
    .setLogging("ION_VERBOSE_LOGGING", Log.VERBOSE)
    .setJsonObjectBody(jsonStr)
    .asJsonObject()
    .setCallback(new FutureCallback<JsonObject>() {
    @Override
    public void onCompleted(Exception e, JsonObject result) {
        if (null != e) {
            if (null != result) {

                Log.d(Constants.LOG_TAG, "JSON Result User basic Info: " + result);
            } else {
                Log.e(Constants.LOG_TAG, "error in posting User basic Info");
            }
        } else {
            Log.e(Constants.LOG_TAG, "error in posting User basic Info", e);
        }
    }
    });

我得到 NullPointer 结果。 请求 JSON 也是有效的,我正在使用 GSON 来构造它。 响应 JSON 是有效的,因为我使用 POSTMAN chrome 应用程序对其进行了检查。

然而,下面的代码工作得很好,但它被贬低了 ION.with(getActivity(), URL) 所以我不知道,我在哪里犯错了。

    Ion.with(getActivity(), URLStr)
            .addQuery("action", "dummyAction")
            .asJsonObject()
            .setCallback(new FutureCallback<JsonObject>() {
                @Override
                public void onCompleted(Exception e, JsonObject result) {
                    if (e != null) {

                        e.printStackTrace();
                        Toast.makeText(getActivity(), "Error loading user data", Toast.LENGTH_LONG).show();
                        return;
                    }
                    Log.d(Constants.LOG_TAG, "DATA: " + result.toString());
                    String data = result.get("status").getAsString();
                    Log.d(Constants.LOG_TAG, "DATA: " + data);
                }
            });

下面是第一次调用的详细输出

    08-12 14:18:06.010  27928-27928/com.abc.xyz: D/ION_VERBOSE_LOGGING﹕ (0 ms) http://urlHidden/service.php?action=dummyAction: preparing request
    08-12 14:18:06.010  27928-27928/com.abc.xyz: I/ION_VERBOSE_LOGGING﹕ (0 ms) http://urlHidden/service.php?action=dummyAction: Using loader: com.koushikdutta.ion.loader.HttpLoader@42d0e6c8
    08-12 14:18:06.025  27928-28187/com.abc.xyz: D/ION_VERBOSE_LOGGING﹕ (0 ms) http://urlHidden/service.php?action=dummyAction: Executing request.
    08-12 14:18:06.040  27928-28187/com.abc.xyz: I/ION_VERBOSE_LOGGING﹕ (14 ms) http://urlHidden/service.php?action=dummyAction: Response may be served from conditional cache
    08-12 14:18:06.040  27928-28187/com.abc.xyz: V/ION_VERBOSE_LOGGING﹕ (16 ms) http://urlHidden/service.php?action=dummyAction: Resolving domain and connecting to all available addresses
    08-12 14:18:06.195  27928-28187/com.abc.xyz: V/ION_VERBOSE_LOGGING﹕ (167 ms) http://urlHidden/service.php?action=dummyAction: socket connected
    08-12 14:18:06.195  27928-28187/com.abc.xyz: V/ION_VERBOSE_LOGGING﹕ (169 ms) http://urlHidden/service.php?action=dummyAction:
        GET /service.php?post=stepOne HTTP/1.1
        Host: 188.226.224.99
        User-Agent: Dalvik/1.6.0 (Linux; U; Android 4.4.4; GT-N7000 Build/KTU84P)
        Accept-Encoding: gzip, deflate
        Connection: keep-alive
        Accept: */*
        Content-Type: application/json
        If-Modified-Since: Tue, 12 Aug 2014 06:42:34 UTC
    08-12 14:18:06.200  27928-28187/com.abc.xyz: V/ION_VERBOSE_LOGGING﹕ (170 ms) http://urlHidden/service.php?action=dummyAction: request completed
    08-12 14:18:06.355  27928-27928/com.abc.xyz: D/MatchBot﹕ DATA: {"status":"pending"}
    08-12 14:18:06.370  27928-28187/com.abc.xyz: V/ION_VERBOSE_LOGGING﹕ (347 ms) http://urlHidden/service.php?action=dummyAction: Received headers:
        HTTP/1.1 200 OK
        Date: Tue, 12 Aug 2014 08:48:08 GMT
        Server: Apache/2.2.22 (Ubuntu)
        X-Powered-By: PHP/5.3.10-1ubuntu3.11
        Vary: Accept-Encoding
        Content-Encoding: gzip
        Content-Length: 64
        Keep-Alive: timeout=5, max=100
        Connection: Keep-Alive
        Content-Type: text/html
    08-12 14:18:06.380  27928-28187/com.abc.xyz: D/ION_VERBOSE_LOGGING﹕ (355 ms) http://urlHidden/service.php?action=dummyAction: Caching response
    08-12 14:18:06.380  27928-28187/com.abc.xyz: V/ION_VERBOSE_LOGGING﹕ (356 ms) http://urlHidden/service.php?action=dummyAction: Final (post cache response) headers:
        HTTP/1.1 200 OK
        Date: Tue, 12 Aug 2014 08:48:08 GMT
        Server: Apache/2.2.22 (Ubuntu)
        X-Powered-By: PHP/5.3.10-1ubuntu3.11
        Vary: Accept-Encoding
        Content-Encoding: gzip
        Content-Length: 64
        Keep-Alive: timeout=5, max=100
        Connection: Keep-Alive
        Content-Type: text/html
    08-12 14:18:06.380  27928-28187/com.abc.xyz: D/ION_VERBOSE_LOGGING﹕ (356 ms) http://urlHidden/service.php?action=dummyAction: Connection successful
    08-12 14:18:06.385  27928-27928/com.abc.xyz: E/MatchBot﹕ error in posting User basic Info
    08-12 14:18:06.390  27928-28187/com.abc.xyz: D/ION_VERBOSE_LOGGING﹕ (364 ms) http://urlHidden/service.php?action=dummyAction: Recycling keep-alive socket

/////////////////////////////////////// ////////////////

import com.google.gson.annotations.SerializedName;

import java.io.Serializable;
import java.util.Date;

/**
 * Created by riinav on 17/6/14.
 */
public class User implements Serializable {

    @SerializedName("facebook_id")
    private String userFBId;

    @SerializedName("status")
    private String registrationStatus;

    private transient Date registeredOnDate;

    public User() {
    }

    public User(String userFBId, String registrationStatus) {
    this.userFBId = userFBId;
    this.registrationStatus = registrationStatus;
    }

    /* 
     * getters, setters and overidden equals and hashcode methods
     */
}

///////////////////////////////////////////////////////////////////////////

import com.google.gson.annotations.SerializedName;

/**
 * Created by riinav on 27/6/14.
 */
public class UserBasicInfo extends User {//implements Serializable {

    @SerializedName("name")
    private String userName;

    @SerializedName("email")
    private String emailId;

    @SerializedName("gender")
    private String gender;

    @SerializedName("bday")
    private String dob;

    @SerializedName("country")
    private String country;

    @SerializedName("city")
    private String city;

    @SerializedName("self_image")
    private String profilePicUrl;

    @SerializedName("school")
    private String school;

    @SerializedName("college")
    private String college;

    @SerializedName("degree")
    private String qualification;

    @SerializedName("sorientation")
    private String sexualPreference;

    @SerializedName("prefered_age")
    private String preferedAge;

    @SerializedName("prefered_city")
    private String preferedCity;

    public UserBasicInfo() {
    super();
    }

    /* 
     * getters, setters and overidden equals and hashcode methods
     */
}

/////////////////////////////////////// User Model json posted to server

User: {
    "college": "University of Mumbai,",
    "bday": "01/01/1980",
    "email": "dummyEmail@gmail.com",
    "gender": "Male",
    "degree": "college degree",
    "school": "abc High School,",
    "name": "awesome name",
    "status": "PROCESS",
    "facebook_id": "000000000000000" // test fbId
}

 ///////////////// Server expected response 

 onSuccess:
 {"status":"success"}

 OnError:
 {"status":"error MESSAGE”}

【问题讨论】:

  • jsonStr 上的类型是什么?你能提供一个我可以查看的示例数据的网址吗?
  • jsonStr 是 JSON 的 String 表示,使用 GSON 转换
    UserBasicInfo user = createUser(); //JsonObject json = new JsonObject(); Gson gson = new Gson(); String jsonStr = gson.toJson(user);
    其中 UserBasicInfo 类是 POJO
    `user.setUserName("xx");等
  • 不传入字符串,直接传入POJO对象。

标签: android android-networking android-ion ion-koush


【解决方案1】:

直接传入 POJO 对象。 Ion 会自动为您将其序列化为 JSON。

【讨论】:

  • 我试过了,它仍然给我同样的错误。
    我的 POJO 是 public class UserBasicInfo extends User implements Serializable { } ` public class User implements Serializable { } `
  • 您收到的此异常的实际堆栈跟踪会很有帮助。如果你能提供的话,还有类定义。不过,例外可能就足够了。
  • 谢谢,我会整理一个测试用例。您有机会分享您看到的错误的堆栈跟踪吗?我在您粘贴的内容中没有看到。
  • 嗨,Koush,我添加了 stackTrace,这是唯一正在打印的日志。
  • 我没有看到堆栈跟踪日志。此外,您的日志记录是倒退的。应该是: if (null != e) { if (null != result) { Log.d(Constants.LOG_TAG, "JSON Result User basic Info:" + result); } else { Log.e(Constants.LOG_TAG, "发布用户基本信息时出错", e); } } else { 您在记录异常时丢失了异常本身。
【解决方案2】:

使用方法作为参数加载

Ion.with(getActivity())
   .load("POST",URLStr)
   .addQuery("action", "dummyAction")
   .addHeader("Content-Type", "application/json")
   .setLogging("ION_VERBOSE_LOGGING", Log.VERBOSE)
   .setJsonObjectBody(jsonStr)
   .asJsonObject()
   .setCallback(new FutureCallback<JsonObject>() {
       @Override
       public void onCompleted(Exception e, JsonObject result) {}
   });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多