android - volley教學 - volley java




Volley JsonObjectRequest發布請求無效 (5)

我正在使用android Volley提出請求。 所以我使用這段代碼。 我不明白一件事。 我檢查我的服務器,params始終為null。 我認為getParams()不起作用。 我該怎麼做才能解決這個問題。

 RequestQueue queue = MyVolley.getRequestQueue();
        JsonObjectRequest jsObjRequest = new JsonObjectRequest(Request.Method.POST,SPHERE_URL,null,
                new Response.Listener<JSONObject>() {
                    @Override
                    public void onResponse(JSONObject response) {
                        System.out.println(response);
                        hideProgressDialog();
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                      hideProgressDialog();
                    }
                }) {
            protected Map<String, String> getParams() throws AuthFailureError {
                Map<String, String> params = new HashMap<String, String>();
                params.put("id","1");
                params.put("name", "myname");
                return params;
            };
        };
        queue.add(jsObjRequest);

嘗試使用這個助手類

import java.io.UnsupportedEncodingException;
import java.util.Map;    
import org.json.JSONException;
import org.json.JSONObject;    
import com.android.volley.NetworkResponse;
import com.android.volley.ParseError;
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.Response.ErrorListener;
import com.android.volley.Response.Listener;
import com.android.volley.toolbox.HttpHeaderParser;

public class CustomRequest extends Request<JSONObject> {

    private Listener<JSONObject> listener;
    private Map<String, String> params;

    public CustomRequest(String url, Map<String, String> params,
            Listener<JSONObject> reponseListener, ErrorListener errorListener) {
        super(Method.GET, url, errorListener);
        this.listener = reponseListener;
        this.params = params;
    }

    public CustomRequest(int method, String url, Map<String, String> params,
            Listener<JSONObject> reponseListener, ErrorListener errorListener) {
        super(method, url, errorListener);
        this.listener = reponseListener;
        this.params = params;
    }

    protected Map<String, String> getParams()
            throws com.android.volley.AuthFailureError {
        return params;
    };

    @Override
    protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {
        try {
            String jsonString = new String(response.data,
                    HttpHeaderParser.parseCharset(response.headers));
            return Response.success(new JSONObject(jsonString),
                    HttpHeaderParser.parseCacheHeaders(response));
        } catch (UnsupportedEncodingException e) {
            return Response.error(new ParseError(e));
        } catch (JSONException je) {
            return Response.error(new ParseError(je));
        }
    }

    @Override
    protected void deliverResponse(JSONObject response) {
        // TODO Auto-generated method stub
        listener.onResponse(response);
    }
}

在activity / fragment中使用它

RequestQueue requestQueue = Volley.newRequestQueue(getActivity());
CustomRequest jsObjRequest = new CustomRequest(Method.POST, url, params, this.createRequestSuccessListener(), this.createRequestErrorListener());

requestQueue.add(jsObjRequest);

對我來說很簡單! 幾個星期前我得到了它:

這在getBody()方法中,而不是在getBody()中用於發布請求。

這是我的:

    @Override
/**
 * Returns the raw POST or PUT body to be sent.
 *
 * @throws AuthFailureError in the event of auth failure
 */
public byte[] getBody() throws AuthFailureError {
    //        Map<String, String> params = getParams();
    Map<String, String> params = new HashMap<String, String>();
    params.put("id","1");
    params.put("name", "myname");
    if (params != null && params.size() > 0) {
        return encodeParameters(params, getParamsEncoding());
    }
    return null;

}

(我假設你要發布你在getParams中寫的params)

我給構造函數中的請求提供了參數,但由於您正在動態創建請求,因此您可以在覆蓋getBody()方法的內部對其進行硬編碼。

這就是我的代碼:

    Bundle param = new Bundle();
    param.putString(HttpUtils.HTTP_CALL_TAG_KEY, tag);
    param.putString(HttpUtils.HTTP_CALL_PATH_KEY, url);
    param.putString(HttpUtils.HTTP_CALL_PARAM_KEY, params);

    switch (type) {
    case RequestType.POST:
        param.putInt(HttpUtils.HTTP_CALL_TYPE_KEY, RequestType.POST);
        SCMainActivity.mRequestQueue.add(new SCRequestPOST(Method.POST, url, this, tag, receiver, params));

如果你想要更多這個最後的字符串參數來自:

param = JsonUtils.XWWWUrlEncoder.encode(new JSONObject(paramasJObj)).toString();

paramasJObj是這樣的: {"id"="1","name"="myname"}通常的JSON字符串。


您需要做的就是覆蓋Request類中的getParams方法。 我有同樣的問題,我搜索了答案,但我找不到合適的答案。 問題與get請求不同,服務器重定向的post參數可能會被丟棄。 例如,閱讀this 。 因此,請不要冒著Web服務器重定向您的請求的風險。 如果您的目標是http://example/myapp ,請提及您服務的確切地址,即http://example.com/myapp/index.php
排球很好並且運作完美,問題源於其他地方。


我有同樣的問題一次,空的POST數組是由於請求的重定向(在服務器端)引起的,修復了URL,因此當它到達服務器時不必重定向。 例如,如果使用服務器端應用程序上的.htaccess文件強制使用https,請確保您的客戶端請求具有“https://”前綴。 通常在重定向發生時,POST數組會丟失。 我希望這有幫助!


覆蓋函數getParams工作正常。 您使用POST方法,並將jBody設置為null。 這就是為什麼它不起作用。 如果要發送null jBody,可以使用GET方法。 我已經覆蓋了方法getParams,它可以使用POST方法(和jBody!= null)使用GET方法(和null jBody)

這裡還有所有的例子







android-volley