私は現在、Androidアプリケーションからphpサーバーにデータを送信しようとしています(両方とも私が制御しています)。
アプリのフォームで収集されたデータは大量にあり、これはデータベースに書き込まれます。これはすべて機能します。
私のメイン コードでは、まず 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");
次に、オブジェクトを送信用に渡し、応答を受け取ります。
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();
}
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;
}
これは応答を取得しますが、サーバーは 403 - Forbidden 応答を返しています。
doPost 関数を少し変更してみました (これは、送信するものがたくさんあると言ったように、実際には少し良くなりました。基本的に、異なるデータを持つ同じフォームが 3 つあるため、フォーム エントリごとに 1 つずつ、3 つの JSONObjects を作成します。私が使用している静的な例ではなく、DB から来ています)。
まず、呼び出しを少し変更しました。
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();
}
では、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;
}
わかりましたので、これは応答 200 を返します
int statusCode = re.getStatusLine().getStatusCode();
ただし、サーバーで受信したデータを JSON 文字列に解析することはできません。フォーマットが悪いと思います(JSONを使用したのはこれが初めてです):
PHP ファイルで $_POST['vehicle'] に対してエコーを実行すると、次のようになります。
{\"date\":\"today\",\"engineer\":\"me\"}
どこが間違っているのか、または私がやろうとしていることを達成するためのより良い方法があるかどうかを誰かに教えてもらえますか? うまくいけば、上記は理にかなっています!