【问题标题】:Android GSON to use POST MethodAndroid GSON 使用 POST 方法
【发布时间】:2017-02-12 12:33:10
【问题描述】:

我有以下 PostActivity.java 文件,它使用 Method.GET 从 PHP 服务器成功获取数据,但是我需要将 GSON 的方法更改为使用 Method.POST 而不是 Method.GET 以便我可以向服务器发送两个参数(操作和用户 (pid)),如下所示:

{
   "operation":"listApps",
   "user":{
       "pid":"1"
   }
}

PostActivity.java

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class PostActivity extends Activity {

    private static final String ENDPOINT = "http://www.locahost.com/api";

    private RequestQueue requestQueue;
    private Gson gson;
    private List<String> posts_strs ;

    private List<Post> posts ;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_post);

        requestQueue = Volley.newRequestQueue(getApplicationContext());
        GsonBuilder gsonBuilder = new GsonBuilder();
        gsonBuilder.setDateFormat("M/d/yy hh:mm a");
        gson = gsonBuilder.create();

        posts_strs = new ArrayList<String>();

        fetchPosts();
    }

    private void fetchPosts() {
        StringRequest request = new StringRequest(Request.Method.GET, ENDPOINT, onPostsLoaded, onPostsError);

        requestQueue.add(request);
    }

    private final Response.Listener<String> onPostsLoaded = new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {

            posts = Arrays.asList(gson.fromJson(response, Post[].class));

            ListView listview = (ListView) findViewById(R.id.postListView);

            for (Post post : posts) {
                posts_strs.add( post.ID + ": " + post.title);
            }
            ArrayAdapter<String> adapter = new ArrayAdapter<String>(PostActivity.this,R.layout.single_post_item,R.id.textView, posts_strs);

            listview.setAdapter(adapter);

        }
    };

    private final Response.ErrorListener onPostsError = new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            Log.e(PostActivity.class.getSimpleName(), error.toString());
        }
    };
}

【问题讨论】:

    标签: android post gson android-volley


    【解决方案1】:

    您必须更新fetchPosts 方法的StringRequest 实例:

    StringRequest request = new StringRequest(Request.Method.POST, ENDPOINT, onPostsLoaded, onPostsError) {    
    
        @Override
        protected Map<String, String> getParams() {  
            Map<String, String>  params = new HashMap<String, String>();  
            params.put("operation", "listApps");  
    
            // Create a POJO matching user structure and serialize this object to JSON to send it
            params.put("user", "String matching format you want to send");
    
            return params;  
        }
    };
    

    【讨论】:

      【解决方案2】:

      您可以使用以下代码,发送实体(java 类),返回实体(类)并将数据以 json 格式发送到 API

      public class JsonRequest<T> extends Request<T> {
              private static final String TAG = "JsonRequestHelper";
              private final Gson gson = new Gson();
              private final Class<T> returnType;
              private final Object model;
              private final Map<String, String> headers;
              private final Response.Listener<T> listener;
      
              /**
               * Make a GET request and return a parsed object from JSON.
               *
               * @param url        URL of the request to make
               * @param returnType Relevant class object, for Gson's reflection
               * @param headers    Map of request headers
               */
              public JsonRequest(Integer httpVerb, String url, Class<T> returnType, Object model, Map<String, String> headers,
                                 Response.Listener<T> listener, Response.ErrorListener errorListener) {
                  super(httpVerb, url, errorListener);
                  this.returnType = returnType;
                  this.model = model;
                  this.headers = headers;
                  this.listener = listener;
              }
      
              @Override
              public Map<String, String> getHeaders() throws AuthFailureError {
                  return headers != null ? headers : super.getHeaders();
              }
      
              public static Map<String, String> getMapFromEntity(Object entity) {
                  try {
                      Map<String, String> map = new HashMap<String, String>();
                      Field[] fields = entity.getClass().getFields();
                      for (Field f : fields)
                          if (f != null && f.getModifiers() == Modifier.PUBLIC)
                              map.put(f.getName(), f.get(entity).toString());
                      return map;
                  } catch (IllegalAccessException error) {
                      Log.e(TAG, error.getMessage());
                      return null;
                  }
              }
      
              @Override
              protected void deliverResponse(T response) {
                  listener.onResponse(response);
              }
      
              @Override
              public String getBodyContentType() {
                  return "application/json; charset=utf-8";
              }
      
              @Override
              public byte[] getBody() {
                  return gson.toJson(this.model).getBytes();
              }
      
              @Override
              protected Response<T> parseNetworkResponse(NetworkResponse response) {
                  try {
                      String json = new String(
                              response.data,
                              HttpHeaderParser.parseCharset(response.headers));
                      return Response.success(
                              gson.fromJson(json, returnType),
                              HttpHeaderParser.parseCacheHeaders(response));
                  } catch (UnsupportedEncodingException e) {
                      return Response.error(new ParseError(e));
                  } catch (JsonSyntaxException e) {
                      return Response.error(new ParseError(e));
                  }
              }
          }
      

      【讨论】:

        猜你喜欢
        • 2019-04-12
        • 2016-07-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多