【问题标题】:Volley, not passing any parameters in JsonArrayRequestVolley,未在 JsonArrayRequest 中传递任何参数
【发布时间】:2016-03-29 06:59:16
【问题描述】:

我从发布参数到我的服务器时收到一个错误,就像我的参数根本没有传递到我的服务器一样......我得到的是:

D/Searching: Error: org.json.JSONException: Value {"error_msg":"please choose city to view taxi list"}

该消息仅在我的服务器端 isset($_POST['from'] 等时才会出现

这是我的代码:

// Creating volley request obj
            JsonArrayRequest taxiReq = new JsonArrayRequest(Request.Method.POST, url,
                    new Response.Listener<JSONArray>() {
                        @Override
                        public void onResponse(JSONArray response) {
                            Log.d(TAG, response.toString());

                            // Parsing json
                            for (int i = 0; i < response.length(); i++) {
                                try {

                                    JSONObject obj = response.getJSONObject(i);
                                    Taxi taxi = new Taxi();
                                    taxi.settaxiname(obj.getString("taxiname"));
                                    taxi.setThumbnailUrl(obj.getString("image"));
                                    taxi.setdeparture(obj.getString("departure"));
                                    taxi.setarrive(obj.getString("arrive"));
                                    taxi.setseat(obj.getInt("seat"));
                                    taxi.setcost(obj.getInt("cost"));

                                    // adding taxi to taxi array
                                    taxiList.add(taxi);

                                } catch (JSONException e) {
                                    e.printStackTrace();
                                }

                            }

                            // notifying list adapter about data changes
                            // so that it renders the list view with updated data
                            adapter.notifyDataSetChanged();
                        }
                    }, new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    Log.d(TAG, "Error: " + error.getMessage());
                }
            })
            {
                @Override
                protected Map<String, String> getParams()
                {
                    Map<String, String>  params = new HashMap<String, String>();
                    params.put("from", textfrom_btn);
                    params.put("to", textto_btn);
                    params.put("seat", totalpassenger);

                    return params;
                }
            };

            // Adding request to request queue
            MyApplication.getInstance().addToRequestQueue(taxiReq);

这是json:

[
    {
      "image": "http://localhost/androidapp/taxiprofile/1.jpg",
      "taxiname": "Taxi 1",
      "from": "PTK",
      "to": "SGU",
      "departure": "08:00:00",
      "arrive": "13:00:00",
      "seat": 7,
      "cost": 12
    },
    {
      "image": "http://localhost/androidapp/taxiprofile/default.jpg",
      "taxiname": "Taxi 2",
      "from": "PTK",
      "to": "SGU",
      "departure": "08:00:00",
      "arrive": "13:00:00",
      "seat": 2,
      "cost": 15
    },
    {
      "image": "http://localhost/androidapp/taxiprofile/2.jpg",
      "taxiname": "Taxi Untung Selalu",
      "from": "PTK",
      "to": "SGU",
      "departure": "09:00:00",
      "arrive": "14:00:00",
      "seat": 3,
      "cost": 13
    }
  ]

这里是我服务器中的 php 代码:

<?php
include './include/DbHandler.php';
$db = new DbHandler();

// json response array
$response = array();

if (isset($_POST['from']) && isset($_POST['to']) && isset($_POST['totalpassenger'])) {

    // receiving the post params
    $from = $_POST['from'];
    $to = $_POST['to'];
    $totalpassenger = $_POST['totalpassenger'];

    // get the user by email and password
    $taxilist = $db->getTaxi($from, $to, $totalpassenger);

    if ($taxilist != false) {
        // taxi is found
        foreach( $taxilist as $data ){
            $response[] = array(
                "image" => "http://".$_SERVER['SERVER_NAME'].dirname($_SERVER['REQUEST_URI']).$data["image"],
                "taxiname" => $data["taxiname"],
                "from" => $data["from"],
                "to" => $data["to"],
                "departure" => $data["departure"],
                "arrive" => $data["arrive"],
                "seat" => $data["seat"],
                "cost" => $data["cost"]
            );
        }
        echo json_encode($response);
    } else {
        $response["error_msg"] = "Sorry taxi is not listed";
        echo json_encode($response);
    }
} else {
    $response["error_msg"] = "please choose city to view taxi list";
    echo json_encode($response);
}
?>

代码中有语法错误吗?

编辑 这是我使用 CustomJsonRequest 后的 logcat

03-29 16:11:06.070 25258-25258/com.testing W/EGL_genymotion: eglSurfaceAttrib not implemented
03-29 16:11:06.078 25258-25258/com.testing D/OpenGLRenderer: TextureCache::get: create texture(0xb85fe538): name, size, mSize = 389, 5184, 173360
03-29 16:11:06.082 25258-25258/com.testing D/OpenGLRenderer: TextureCache::get: create texture(0xb8489018): name, size, mSize = 391, 19264, 192624
03-29 16:11:55.714 25258-25258/com.testing D/Searching: []

【问题讨论】:

  • 收到上述 json 响应后,您是如何发出 post 请求的?请提及帖子变量
  • 它们是 textfrom_btn = "PTK", textto_btn = "SGU", totalpassenger = 2...这些是我试图传递给我的 php 的变量...这些是什么意思发布变量?
  • 你能展示你服务器的完整代码吗?您的 JsonArrayRequest 看起来有效
  • 似乎您没有将所有参数传递给服务器。再次检查您的POST 参数
  • 再次查看我的帖子,我的服务器上已包含代码...

标签: android json android-volley


【解决方案1】:

在我遇到同样问题之前的一天。这不是您的代码的问题。实际上 JsonArrayRequest 类扩展了 JsonRequest,后者扩展了 Request。 在 JsonRequest 类中,getBody() 方法已被覆盖,看起来如此

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

如果你仔细观察 getParams() 方法是不会被调用的。

所以我所做的是创建一个new CLASS,它像这样扩展Request&lt;JsonArrayRequest&gt;

 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<JSONArray> {

    private Listener<JSONArray> 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<JSONArray> 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<JSONArray> 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(JSONArray response) {
        // TODO Auto-generated method stub
        listener.onResponse(response);
    }
}

您可以覆盖此类中的 getParams() 方法,并像这样将其用于您的请求。

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

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

    }
});

我希望这会有所帮助。谢谢你

【讨论】:

  • 它在 logcat 上给了我“D/Searching: []”
  • 这不是与 Json 相关的错误。这可能与您的模拟器有关。您可以将数据发送到您的服务器吗?
  • 我的taxiList里面什么都没有,它只是一个空数组[]
  • 你的反应是什么?祝您回复并检查
  • 这是我的回复,你会在 Log.d(TAG, response.toString()); 中看到它
【解决方案2】:

上周我遇到了这个问题,这与 Volley 没有以正确的方式设置 POST 参数有关。我没有修复它,而是使用 GET 请求,看起来你可以做同样的事情,因为参数似乎不是那么敏感。

如果你想尝试一个 GET 请求,你可以这样做。当然你也必须在 PHP 中从 POST 切换到 GET!

网址是这样创建的:

URL url = null;
String query = "?from=" + textfrom_btn +
    "&to="       + textto_btn +
    "&seat="   + totalpassenger;
try {
    url = new URL("http", "www.Foo.com", "Bar.php" + query);
}catch (MalformedURLException ex){
    ex.printStackTrace();
}

请求如下所示:

JsonArrayRequest taxiReq = new JsonArrayRequest(Request.Method.GET, url.toString(), null, new Response.Listener<JSONArray>(){
    @Override
    public void onResponse(JSONArray response){
        for(int i = 0; i < response.length(); i++){
            try{
                 JSONObject obj = response.getJSONObject(i);
                                Taxi taxi = new Taxi();
                                taxi.settaxiname(obj.getString("taxiname"));
                                taxi.setThumbnailUrl(obj.getString("image"));
                                taxi.setdeparture(obj.getString("departure"));
                                taxi.setarrive(obj.getString("arrive"));
                                taxi.setseat(obj.getInt("seat"));
                                taxi.setcost(obj.getInt("cost"));

                                // adding taxi to taxi array
                                taxiList.add(taxi);

            }catch(JSONException e){
                e.printStackTrace();
            }
        }
        adapter.notifyDataSetChanged();


    }
}, new Response.ErrorListener(){
    @Override
    public void onErrorResponse(VolleyError error){
        error.printStackTrace();
    }
});
MyApplication.getInstance().addToRequestQueue(taxiReq);

}

【讨论】:

  • 我不想使用 GET 请求,它容易受到注入和安全性的影响
  • 完全可以理解!我也会尝试在我的项目中使用@Jois 提供的解决方案。
猜你喜欢
  • 1970-01-01
  • 2017-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多