GSONRequest发送空JSON?

时间:2017-04-26 09:32:53

标签: android json gson android-volley

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

由于我在getBody() - 方法中进行的打印显示了以下内容,因此post请求发送空JSON的原因让我很困惑:

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

对我来说,它看起来像一个NoneType。因此,我的问题是;在GSONRequest中dataIn消失了吗?

MainActivity:

    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;

    }
}

GSONRequest:

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 + '\'' +
                '}';
    }
}

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

正如Krish在评论中指出的那样,修复问题的方法是覆盖GSONRequest中的getBodyContentType() - 方法并使其返回“application / json”,见下文:

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