Android JSON HttpClient 使用 HttpResponse 将数据发送到 PHP 服务器
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/2540786/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Android JSON HttpClient to send data to PHP server with HttpResponse
提问by Scoobler
I am currently trying to send some data from and Android application to a php server (both are controlled by me).
我目前正在尝试将一些数据从 Android 应用程序发送到 php 服务器(两者都由我控制)。
There is alot of data collected on a form in the app, this is written to the database. This all works.
在应用程序的表单上收集了大量数据,这些数据被写入数据库。这一切都有效。
In my main code, firstly I create a JSONObject (I have cut it down here for this example):
在我的主代码中,首先我创建了一个 JSONObject(我在这个例子中已经把它删减了):
JSONObject j = new JSONObject();
j.put("engineer", "me");
j.put("date", "today");
j.put("fuel", "full");
j.put("car", "mine");
j.put("distance", "miles");
Next I pass the object over for sending, and receive the response:
接下来我将对象传递给发送,并接收响应:
String url = "http://www.server.com/thisfile.php";
HttpResponse re = HTTPPoster.doPost(url, j);
String temp = EntityUtils.toString(re.getEntity());
if (temp.compareTo("SUCCESS")==0)
{
Toast.makeText(this, "Sending complete!", Toast.LENGTH_LONG).show();
}
The HTTPPoster class:
HTTPPoster 类:
public static HttpResponse doPost(String url, JSONObject c) throws ClientProtocolException, IOException
{
HttpClient httpclient = new DefaultHttpClient();
HttpPost request = new HttpPost(url);
HttpEntity entity;
StringEntity s = new StringEntity(c.toString());
s.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
entity = s;
request.setEntity(entity);
HttpResponse response;
response = httpclient.execute(request);
return response;
}
This gets a response, but the server is returning a 403 - Forbidden response.
这得到一个响应,但服务器返回一个 403 - Forbidden 响应。
I have tried changing the doPost function a little (this is actually a little better, as I said I have alot to send, basically 3 of the same form with different data - so I create 3 JSONObjects, one for each form entry - the entries come from the DB instead of the static example I am using).
我尝试稍微改变 doPost 函数(这实际上更好一点,正如我所说,我有很多要发送的,基本上是 3 个具有不同数据的相同表单 - 所以我创建了 3 个 JSONObjects,每个表单条目一个 - 条目来自数据库而不是我正在使用的静态示例)。
Firstly I changed the call over a bit:
首先,我稍微改变了调用:
String url = "http://www.myserver.com/ServiceMatalan.php";
Map<String, String> kvPairs = new HashMap<String, String>();
kvPairs.put("vehicle", j.toString());
// Normally I would pass two more JSONObjects.....
HttpResponse re = HTTPPoster.doPost(url, kvPairs);
String temp = EntityUtils.toString(re.getEntity());
if (temp.compareTo("SUCCESS")==0)
{
Toast.makeText(this, "Sending complete!", Toast.LENGTH_LONG).show();
}
Ok so the changes to the doPost function:
好的,所以对 doPost 函数的更改:
public static HttpResponse doPost(String url, Map<String, String> kvPairs) throws ClientProtocolException, IOException
{
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost(url);
if (kvPairs != null && kvPairs.isEmpty() == false)
{
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(kvPairs.size());
String k, v;
Iterator<String> itKeys = kvPairs.keySet().iterator();
while (itKeys.hasNext())
{
k = itKeys.next();
v = kvPairs.get(k);
nameValuePairs.add(new BasicNameValuePair(k, v));
}
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
}
HttpResponse response;
response = httpclient.execute(httppost);
return response;
}
Ok So this returns a response 200
好的 所以这会返回一个响应 200
int statusCode = re.getStatusLine().getStatusCode();
However the data received on the server cannot be parsed to a JSON string. It is badly formatted I think (this is the first time I have used JSON):
但是,服务器上接收到的数据无法解析为 JSON 字符串。我认为它的格式很糟糕(这是我第一次使用 JSON):
If in the php file I do an echo on $_POST['vehicle'] I get the following:
如果在 php 文件中我在 $_POST['vehicle'] 上做一个 echo,我会得到以下信息:
{\"date\":\"today\",\"engineer\":\"me\"}
Can anyone tell me where I am going wrong, or if there is a better way to achieve what I am trying to do? Hopefully the above makes sense!
谁能告诉我哪里出错了,或者是否有更好的方法来实现我想要做的事情?希望以上是有道理的!
采纳答案by Scoobler
After lots of reading and searching I have found the problem to be with, I beleive magic_quotes_gpc being enabled on the server.
经过大量阅读和搜索,我发现了问题所在,我相信在服务器上启用了 magic_quotes_gpc。
Thus, using:
因此,使用:
json_decode(stripslashes($_POST['vehicle']));
In my example above removes the slashes and allows the JSON to be decoded properly.
在我上面的示例中,删除了斜杠并允许正确解码 JSON。
Still not sure why sending a StringEntity causes a 403 error?
仍然不确定为什么发送 StringEntity 会导致 403 错误?
回答by user534737
StringEntity s = new StringEntity(c.toString());
s.setContentEncoding("UTF-8");
s.setContentType("application/json");
request.setEntity(s);
回答by Sachin Gurnani
Try this code it works for me
试试这个代码它对我有用
public void postData(String result,JSONObject obj) {
// Create a new HttpClient and Post Header
HttpClient httpclient = new DefaultHttpClient();
HttpParams myParams = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(myParams, 10000);
HttpConnectionParams.setSoTimeout(myParams, 10000);
String json=obj.toString();
try {
HttpPost httppost = new HttpPost(result.toString());
httppost.setHeader("Content-type", "application/json");
StringEntity se = new StringEntity(obj.toString());
se.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
httppost.setEntity(se);
HttpResponse response = httpclient.execute(httppost);
String temp = EntityUtils.toString(response.getEntity());
Log.i("tag", temp);
} catch (ClientProtocolException e) {
} catch (IOException e) {
}
}
}
回答by Nur Gazi
Try this code it works perfectly
试试这个代码它完美地工作
*For HttpClient class* download jar file "httpclient-4.3.6.jar" and put in libs folder then
Compile: dependencies {compile files('libs/httpclient-4.3.6.jar')}
repositories {
maven {
url "https://jitpack.io"
}
}
then call HttpClient class this AsyncTask Like this:
然后调用 HttpClient 类这个 AsyncTask 像这样:
private class YourTask extends AsyncTask { private String error_msg = "Server error!";
private class YourTask extends AsyncTask { private String error_msg = "服务器错误!";
private JSONObject response;
@Override
protected Boolean doInBackground(String... params) {
try {
JSONObject mJsonObject = new JSONObject();
mJsonObject.put("user_id", "user name");
mJsonObject.put("password", "123456");
String URL=" Your Link"
//Log.e("Send Obj:", mJsonObject.toString());
response = HttpClient.SendHttpPost(URL, mJsonObject);
boolean status = response != null && response.getInt("is_error") == 0; // response
return status;
} catch (JSONException | NullPointerException e) {
e.printStackTrace();
mDialog.dismiss();
return false;
}
}
@Override
protected void onPostExecute(Boolean status) {
// your code
}
}
回答by Sergey
Change
改变
(String url = "http://www.server.com/MainPage.php";)
to
到
(String url = "http://www.server.com/MainPage.php?";)
Question mark at the end is necessary when you're trying to send parameters to php script.
当您尝试将参数发送到 php 脚本时,末尾的问号是必需的。