我有一個android應用程序試圖發送POST請求到我的python服務器。我正在使用Volley GSONRequest-class
。目前我試圖發送一個這樣的用戶{"username": "xxx", "password": "yyy", "email": "zzz"}
,但服務器收到一個Nonetype JSONObject
,導致錯誤500.GSONRequest發送空的JSON?
我很困惑,爲什麼發佈請求發送一個空的JSON,因爲我打印在getBody()
- 方法顯示了這個:
{"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 + '\'' +
'}';
}
}
你檢查身體內容類型? – Krish
是的,我發現這是問題!你是絕對正確的。必須重寫getBodyContentType() - 方法並使其返回「application/json」。這個伎倆。 – MrMan