【问题标题】:GSONRequest sends empty JSON?GSONRequest 发送空 JSON?
【发布时间】:2017-09-23 15:01:01
【问题描述】:

我有一个 android 应用程序试图向我的 python 服务器发送一个 POST 请求。我正在使用 Volley GSONRequest-class。目前我正在尝试发送这样的用户{"username": "xxx", "password": "yyy", "email": "zzz"},但是服务器接收到Nonetype JSONObject,导致错误500。

我很困惑为什么 post 请求会发送一个空 JSON,因为我在 getBody()-method 中进行的打印显示如下:

{"username": "xxx", "password": "yyy", "email": "zzz"}

在我看来,它不像 NoneType。因此,我的问题是; GSONRequest的dataIn在哪里消失了?

主活动:

    package com.example.adrian.testgsonbango;

        import android.support.v7.app.AppCompatActivity;
        import android.os.Bundle;
        import android.view.View;
        import android.widget.EditText;

        import com.android.volley.Cache;
        import com.android.volley.Network;
        import com.android.volley.RequestQueue;
        import com.android.volley.Response;
        import com.android.volley.VolleyError;
        import com.android.volley.toolbox.BasicNetwork;
        import com.android.volley.toolbox.DiskBasedCache;
        import com.android.volley.toolbox.HurlStack;
        import com.android.volley.toolbox.Volley;

        import java.util.HashMap;
        import java.util.Map;

public class MainActivity extends AppCompatActivity {

    RequestQueue mRequestQueue;

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

    public void postEvent(View v) {
        EditText userField = (EditText) findViewById(R.id.userField);
        EditText pwField = (EditText) findViewById(R.id.passwordField);
        EditText emailField = (EditText) findViewById(R.id.emailfield);
        String user = userField.getText().toString();
        String pw = pwField.getText().toString();
        String email = emailField.getText().toString();
        User u = new User(user,pw,email);
        GsonRequest<String> req = new GsonRequest<>("http://python-cicero-app.apps.ida.liu.se/user", u, String.class, null, new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                System.out.println("post succesful!");
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {}
        });

        getRequestQueue().add(req);
    }

    public RequestQueue getRequestQueue()
    {
        if (mRequestQueue == null) {
            Cache cache = new DiskBasedCache(this.getCacheDir(), 20 * 1024 * 1024);
            Network network = new BasicNetwork(new HurlStack());
            mRequestQueue = new RequestQueue(cache, network);
            mRequestQueue.start();
        }
        return mRequestQueue;

    }
}

GSON 请求:

package com.example.adrian.testgsonbango;


import com.android.volley.AuthFailureError;
import com.android.volley.NetworkResponse;
import com.android.volley.ParseError;
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.toolbox.HttpHeaderParser;
import com.google.gson.Gson;
import com.google.gson.JsonSyntaxException;

import java.io.UnsupportedEncodingException;
import java.util.Map;

public class GsonRequest<T> extends Request<T> {
    private final Gson gson = new Gson();
    private final Class<T> clazz;
    private final Map<String, String> headers;
    private final Response.Listener<T> listener;
    private final Object dataIn;

    /**
     * Make a GET request and return a parsed object from JSON.
     *
     * @param url URL of the request to make
     * @param clazz Relevant class object, for Gson's reflection
     * @param headers Map of request headers
     */
    public GsonRequest(String url, Object dataIn, Class<T> clazz, Map<String, String> headers,
                       Response.Listener<T> listener, Response.ErrorListener errorListener) {
        super(Method.POST, url, errorListener);
        this.dataIn = dataIn;
        this.clazz = clazz;
        this.headers = headers;
        this.listener = listener;
    }

    @Override
    public Map<String, String> getHeaders() throws AuthFailureError {
        return headers != null ? headers : super.getHeaders();
    }

    @Override
    protected void deliverResponse(T response) {
        listener.onResponse(response);
    }

    @Override
    public byte[] getBody() throws AuthFailureError {
        System.out.println("gson: " + gson.toJson(dataIn));
        return gson.toJson(dataIn).getBytes();
    }

    @Override
    protected Response<T> parseNetworkResponse(NetworkResponse response) {
        try {
            String json = new String(
                    response.data,
                    HttpHeaderParser.parseCharset(response.headers));
            System.out.println("JSON: " + json);

            return Response.success(
                    gson.fromJson(json, clazz),
                    HttpHeaderParser.parseCacheHeaders(response));
        } catch (UnsupportedEncodingException e) {
            return Response.error(new ParseError(e));
        } catch (JsonSyntaxException e) {
            return Response.error(new ParseError(e));
        }
    }
}

用户:

package com.example.adrian.testgsonbango;

/**
 * Created by Adrian on 2017-04-24.
 */

public class User {
    private String username;
    private String password;
    private String email;

    public void setName(String username) {
        this.username = username;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getUsername() {

        return username;
    }

    public String getPassword() {
        return password;
    }

    public String getEmail() {
        return email;
    }

    public User(String username, String password, String email) {

        this.username = username;
        this.password = password;
        this.email = email;
    }

    @Override
    public String toString() {
        return "User{" +
                "username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", email='" + email + '\'' +
                '}';
    }
}

【问题讨论】:

  • 你检查正文内容类型了吗?
  • 是的,我发现这是问题所在!你是绝对正确的。必须重写 getBodyContentType() 方法并使其返回“application/json”。这成功了。

标签: android json gson android-volley


【解决方案1】:

正如 Krish 在他的评论中所说,解决问题的方法是覆盖 GSONRequest 中的 getBodyContentType() 方法并使其返回“application/json”,见下文:

@Override
    public String getBodyContentType() {
        return "application/json";
    }

【讨论】:

    【解决方案2】:

    500 错误表示内部服务器错误 它发生在服务器由于无效数据或执行请求时服务器端错误而无法处理您的请求时,因此必须检查服务器代码以及您发送的数据格式是否正确。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-08
      • 2014-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-27
      • 2018-11-24
      • 1970-01-01
      相关资源
      最近更新 更多