7

JSONObject.toString()文字列データ ( ) を URLに送信するにはどうすればよいですか。これを行うために、util クラスに静的メソッドを記述したいと考えています。メソッドのシグネチャを次のようにしたい

public static String postData (String url, String postData) throws SomeCustomException

文字列 url の形式は何ですか

戻り文字列は、json データの文字列表現としてのサーバーからの応答です。

編集

現在の接続ユーティリティ

package my.package;
import my.package.exceptions.CustomException;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URLDecoder;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;


 public class ConnectionUtil {

 public static String postData(String url, String postData)
        throws CustomException {

    // Create a new HttpClient and Post Header
    InputStream is = null;
    StringBuilder sb = null;
    String result = "";
    HttpClient httpclient = new DefaultHttpClient();

HttpPost httppost = new HttpPost();
    httppost.setHeader("host", url);

    Log.v("ConnectionUtil", "Opening POST connection to URI = " + httppost.getURI() + " url = " + URLDecoder.decode(url));

    try {
        httppost.setEntity(new StringEntity(postData));

        // Execute HTTP Post Request
        HttpResponse response = httpclient.execute(httppost);
        HttpEntity entity = response.getEntity();
        is = entity.getContent();

    } catch (Exception e) {
        Log.e("log_tag", "Error in http connection " + e.toString());
        e.printStackTrace();
        throw new CustomException("Could not establish network connection");
    }
    try {
        BufferedReader reader = new BufferedReader(new InputStreamReader(
                is, "utf-8"), 8);
        sb = new StringBuilder();
        sb.append(reader.readLine() + "\n");
        String line = "0";

        while ((line = reader.readLine()) != null) {
            sb.append(line + "\n");
        }

        is.close();
        result = sb.toString();

    } catch (Exception e) {
        Log.e("log_tag", "Error converting result " + e.toString());
        throw new CustomException("Error parsing the response");
    }
    Log.v("ConnectionUtil", "Sent: "+postData);
    Log.v("ConnectionUtil", "Got result "+result);
    return result;

}

}

Logcat 出力

10-16 11:27:27.287: E/log_tag(4935): http 接続のエラー java.lang.NullPointerException 10-16 11:27:27.287: W/System.err(4935): java.lang.NullPointerException 10- 16 11:27:27.287: W/System.err(4935): org.apache.http.impl.client.AbstractHttpClient.determineTarget(AbstractHttpClient.java:496) で 10-16 11:27:27.307: W/システム。 err(4935): org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487) 10-16 11:27:27.327: W/System.err(4935): org.apache.http で.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465) 10-16 11:27:27.327: W/System.err(4935): in.gharpay.zap.integration.ConnectionUtil.postData(ConnectionUtil.java: 92) 10-16 11:27:27.327: W/System.err(4935): in.gharpay.zap.integration.ZapTransaction$1.doInBackground(ZapTransaction.java:54) 10-16 11:27:27.327: W /System.err(4935):in.gharpay.zap.integration.ZapTransaction$1.doInBackground(ZapTransaction.java:1) 10-16 11:27:27.327: W/System.err(4935): android.os.AsyncTask$2.call(AsyncTask. java:185) 10-16 11:27:27.327: W/System.err(4935): java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306) 10-16 11:27:27.327: W/System.err(4935): java.util.concurrent.FutureTask.run(FutureTask.java:138) 10-16 11:27:27.327: W/System.err(4935): java.util.concurrent で.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088) 10-16 11:27:27.327: W/System.err(4935): java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581) で 10- 16 11:27:27.327: W/System.err(4935): java.lang.Thread.run(Thread.java:1019) で 10-16 11:27:27.327: V/log_tag(4935): 確立できませんでしたネットワーク接続ZapTransaction$1.doInBackground(ZapTransaction.java:1) 10-16 11:27:27.327: W/System.err(4935): android.os.AsyncTask$2.call(AsyncTask.java:185) 10-16 11: 27:27.327: W/System.err(4935): java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306) 10-16 11:27:27.327: W/System.err(4935): java.util.concurrent.FutureTask.run(FutureTask.java:138) 10-16 11:27:27.327: W/System.err(4935): java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java: 1088) 10-16 11:27:27.327: W/System.err(4935): java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:581) で 10-16 11:27:27.327: W/ System.err(4935): java.lang.Thread.run(Thread.java:1019) 10-16 11:27:27.327: V/log_tag(4935): ネットワーク接続を確立できませんでしたZapTransaction$1.doInBackground(ZapTransaction.java:1) 10-16 11:27:27.327: W/System.err(4935): android.os.AsyncTask$2.call(AsyncTask.java:185) 10-16 11: 27:27.327: W/System.err(4935): java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306) 10-16 11:27:27.327: W/System.err(4935): java.util.concurrent.FutureTask.run(FutureTask.java:138) 10-16 11:27:27.327: W/System.err(4935): java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java: 1088) 10-16 11:27:27.327: W/System.err(4935): java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:581) で 10-16 11:27:27.327: W/ System.err(4935): java.lang.Thread.run(Thread.java:1019) 10-16 11:27:27.327: V/log_tag(4935): ネットワーク接続を確立できませんでしたerr(4935): android.os.AsyncTask$2.call(AsyncTask.java:185) 10-16 11:27:27.327: W/System.err(4935): java.util.concurrent.FutureTask$Sync で。 innerRun (FutureTask.java:306) 10-16 11:27:27.327: W/System.err(4935): java.util.concurrent.FutureTask.run(FutureTask.java:138) 10-16 11:27: 27.327: W/System.err(4935): java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088) 10-16 11:27:27.327: W/System.err(4935): java.util で.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581) 10-16 11:27:27.327: W/System.err(4935): java.lang.Thread.run(Thread.java:1019) で 10- 16 11:27:27.327: V/log_tag(4935): ネットワーク接続を確立できませんでしたerr(4935): android.os.AsyncTask$2.call(AsyncTask.java:185) 10-16 11:27:27.327: W/System.err(4935): java.util.concurrent.FutureTask$Sync で。 innerRun (FutureTask.java:306) 10-16 11:27:27.327: W/System.err(4935): java.util.concurrent.FutureTask.run(FutureTask.java:138) 10-16 11:27: 27.327: W/System.err(4935): java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088) 10-16 11:27:27.327: W/System.err(4935): java.util で.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581) 10-16 11:27:27.327: W/System.err(4935): java.lang.Thread.run(Thread.java:1019) で 10- 16 11:27:27.327: V/log_tag(4935): ネットワーク接続を確立できませんでしたinnerRun (FutureTask.java:306) 10-16 11:27:27.327: W/System.err(4935): java.util.concurrent.FutureTask.run(FutureTask.java:138) 10-16 11:27: 27.327: W/System.err(4935): java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088) 10-16 11:27:27.327: W/System.err(4935): java.util で.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581) 10-16 11:27:27.327: W/System.err(4935): java.lang.Thread.run(Thread.java:1019) で 10- 16 11:27:27.327: V/log_tag(4935): ネットワーク接続を確立できませんでしたinnerRun (FutureTask.java:306) 10-16 11:27:27.327: W/System.err(4935): java.util.concurrent.FutureTask.run(FutureTask.java:138) 10-16 11:27: 27.327: W/System.err(4935): java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088) 10-16 11:27:27.327: W/System.err(4935): java.util で.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581) 10-16 11:27:27.327: W/System.err(4935): java.lang.Thread.run(Thread.java:1019) で 10- 16 11:27:27.327: V/log_tag(4935): ネットワーク接続を確立できませんでした並行.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581) 10-16 11:27:27.327: W/System.err(4935): java.lang.Thread.run(Thread.java:1019) 10-16 11:27:27.327: V/log_tag(4935): ネットワーク接続を確立できませんでした並行.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581) 10-16 11:27:27.327: W/System.err(4935): java.lang.Thread.run(Thread.java:1019) 10-16 11:27:27.327: V/log_tag(4935): ネットワーク接続を確立できませんでした
4

4 に答える 4

2

さて、ここにあなたの質問に対する私の考えがあります:-

  1. まず、メソッドを使用してデータをサーバーに送信するだけですPOST。Androidでも簡単で絶対に可能です。データを送信するための単純なコード スニペットは次のPOSTようになります。

    HttpClient httpclient = new DefaultHttpClient();
    HttpPost httppost = new HttpPost(
            "http://yourserverIP/postdata.php");
    String serverResponse = null;
    try {
        List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
        nameValuePairs.add(new BasicNameValuePair("datakey1", dataValue1));
        nameValuePairs.add(new BasicNameValuePair("datakey2",
                dataValue2));
    
        httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
        HttpResponse response = httpclient.execute(httppost);
    
        serverResponse = response.getStatusLine().toString();
        Log.e("response", serverResponse);
    } catch (ClientProtocolException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    

    上記のコードpostdataは、サーバー上の PHP スクリプトにデータを送信します。

  2. 次に、JSONサーバーから送信されたデータを解析するために、 を使用してJSONParser、必要に応じて簡単に利用できます。次のコードを使用して、サーバーから返された応答を取得できます。

    String jsonData = EntityUtils.toString(serverResponse.getEntity());
    

お役に立てれば。ありがとう。

于 2012-10-16T05:14:34.237 に答える
2

あなたのコードでは、基本的な問題は、URLStringEntityへのパラメーターの使用方法が原因であると思います。POSTを使用してサーバーにデータを送信する際に、次のコードが役立つかどうかを確認してくださいStringEntity

    // Build the JSON object to pass parameters
    JSONObject jsonObj = new JSONObject();
    jsonObj.put("username", username);
    jsonObj.put("data", dataValue);

    // Create the POST object and add the parameters
    HttpPost httpPost = new HttpPost(url);
    StringEntity entity = new StringEntity(jsonObj.toString(), HTTP.UTF_8);
    entity.setContentType("application/json");
    httpPost.setEntity(entity);

    HttpClient client = new DefaultHttpClient();
    HttpResponse response = client.execute(httpPost);

これが問題の解決に役立つことを願っています。ありがとう。

于 2012-10-16T06:43:48.183 に答える
1

このメソッドを使用してみてください。ここで、strJsonRequest は投稿する json 文字列であり、strUrl は strJsonRequest を投稿する URL です。

   public String urlPost(String strJsonRequest, String strURL) throws Exception 
{
    try
    {
        URL objURL = new URL(strURL);
        connection = (HttpURLConnection)objURL.openConnection();
        connection.setDoInput(true);
        connection.setDoOutput(true);
        connection.setAllowUserInteraction(false);
        connection.setUseCaches(false);
        connection.setConnectTimeout(TIMEOUT_CONNECT_MILLIS);
        connection.setReadTimeout(TIMEOUT_READ_MILLIS);
        connection.setRequestMethod("POST");
        connection.setRequestProperty("Accept-Charset", "utf-8");
        connection.setRequestProperty("Content-Type", "application/json; charset=utf-8");
        connection.setRequestProperty("Content-Length", ""+strJsonRequest.toString().getBytes("UTF8").length);

        DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream());

        byte [] b = strJsonRequest.getBytes("UTF-8");

        outputStream.write(b);
        outputStream.flush();

        inputstreamObj = (InputStream) connection.getContent();//getInputStream();

        if(inputstreamObj != null)
            strResponse = convertStreamToString(inputstreamObj);

    }
    catch(Exception e)
    {
        throw e;
    }
    return strResponse;
}

メソッド convertStreamToString() は以下のとおりです

private static String convertStreamToString(InputStream is)
{
    /*
     * To convert the InputStream to String we use the BufferedReader.readLine()
     * method. We iterate until the BufferedReader return null which means
     * there's no more data to read. Each line will appended to a StringBuilder
     * and returned as String.
     */
    BufferedReader reader = null;
        try {
            reader = new BufferedReader(new InputStreamReader(is));
        } catch (Exception e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
    StringBuilder sb = new StringBuilder();

    String line = null;
    try
    {
        while ((line = reader.readLine()) != null) 
        {
            sb.append(line + "\n");
        }
    } 
    catch (IOException e) 
    {
        e.printStackTrace();
    }
    finally 
    {
        try 
        {
            is.close();
        } 
        catch (IOException e) 
        {
            e.printStackTrace();
        }
    }
    return sb.toString();
}
于 2012-10-16T04:58:27.387 に答える
0

サーバー側のコードの設定方法に応じて、サーバーに API 呼び出しを処理するための php ページがある場合の URL の形式の例は次のようになります。

http://yoururl.com/demo.php?jsondata=postData

ポスト接続を使用している場合は、次のように簡単に言うことができます。

http://yoururl.com/demo.php

投稿パラメーター、つまりjson文字列を渡します

これを行う方法に関する優れたチュートリアルは次のとおりです。 http://yoururl.com/demo.php?jsondata=postData

于 2012-10-16T05:00:15.813 に答える