私はアンドロイドアプリケーションが私のpythonサーバーにPOSTリクエストを送信しようとしています。私はVolley GSONRequest-class
を使用しています。現在、私はこのようなユーザを送信しようとしていますが、サーバはNontype JSONObject
を受け取り、エラー500を受け取ります。GSONRequestが空のJSONを送信しますか?
私が行った印刷以来、ポストリクエストが空のJSONを送信する理由は非常に混乱しています私にNoneTypeようには見えません
{"username": "xxx", "password": "yyy", "email": "zzz"}
:getBody()
-methodはこれを示しています。したがって、私の質問は、どこにGSONRequest
のデータが消えるのですか?
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