php - Android Volley POST 请求格式问题
问题描述
我有一个 Android 应用程序,一旦按下按钮,就会向我服务器上的 .php 文件发送一个 HTTPRequest。在 HTTPRequest 中,我存储了在服务器端处理的 POST 变量。
这是我的代码:
public void sendRequest(Context context, String url, final HashMap<String, String> hm) {
RequestQueue queue = Volley.newRequestQueue(context);
Log.w("url", url);
// Request a string response from the provided URL.
StringRequest sr = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.w("Response", response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.w("Sending progress", "Failure");
}
}) {
@Override
public byte[] getBody() throws AuthFailureError {
return new JSONObject(hm).toString().getBytes();
}
@Override
protected Map<String, String> getParams()
{
return hm;
}
};
// Add the request to the RequestQueue.
queue.add(sr);
}
请注意,使用的 HashMap 变量被传递到方法本身,因为我想在不同的其他类中动态使用此方法。数据可以到达那里,但有一些明显的问题:
1)由于某种原因,我的 JSON 字符串作为“键”而不是“值”传输。实际上我刚才问了一个关于这个的问题——有人很友好地回答了我——你可以在POST data in PHP formatting issue中看到这个问题。有没有办法解决这个问题?
2)奇怪的是,当我的数据到达 PHP 时,所有的“”和“。” 字符被替换为“_”。我怀疑其他敏感字符会相同,例如“/”和“'”。我知道这是否是一个 GET 变量,但是对于 POST 变量,这是否仍然会发生?还是这与(1)有关?
- -编辑 - -
我传递给该方法的 HashMapsendRequest
是动态生成的,但通常它只是:
HashMap<String, String> hm = new HashMap<String, String>();
hm.put("personName", ((EditText) findViewById(R.id.text1).getText().toString().trim());
hm.put("personNumber", ((EditText) findViewById(R.id.text2).getText().toString().trim());
sendRequest(getApplicationContext(), "http://foo.com/bar.php", hm);
数据可以到达那里,它只是格式非常奇怪,它确实对我在服务器端的处理产生了影响。
解决方案
首先,在 onCreate 中初始化 RequestQueue。
RequestQueue queue = Volley.newRequestQueue(this);
然后准备变量
Map<String, String> params= new HashMap<>();
params.put("key1", "arg1");
params.put("key2", "arg2");
params.put("key3", "arg3");
并通过这个对服务器端代码的无效 POST 查询。
private void sendRequest(final String QUERY_URL, final Map<String,String> mapParams)
{
StringRequest postRequest = new StringRequest(Request.Method.POST, QUERY_URL ,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
//Log.d(TAG, response);
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
//Log.d(TAG , error.toString());
}
}
) {
@Override
protected Map<String, String> getParams() {
return mapParams;
}
};
queue.add(postRequest);
}
和
sendRequest("http://foo.com/bar.php", params)
推荐阅读
- python - 如何使用 Selenium 和 Python 定位后代标签元素
- sql - UNPIVOT 使用 FULL OUTER JOIN 和 SUM 的查询
- django - 在 settings.py 中将默认身份验证设置为 IsAuthenticated 全局但我仍然可以访问 django rest 框架中的端点
- python - How to scrape dataframe after select options from dropdown list?
- javascript - 在javascript中将复杂类型的字符串数组转换为json
- tws - 从 PowerShell 访问 IB/TWS API
- java - 如何检查像素是否为白色?
- python - Python Pandas - 向索引数据帧添加额外行并操作它们的最佳方法
- angular - 当我通过 angular7/8 中的路由在两个或多个组件之间切换时如何避免丢失数据?
- android - 如何从后台线程在 UI 线程上运行并等待结果?