2017-04-26 7 views
1

私はアンドロイドアプリケーションが私の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 + '\'' + 
       '}'; 
    } 
} 
+0

あなたは体を確認しましたコンテンツタイプ? – Krish

+0

はい、これが問題だとわかりました!あなたは、絶対に正しい。 getBodyContentType()メソッドをオーバーライドして、 "application/json"を返さなければなりません。これはトリックでした。 – MrMan

答えて

0

500エラーはそれが起こる内部サーバーエラーを意味したときに、あなたのリクエストを処理できませんサーバーによる不正なデータへまたは要求を実行中にサーバー側でエラーが発生するため、サーバーコードとデータをチェックする必要がありますあなたの送信は正しい形式かどうかです。

0

Krishは何の問題を修正するgetBodyContentTypeを(上書きすることだった、彼のコメントで述べたように) - GSONRequestでの方法と、それは以下を参照してください、「アプリケーション/ JSON」を返します

@Override 
    public String getBodyContentType() { 
     return "application/json"; 
    } 
関連する問題