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);
#1 楼
尝试使用此帮助程序类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);
}
}
在活动/碎片中,请使用此
RequestQueue requestQueue = Volley.newRequestQueue(getActivity());
CustomRequest jsObjRequest = new CustomRequest(Method.POST, url, params, this.createRequestSuccessListener(), this.createRequestErrorListener());
requestQueue.add(jsObjRequest);
评论
谢谢!为什么在JsonObjectRequest中重写getParams()不起作用?是凌空虫吗?
–Thein
13年12月28日在9:26
这不是错误,getParams()不会调用,因为JsonObjectRequest扩展了JsonRequest,后者直接调用getBody()来将构造函数的第二个参数(调用requestBody)编码为contentType,这就是为什么它忽略了getParam()方法。
–VinceStyling
2014年6月25日7:25
@LOG_TAG这是什么this.createRequestSuccessListener(),this.createRequestErrorListener());我不明白,请解释。
– ik024
2014-09-22 4:47
@Droider这些方法可以创建适当的响应处理对象。出于可读性考虑,很可能使它们成为单独的方法。您也可以使用new关键字在适当的位置创建对象,但是根据这些对象的代码大小,可能很难一目了然。
– jnfjnjtj
14-10-21在19:29
我有很多问题,这很好用:D谢谢
–哈维尔
2014年12月4日18:45
#2 楼
您可以创建自定义JSONObjectReuqest
并覆盖getParams
方法,也可以在构造函数中将它们作为JSONObject
放置在请求的正文中。 JSONObject obj = new JSONObject();
obj.put("id", "1");
obj.put("name", "myname");
RequestQueue queue = MyVolley.getRequestQueue();
JsonObjectRequest jsObjRequest = new JsonObjectRequest(Request.Method.POST,SPHERE_URL,obj,
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();
}
});
queue.add(jsObjRequest);
评论
好又快!但是如果您需要x-www-urlencoded,它是由凌空完成的吗?
– Poutrathor
2013年11月7日14:55
我不确定,但是您可以轻松对其进行测试。
–伊泰·汉斯基(Itai Hanski)
13年7月7日在15:02
您确定不会调用getParams吗?相反,代码显示它由getBody()和getPostParams()调用,您在这里说相反:stackoverflow.com/questions/18484647/…
– Poutrathor
13年7月7日在15:18
没错,我在两种方法之间混在一起(睡眠不足)。我编辑了答案。
–伊泰·汉斯基(Itai Hanski)
2013年11月7日15:26
尝试使用POST和GET方法。两者都不起作用。我不知道了
–阿米尔·法兹万(Amir Fazwan)
2015年10月13日在17:48
#3 楼
对我来说很简单!我几周前就知道了:这是在
getBody()
方法中使用的,而不是在getParams()
中用于发布请求的方法。 这里是我的:
@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中编写的参数)
我在构造函数中为请求提供了参数,但是由于您是在动态创建请求的,因此可以在重写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字符串。 评论
我不明白如何在这里传递参数。 String s =新的String(param)。它是什么?
–pmb
2013年11月7日14:14
这只是我的参数所在的字符串。我在构造函数中发送它。我再给你看看。
– Poutrathor
13年7月7日在14:18
感谢@poutrathor,如果您能告诉我如何在getParams()方法中发送该参数。
– pmb
2013年11月7日14:22
啊。因此,您想将它们用作参数。出于好奇,您将什么发布到服务器?
– Poutrathor
13年7月7日在14:30
我的目标是我必须发送类似getParams中编写的参数,而不能在那里发送jsonObject。
– pmb
2013年11月7日14:33
#4 楼
当使用JsonObject请求时,您需要在初始化中传递链接之后立即传递参数,请看以下代码: HashMap<String, String> params = new HashMap<>();
params.put("user", "something" );
params.put("some_params", "something" );
JsonObjectRequest request = new JsonObjectRequest(Request.Method.POST, "request_URL", new JSONObject(params), new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
// Some code
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
//handle errors
}
});
}
#5 楼
您需要做的就是重写Request类中的getParams方法。我遇到了同样的问题,我搜索了所有答案,但找不到合适的答案。问题与get请求不同,服务器重定向的post参数可能会被丢弃。例如,阅读此内容。因此,不要冒险将您的请求由Web服务器重定向。如果您定位的是http:// example / myapp,请提及您的服务的确切地址,即http://example.com/myapp/index.php。Volley可以正常运行,很完美,这是问题所在源于其他地方。
#6 楼
覆盖函数getParams可以正常工作。您使用POST方法,并且已将jBody设置为null。这就是为什么它不起作用。如果要发送空的jBody,则可以使用GET方法。我已经覆盖了getParams方法,它可以与GET方法(和null jBody)一起使用,也可以与POST方法(和jBody!= null)一起使用
这里也有所有示例
#7 楼
我曾经遇到过同样的问题,空POST数组是由于请求的重定向(在您的服务器端)引起的,请修复URL,以便在命中服务器时不必重定向。例如,如果在服务器端应用程序上使用.htaccess文件强制使用https,请确保客户端请求的前缀为“ https://”。通常,当发生重定向时,POST数组会丢失。希望对您有所帮助!#8 楼
它可以尝试用Volley Json使用Java代码进行请求和响应调用。public void callLogin(String sMethodToCall, String sUserId, String sPass) {
RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(
Request.Method.POST, ConstantValues.ROOT_URL_LOCAL + sMethodToCall.toString().trim(), addJsonParams(sUserId, sPass),
// JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.POST, url, object,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
Log.d("onResponse", response.toString());
Toast.makeText(VolleyMethods.this, response.toString(), Toast.LENGTH_LONG).show(); // Test
parseResponse(response);
// msgResponse.setText(response.toString());
// hideProgressDialog();
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
VolleyLog.d("onErrorResponse", "Error: " + error.getMessage());
Toast.makeText(VolleyMethods.this, error.toString(), Toast.LENGTH_LONG).show();
// hideProgressDialog();
}
}) {
/**
* Passing some request headers
*/
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
HashMap<String, String> headers = new HashMap<String, String>();
headers.put("Content-Type", "application/json; charset=utf-8");
return headers;
}
};
requestQueue.add(jsonObjectRequest);
}
public JSONObject addJsonParams(String sUserId, String sPass) {
JSONObject jsonobject = new JSONObject();
try {
// {"id":,"login":"secretary","password":"password"}
///***//
Log.d("addJsonParams", "addJsonParams");
// JSONObject jsonobject = new JSONObject();
// JSONObject jsonobject_one = new JSONObject();
//
// jsonobject_one.put("type", "event_and_offer");
// jsonobject_one.put("devicetype", "I");
//
// JSONObject jsonobject_TWO = new JSONObject();
// jsonobject_TWO.put("value", "event");
// JSONObject jsonobject = new JSONObject();
//
// jsonobject.put("requestinfo", jsonobject_TWO);
// jsonobject.put("request", jsonobject_one);
jsonobject.put("id", "");
jsonobject.put("login", sUserId); // sUserId
jsonobject.put("password", sPass); // sPass
// js.put("data", jsonobject.toString());
} catch (JSONException e) {
e.printStackTrace();
}
return jsonobject;
}
public void parseResponse(JSONObject response) {
Boolean bIsSuccess = false; // Write according to your logic this is demo.
try {
JSONObject jObject = new JSONObject(String.valueOf(response));
bIsSuccess = jObject.getBoolean("success");
} catch (JSONException e) {
e.printStackTrace();
Toast.makeText(VolleyMethods.this, "" + e.toString(), Toast.LENGTH_LONG).show(); // Test
}
}
#9 楼
构建gradle(app)
dependencies {
implementation fileTree(dir: "libs", include: ["*.jar"])
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
implementation 'androidx.core:core-ktx:1.1.0'
implementation 'androidx.appcompat:appcompat:1.1.0-alpha01'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
implementation 'com.android.volley:volley:1.1.1'
}
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
MainActivity
当您使用JsonObjectRequest时,必须发送一个jsonobject并接收jsonobject,否则您将收到一条错误消息,因为它仅接受jsonobject。
import com.android.volley.Request
import com.android.volley.Response
import com.android.volley.toolbox.JsonObjectRequest
import com.android.volley.toolbox.Volley
fun peticion(){
val jsonObject = JSONObject()
jsonObject.put("user", "jairo")
jsonObject.put("password", "1234")
val queue = Volley.newRequestQueue(this)
val url = "http://192.168.0.3/get_user.php"
// GET: JsonObjectRequest( url, null,
// POST: JsonObjectRequest( url, jsonObject,
val jsonObjectRequest = JsonObjectRequest( url, jsonObject,
Response.Listener { response ->
// Check if the object 'msm' does not exist
if(response.isNull("msm")){
println("Name: "+response.getString("nombre1"))
}
else{
// If the object 'msm' exists we print it
println("msm: "+response.getString("msm"))
}
},
Response.ErrorListener { error ->
error.printStackTrace()
println(error.toString())
}
)
queue.add(jsonObjectRequest)
}
文件php get_user.php
<?php
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Headers: *");
// we receive the parameters
$json = file_get_contents('php://input');
$params = json_decode($json);
error_reporting(0);
require_once 'conexion.php';
$mysqli=getConex();
$user=$params->user;
$password=$params->password;
$res=array();
$verifica_usuario=mysqli_query($mysqli,"SELECT * FROM usuarios WHERE usuario='$user' and clave='$password'");
if(mysqli_num_rows($verifica_usuario)>0){
$query="SELECT * FROM usuarios WHERE usuario='$user'";
$result=$mysqli->query($query);
while($row = $result->fetch_array(MYSQLI_ASSOC)){
$res=$row;
}
}
else{
$res=array('msm'=>"Incorrect user or password");
}
$jsonstring = json_encode($res);
header('Content-Type: application/json');
echo $jsonstring;
?>
文件php conexion
<?php
function getConex(){
$servidor="localhost";
$usuario="root";
$pass="";
$base="db";
$mysqli = mysqli_connect($servidor,$usuario,$pass,$base);
if (mysqli_connect_errno($mysqli)){
echo "Fallo al conectar a MySQL: " . mysqli_connect_error();
}
$mysqli->set_charset('utf8');
return $mysqli;
}
?>
评论
您能解释一下这段代码吗?现在还不清楚如何解决问题。
– Ryan M
10月21日6:22
评论
谢谢你的问题。我也遇到了JsonObjectRequest的麻烦。所以,我只使用普通的StringRequest。然后就可以了。看来是排球虫。我可以知道你是怎么解决的吗?当然是。您必须像在这里stackoverflow.com/questions/19837820/…中创建您的CustomJsonObjectRequest。
谢谢你的慰问!我也有同样的问题..
因为构造函数的第三个参数为null。
@ njzk2:我认为pmb尝试发送带有url编码参数而不是JSON正文的POST请求,这是第三个参数的目的。 LOG_TAG的答案似乎最合适:一个接受参数且仍允许JSON响应的自定义类。