- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我的 Volley 代码曾经像这样正常工作:
StringRequest stringRequest = new StringRequest(method, URL, listener, errorListener){
@Override
protected Map<String, String> getParams() throws AuthFailureError {
//parameters are declared above this part of the code
return parameters;
}
};
然后我从服务器端的 php 文件中得到错误 403。人们建议在请求中添加 header 。所以我将我的代码更改为:
StringRequest stringRequest = new StringRequest(method, URL, listener, errorListener){
@Override
protected Map<String, String> getParams() throws AuthFailureError {
//parameters are declared above this part of the code
return parameters;
}
@Override
public Map<String, String> getHeaders() throws AuthFailureError
{
Map<String, String> headers = new HashMap<String, String>();
headers.put("Content-Type", "application/form-data; charset=utf-8");
return headers;
}
};
添加 header 后,我能够摆脱错误 403,但现在 Volley 没有将我的参数传递给服务器。一切似乎都是空的。
我也尝试使用 getBodyContentType() 而不是 GetHeaders() 但仍然出现同样的问题。
编辑,整个代码:
public static void execute(final Request request, Context context){
if(queue == null)
queue = Volley.newRequestQueue(context);
final Map<String, String> parameters = new HashMap<String, String>();
for(int index = 0; index < request.getParameters().length; index++){
parameters.put(request.getParameters()[index].getName(), request.getParameters()[index].getValue());
}
int method;
switch (request.getRequestType()){
case GET: method = Method.GET; break;
case POST: method = Method.POST; break;
default: method = Method.POST; break;
}
String URL = request.getURL();
VolleyRequest newPostRequest = new VolleyRequest
(com.android.volley.Request.Method.POST, URL, parameters, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
request.onResponse(response.toString());
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
System.out.println(error.getMessage());
// TODO Auto-generated method stub
}
})
{
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
Map<String, String> headers = new HashMap<String, String>();
headers.put("Content-Type", "aapplication/x-www-form-urlencoded; charset=UTF-8");
return headers;
}
};
queue.add(newPostRequest);
}
服务器端:
<?php
require_once 'connection.php';
$name = $_POST['name'];
$token = $_POST['token'];
if(strlen($name) < 4){
$feed = array("Result" => "Failed", "Message" => "Name must be at least four characters!");
echo json_encode($feed);
die;
}
$sql = $conn->prepare("SELECT name FROM user WHERE name = :name");
$sql->bindParam(':name', $name);
$sql->execute();
if($sql->rowCount() > 0){
$feed = array("Result" => "Failed", "Message" => "This name is already taken!");
echo json_encode($feed);
die;
}
$sql = $conn->prepare("INSERT INTO user (name, device_token) VALUES (:name, :token)");
$sql->bindParam(':name', $name);
$sql->bindParam(':token', $token);
$sql->execute();
$id = $conn->lastInsertId();
$feed = array("Result" => "Successful", "ID" => $id);
echo json_encode($feed);
?>
最佳答案
沿着这条路走。使用此自定义请求类。
public class VolleyRequest extends Request<JSONObject> {
private Response.Listener<JSONObject> listener;
private Map<String, String> params;
public VolleyRequest(String url, Map<String, String> params,
Response.Listener<JSONObject> reponseListener, Response.ErrorListener errorListener) {
super(Method.GET, url, errorListener);
this.listener = reponseListener;
this.params = params;
}
public VolleyRequest(int method, String url, Map<String, String> params,
Response.Listener<JSONObject> reponseListener, Response.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));
}
}
}
并像这样实现 -
Map<String, String> params = new HashMap<String, String>();
params.put("param_1", "value_1");
params.put("param_2", "value_2");
VolleyRequest newPostRequest = new VolleyRequest
(Request.Method.POST, url, params, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
Log.d(CLASS_NAME, " Response: " + response.toString());
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
// TODO Auto-generated method stub
}
}){
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
Map<String, String> headers = new HashMap<String, String>();
headers.put("Content-Type", "application/form-data; charset=utf-8");
return headers;
}
};
Volley.newRequestQueue(context.getApplicationContext()).add(newPostRequest);
Edit2:服务器端代码:
require_once 'connection.php';
$name = $_POST['name'];
$token = $_POST['token'];
if(strlen($name) < 4){
$feed = array("Result" => "Failed", "Message" => "Name must be at least four characters!");
echo json_encode($feed);
die;
}
$sql = $conn->prepare("SELECT name FROM user WHERE name = :name");
$sql->bindParam(':name', $name);
$sql->execute();
if($sql->rowCount() > 0){
$feed = array("Result" => "Failed", "Message" => "This name is already taken!");
echo json_encode($feed);
die;
}
$sql = $conn->prepare("INSERT INTO user (name, device_token) VALUES (:name, :token)");
$sql->bindParam(':name', $name);
$sql->bindParam(':token', $token);
$sql->execute();
$id = $conn->lastInsertId();
$feed = array("Result" => "Successful", "ID" => $id);
echo json_encode($feed);
关于android - Volley StringRequest header block 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42508091/
我想使用 Volley StringRequest 将 base64 编码的图像和一些文本上传到我的网络服务器。 当我直接尝试发送 base64 字符串时,我得到“意外响应代码 503”,但是当我压缩
我有一些从谷歌应用程序脚本接收数据的方法,但为所有方法放置相同的代码有点长。 例如,这是我的 checkIn 方法,但我需要创建 checkOut 方法或 UpdateReservation 来从 g
我正在使用 android volley ,我想用 stringRequest 发送发布数据。但参数不发送到服务器。这是我的代码: StringRequest jsonObjReq =
我是 Android 的新手,我希望得到有关 StringRequestVolley 的帮助。在我的项目中,我将调用多个 API。为此,我创建了一个名为 ProcessAPIRequest 的方法。为
我正在尝试使用 Volley 发送请求,但我不知道如何让它工作。 我需要发送一个以 JSON 编码数据作为正文的 POST 请求,但在尝试了数小时不同的方法后,我仍然无法让它工作。 这是我当前的请求代
我对应该使用哪个感到有点困惑。 尽管其响应是 JSON 字符串,但该 API 试图接受常规文本发布参数。 我应该使用哪个? 最佳答案 为此,您可以使用 JSON 对象请求。 关于android - 我
我用过this简单的获取请求代码 final StringBuilder result = new StringBuilder(); RequestQueue queue = Voll
我正在创建一个按钮,单击该按钮会调用 checkUserName 方法,该方法会搜索数据库并告知用户名是否可用。 URL_CHECK_USERNAME 响应“用户名可用”或“用户名不可用”。
我已经放置了这个依赖项使用 volley 并从受尊重的 URl 获取 JSON 数据:- **compile 'me.neavo:volley:2014.12.09'** 放置此后没有得到 Strin
我正在尝试从 Android 发出 POST 请求以在我的 phpmyadmin 中插入一些信息。 我在用什么 Slim 与存储在 phpmyadmin 的数据库建立连接和查询。 XAMPP 模拟本地
我的 Volley 代码曾经像这样正常工作: StringRequest stringRequest = new StringRequest(method, URL, listener, errorL
下面的代码将实现一个简单的在线登录系统。 php 脚本路径在常量 authenticationURL 中定义(MainActivity.java 中的第 34 行)。它已经过 Postman 测试,可
api 调用发送了正确的响应,但是当我从 Volley StringRequest 得到响应时,撇号符号更改为不可读的字符。 我用来进行 api 调用的代码是这样的: private fun make
我已经能够使用 volley 从 url 获取字符串。该字符串现在在 TextView 中显示为一个 block 。但我希望能够在单独的 TextView 中显示这些数据。我怎样才能做到这一点? 也许
我正在使用以下代码在我服务器上的 sql 数据库中注册用户。 package com.cc.envoycc.activity; import android.app.Activity; import
我目前正在 fragment 内处理 ListView 。它工作得很好,但我需要使用用户的用户名过滤 ListView 上的数据。我如何能够使用请求传递“用户名”?任何帮助、建议和提示将不胜感激。预先
我试图通过在 Android 中使用 StringRequest 以及 POST 方法来获取 JSONArray。 php脚本的写法如下: $statement = mysqli_prepare($c
我有以下代码可以调用和接收 xml。 StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
当我在调试器中运行该方法时,数据按预期显示,但是每当我尝试使用它执行任何操作时,parentObject 的值都会返回为 null。 我只是想从服务器获取响应并将其存储为 JSONObject 以便在
我正在使用 Android Volley 进行网络通话。一般我使用JSONRequest接收json数据,然后使用GSON将它们转换成对象。 new Response.Listener() {
我是一名优秀的程序员,十分优秀!