我正在尝试在我的项目中使用 volley 来处理我的所有 HTTP 请求,因为据我所知,它是最有效的请求。于是我就跟着这个AndroidHive tutorial开始学习 Volley 。 .
我的第一个 GET 请求成功。然后我继续进行 POST 请求,但失败了。我在 Stack Overflow 上看到很多人在将 volley 的 post 请求与 PHP 结合起来时遇到问题。我相信我们无法使用 $_POST[""]
的正常方式访问它,因为 volley 将 JSON 对象发送到我们指定的 URL。
我尝试了很多解决方案,但都没有成功。我想应该有一种简单而标准的方式将 volley 与 PHP 一起使用。所以我想知道我需要做什么才能在我的 PHP 代码中接收 volley 发送的 json 对象。
还有如何检查 volley 是否真的在发送 JSON 对象?
我发送简单帖子请求的截击代码:
JsonObjectRequest jsonObjReq = new JsonObjectRequest(Method.POST,
url, null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
Log.d(TAG, response.toString());
pDialog.hide();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
VolleyLog.d(TAG, "Error: " + error.getMessage());
pDialog.hide();
}
}) {
@Override
protected Map<String, String> getParams() {
Map<String, String> params = new HashMap<String, String>();
params.put("name", "Droider");
return params;
}
};
// Adding request to request queue
AppController.getInstance().addToRequestQueue(jsonObjReq, tag_json_obj);
我的 PHP 代码接收 json 对象:(我很确定这是错误的方式,我在 PHP 方面不是那么好)
<?php
$jsonReceiveData = json_encode($_POST);
echo $jsonReceivedData;
?>
我尝试了很多在 PHP 中接受 JSON 对象的方法,比如这个
echo file_get_contents('php://input');
结果
null
编辑(感谢 Georgian Benetatos 的正确方法)
我创建了你提到的类,类名是CustomRequest
,如下:
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;
}
@Override
protected Map<String, String> getParams() throws com.android.volley.AuthFailureError {
return params;
};
@Override
protected void deliverResponse(JSONObject response) {
listener.onResponse(response);
}
@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));
}
}
}
现在在我的 Activity 中,我调用了以下内容:
String url = some valid url;
Map<String, String> params = new HashMap<String, String>();
params.put("name", "Droider");
CustomRequest jsObjRequest = new CustomRequest(Method.POST, url, params, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try {
Log.d("Response: ", response.toString());
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError response) {
Log.d("Response: ", response.toString());
}
});
AppController.getInstance().addToRequestQueue(jsObjRequest);
我的PHP代码如下:
<?php
$name = $_POST["name"];
$j = array('name' =>$name);
echo json_encode($j);
?>
现在它返回正确的值:
Droider
最佳答案
自己有很多问题,试试这个!
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> responseListener, ErrorListener errorListener) {
super(Method.GET, url, errorListener);
this.listener = responseListener;
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;
}
@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) {
listener.onResponse(response);
}
PHP
$username = $_POST["username"];
$password = $_POST["password"];
echo json_encode($response);
你要制作 map , map 支持键值类型,比你用 Volley 发帖。 在 php 中你得到 $variable = $_POST["key_from_map"] 来检索它在 $variable 中的值 然后构建响应并对其进行 json_encode。
这是一个如何查询 sql 并将答案返回为 JSON 的 php 示例
$response["devices"] = array();
while ($row = mysqli_fetch_array($result)) {
$device["id"] = $row["id"];
$device["type"] = $row["type"];
array_push($response["devices"], $device);
}
$response["success"] = true;
echo json_encode($response);
这里可以看到响应类型是JSONObject
public CustomRequest(int method, String url,Map<String, String> params, Listener<JSONObject> reponseListener, ErrorListener errorListener)
看监听器的参数!
https://stackoverflow.com/questions/25948191/