2017-04-26 42 views
1

我有一個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 + '\'' + 
       '}'; 
    } 
} 
+0

你檢查身體內容類型? – Krish

+0

是的,我發現這是問題!你是絕對正確的。必須重寫getBodyContentType() - 方法並使其返回「application/json」。這個伎倆。 – MrMan

回答

0

500錯誤意味着內部服務器錯誤這發生時,服務器無法處理您的請求因無效數據或執行請求時服務器端出錯,所以必須檢查服務器代碼和數據你的發送形式是否正確。

0

由於Krish在他的評論中,有什麼固定的問題,指出了覆蓋getBodyContentType() - 在GSONRequest方法,並使其返回「應用程序/ JSON」,見下圖:

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