【问题标题】:Android Volley getParams() method not getting called for JsonObjectRequest没有为 JsonObjectRequest 调用 Android Volley getParams() 方法
【发布时间】:2016-03-24 11:42:32
【问题描述】:

我已经覆盖了getParams(),并且mEmailmUsername 等都是全局声明的。

@Override
public Map<String, String> getParams() throws AuthFailureError {
    Map<String,String> params = new Hashtable<String, String>();

    params.put("Email", mEmail.getText().toString().trim());
    params.put("Username",mUsername.getText().toString().trim());
    params.put("Password",mPassword.getText().toString().trim());
    params.put("BirthDay",mBirthday.getText().toString().replaceAll("\\s","-"));
    params.put("Sex",SelectedRadio());
    params.put("Bitmap",getEncodedBitmap());

    return params;
}

这是我的服务器端代码:

<?php
require "init1.php";

$email = $_POST["Email"];
$password = $_POST["Password"];
$Username  = $_POST["Username"];
$Sex = $_POST["Sex"];
$ProfilePicture = $_POST["Bitmap"];

$timestamp = strtotime($_POST["BirthDay"]);
$BirthDay = date('Y-m-d',$timestamp);

$sql = "select * from Registered_Users where Username='$Username'";
$sqle = "select * from Registered_Users where Email='$email'";
try{
    $result1 = mysqli_query($con, $sqle) or die(mysqli_error($con));;
    $result = mysqli_query($con, $sql) or die(mysqli_error($con));;
} catch(Exception $e) {
    echo $e->getMessage();
}

if (mysqli_num_rows($result) > 0){
    $myclass = new stdClass();
    $myclass->status="Not Ok";

    echo json_encode($myclass);
} else if(mysqli_num_rows($result1) > 0) {
    $myclass = new stdClass();
    $myclass->status="Not Ok";

    echo json_encode($myclass);
} else{
    try{
        $sql_query = "insert into Registered_Users (Email, Password, BirthDay, Sex, Username, ProfilePicture) values('$email', '$password', '$BirthDay', '$Sex', '$Username', '$ProfilePicture')";

        if(mysqli_query($con,$sql_query)){
            $obj1 = new stdClass();
            $obj1->status="Ok";

            echo json_encode($obj1);
        } else {
            $obj1 = new stdClass();
            $obj1->status="Not Ok ";
        }
    } catch(Exception $e) {
        echo $e->getMessage();
    }
}
?>

我得到的响应总是not ok,因为我的数据库中已经有一个空行,我正在尝试再次上传一个空行。有人能告诉我为什么我无法获取数据吗?为什么我得到空数据?

【问题讨论】:

  • 你能在服务器上接收这些参数吗?
  • 我认为没有!这就是为什么它是空的!因为我尝试用吐司检查 mEmail.getText() 中的内容,它向我展示了价值。你知道有什么解决办法吗?

标签: php android android-volley


【解决方案1】:

使用此自定义截击请求类

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;

import org.json.JSONException;
import org.json.JSONObject;

import java.io.UnsupportedEncodingException;
import java.util.Map;

public class CustomJsonRequest extends Request<JSONObject> {

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

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

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

    @Override
    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);
    }
}

你可以使用它

Map<String,String> params = new Hashtable<String, String>();

params.put("Email", mEmail.getText().toString().trim());
params.put("Username",mUsername.getText().toString().trim());
params.put("Password",mPassword.getText().toString().trim());
params.put("BirthDay",mBirthday.getText().toString().replaceAll("\\s","-"));
params.put("Sex",SelectedRadio());
params.put("Bitmap",getEncodedBitmap());



CustomJsonRequest request = new CustomJsonRequest(Request.Method.POST, url, params,
        new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {

            }
        }, new Response.ErrorListener() {
    @Override
    public void onErrorResponse(VolleyError error) {

    }
});

request.setRetryPolicy(new DefaultRetryPolicy(DefaultRetryPolicy.DEFAULT_TIMEOUT_MS * 2, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
AppController.getInstance().getRequestQueue().add(request);

实际上这是使用 volley 发送参数的问题。检查这个答案 https://stackoverflow.com/a/27091088/1320616

编辑:对此行为的解释

您的 JsonObjectRequest 类从 JsonRequest 扩展而来,而 JsonRequest 从 Request 扩展而来。

在你的 Request 类中有一个方法

/**
     * Returns the raw POST or PUT body to be sent.
     *
     * <p>By default, the body consists of the request parameters in
     * application/x-www-form-urlencoded format. When overriding this method, consider overriding
     * {@link #getBodyContentType()} as well to match the new body format.
     *
     * @throws AuthFailureError in the event of auth failure
     */
    public byte[] getBody() throws AuthFailureError {
        Map<String, String> params = getParams();
        if (params != null && params.size() > 0) {
            return encodeParameters(params, getParamsEncoding());
        }
        return null;
    }

请注意,此方法正在调用 getParams() 方法。它与您在调用时覆盖的方法相同。

但是如果你看一下 JsonRequest 类里面,有一个方法

@Override
    public byte[] getBody() {
        try {
            return mRequestBody == null ? null : mRequestBody.getBytes(PROTOCOL_CHARSET);
        } catch (UnsupportedEncodingException uee) {
            VolleyLog.wtf("Unsupported Encoding while trying to get the bytes of %s using %s",
                    mRequestBody, PROTOCOL_CHARSET);
            return null;
        }
    }

这意味着 Request 的 getBody() 已被 JsonRequest 类的 getBody() 覆盖,这意味着您的 getParams() 将永远不会被调用。因此,您需要一个直接扩展 Request 类且不覆盖 Request 类的 getBody() 方法的自定义类。

【讨论】:

  • 但这有什么不同呢?我写的和你写的几乎一样,因为我这里最重要的是你要在 overrdien 方法体中实现的内容
  • 略有不同。您的普通 JsonObjectRequest 类继承自 JsonRequest,而您的 CustomJsonRequest 继承自 Request。我确定原因,但过去我也遇到过同样的问题,这解决了我的问题。会做一些研究然后回来。
  • 谢谢你!真的很有帮助
  • 我认为这只是 JsonObjectRequest 对吗?因为像 String 这样的其他请求可以与 getParams() 一起正常工作
  • 是的。您的 StringRequest 直接继承自 Request 类,这就是它在那里工作的原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-08
  • 1970-01-01
  • 2021-07-27
  • 2014-08-25
  • 2023-03-19
  • 2019-06-03
  • 1970-01-01
相关资源
最近更新 更多