0

将json数组对象作为参数从android发送到php服务我有一个带有许多字符串数据和jsonarray数据的json对象

**ArrayList<NameValuePair> nameValuePair = new ArrayList<NameValuePair>();
    HttpResponse httpResponse = null;

    // Making HTTP request
    try {
        // defaultHttpClient
        DefaultHttpClient httpClient = new DefaultHttpClient();
        JSONArray product_array = null;
        /*
         * namevaluepair.add(new BasicNameValuePair("val1",val1));
         * namevaluepair.add(new BasicNameValuePair("val2",val2));
         */

        try {
            nameValuePair = new ArrayList<NameValuePair>();
            nameValuePair.add(new BasicNameValuePair("n", jsonParams
                    .getString("n")));
            nameValuePair.add(new BasicNameValuePair("e", jsonParams
                    .getString("e")));
            nameValuePair.add(new BasicNameValuePair("p", jsonParams
                    .getString("p")));
            nameValuePair.add(new BasicNameValuePair("a", jsonParams
                    .getString("a")));
            nameValuePair.add(new BasicNameValuePair("t", jsonParams
                    .getString("t")));
            nameValuePair.add(new BasicNameValuePair("m", jsonParams
                    .getString("m")));
            product_array = jsonParams.getJSONArray("pj");
            Log.i(TAG + "PPPPJJJ", product_array.toString());
        //  nameValuePair.add(new BasicNameValuePair("pj", product_array
                //  .toString()));
        } catch (Exception e) {
            Log.e(TAG, "2:" + e.getMessage());
        }

        String enc_url = URLEncoder.encode(url);
        HttpPost httpPost = new HttpPost(enc_url);
        httpPost.addHeader("accept", "application/json");
        httpPost.setEntity(new UrlEncodedFormEntity(nameValuePair));
        httpResponse = httpClient.execute(httpPost);


    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    } catch (ClientProtocolException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }**

但它没有将 json 数组转发到服务器,服务器 php 文件没有接收到该数组数据,但在浏览器上工作正常所以我认为问题出在我的代码中。

我在执行如下代码时遇到的错误。

07-08 23:37:56.504: W/System.err(3219): java.lang.IllegalStateException: Target host must not be null, or set in parameters.
07-08 23:37:56.514: W/System.err(3219):     at org.apache.http.impl.client.DefaultRequestDirector.determineRoute(DefaultRequestDirector.java:572)
07-08 23:37:56.514: W/System.err(3219):     at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:292)
07-08 23:37:56.514: W/System.err(3219):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
07-08 23:37:56.525: W/System.err(3219):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
07-08 23:37:56.525: W/System.err(3219):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
07-08 23:37:56.525: W/System.err(3219):     at com.nufame.nufamemotel.utils.ConnectToNetwork.posthttp(ConnectToNetwork.java:200)
07-08 23:37:56.525: W/System.err(3219):     at com.nufame.nufamemotel.utils.ConnectToNetwork.getData(ConnectToNetwork.java:67)
07-08 23:37:56.534: W/System.err(3219):     at com.nufame.nufamemotel.utils.QueryServer.doInBackground(QueryServer.java:20)
07-08 23:37:56.534: W/System.err(3219):     at com.nufame.nufamemotel.utils.QueryServer.doInBackground(QueryServer.java:1)
07-08 23:37:56.534: W/System.err(3219):     at android.os.AsyncTask$2.call(AsyncTask.java:185)
07-08 23:37:56.534: W/System.err(3219):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
07-08 23:37:56.544: W/System.err(3219):     at java.util.concurrent.FutureTask.run(FutureTask.java:138)
07-08 23:37:56.544: W/System.err(3219):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
07-08 23:37:56.544: W/System.err(3219):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
07-08 23:37:56.544: W/System.err(3219):     at java.lang.Thread.run(Thread.java:1019)
07-08 23:37:56.544: E/...Error occured ....response(3219): java.lang.IllegalStateException: Target host must not be null, or set in parameters.
07-08 23:37:56.544: I/OrderHandler(3219): exception
07-08 23:37:56.544: W/System.err(3219): org.json.JSONException: Value exception of type java.lang.String cannot be converted to JSONObject
07-08 23:37:56.564: W/System.err(3219):     at org.json.JSON.typeMismatch(JSON.java:107)
07-08 23:37:56.564: W/System.err(3219):     at org.json.JSONObject.<init>(JSONObject.java:158)
07-08 23:37:56.564: W/System.err(3219):     at org.json.JSONObject.<init>(JSONObject.java:171)
07-08 23:37:56.564: W/System.err(3219):     at com.nufame.nufamemotel.handler.OrderHandler$1.onPostExecute(OrderHandler.java:108)
07-08 23:37:56.564: W/System.err(3219):     at com.nufame.nufamemotel.handler.OrderHandler$1.onPostExecute(OrderHandler.java:1)
07-08 23:37:56.564: W/System.err(3219):     at android.os.AsyncTask.finish(AsyncTask.java:417)
07-08 23:37:56.564: W/System.err(3219):     at android.os.AsyncTask.access$300(AsyncTask.java:127)
07-08 23:37:56.564: W/System.err(3219):     at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:429)
07-08 23:37:56.574: W/System.err(3219):     at android.os.Handler.dispatchMessage(Handler.java:99)
07-08 23:37:56.574: W/System.err(3219):     at android.os.Looper.loop(Looper.java:123)
07-08 23:37:56.574: W/System.err(3219):     at android.app.ActivityThread.main(ActivityThread.java:3683)
07-08 23:37:56.574: W/System.err(3219):     at java.lang.reflect.Method.invokeNative(Native Method)
07-08 23:37:56.574: W/System.err(3219):     at java.lang.reflect.Method.invoke(Method.java:507)
07-08 23:37:56.574: W/System.err(3219):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
07-08 23:37:56.584: W/System.err(3219):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
07-08 23:37:56.584: W/System.err(3219):     at dalvik.system.NativeStart.main(Native Method)
4

3 回答 3

3

You can use droidQuery to send this very easily:

$.ajax(new AjaxOptions().url("http://www.example.com")//switch with real URL
                        .type("POST")
                        .dataType("json")
                        .data(jsonParams)//your JSON Object
                        .context(this)
                        .success(new Function() {
                            @Override
                            public void invoke($ droidQuery, Object... params) {
                                //if you are expecting a JSONObject:
                                JSONObject response = (JSONObject) params[0];
                                //TODO: handle response
                            }
                        })
                        .error(new Function() {
                            @Override
                            public void invoke($ droidQuery, Object... params) {
                                AjaxError error = (AjaxError) params[0];
                                $.toast(error.status + ": " + error.reason, Toast.LENGTH_LONG);
                                //retry once
                                $.ajax(error.request, error.options.error($.noop()));
                            }
                        }));
于 2013-08-05T13:42:59.150 回答
1
JSONObject j = new JSONObject(); try {
        j.put("n", jsonParams
                .getString("n"));
        j.put("e", jsonParams
                .getString("e"));
        j.put("p", jsonParams
                .getString("p"));
        j.put("e", jsonParams
                .getString("p"));
          j.put("a", jsonParams
                .getString("a"));
        j.put("t", jsonParams
                .getString("t"));
        j.put("m", jsonParams
                .getString("m"));
        product_array = jsonParams.getJSONArray("pj");
        Log.i(TAG + "PPPPJJJ", product_array.toString());

        j.put("array", product_array);
    } catch (Exception e) {
        Log.e(TAG, "2:" + e.getMessage());
    }

    String enc_url = URLEncoder.encode(url);
    HttpPost httpPost = new HttpPost(enc_url);
    httpPost.addHeader("accept", "application/json");
    httpPost.setEntity(new UrlEncodedFormEntity(j));
    httpResponse = httpClient.execute(httpPost);


} catch (UnsupportedEncodingException e) {
    e.printStackTrace();
} catch (ClientProtocolException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}**

另请参阅此处Android JSON HttpClient 使用 HttpResponse 将数据发送到 PHP 服务器

于 2013-08-06T08:49:00.810 回答
1

这就是我认为应该这样做的方式:

URL url = new URL("//ip of your PHP function on your web server");
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
StringBuilder postDataBuilder = new StringBuilder();
postDataBuilder.append(URLEncoder.encode("005", "UTF-8"));
urlConnection.setDoOutput(true);
urlConnection.setRequestMethod("POST");
urlConnection.setUseCaches(false);
urlConnection.setConnectTimeout(10000);
urlConnection.setReadTimeout(10000);
urlConnection.setRequestProperty("Content-Type","application/json");
urlConnection.connect();
JSONObject jsonParam = new JSONObject();
jsonParam.put("item 1", "value 1");
//Add other pairs here, as you are doing
OutputStreamWriter out = new OutputStreamWriter(urlConnection.getOutputStream());
out.write(jsonParam.toString());
out.close();
InputStream is = urlConnection.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String line;
StringBuffer response = new StringBuffer();
while((line = br.readLine()) != null){
    response.append(line);
    response.append('\n');
}
if (urlConnection.getResponseCode() == HttpURLConnection.HTTP_OK) {
System.out.println(response.toString());
}
else {                                    
    System.out.println("Incorrect response code");
}
br.close();
urlConnection.disconnect();

此代码允许您发送 JSON 对象,然后使用InputStreamand获取响应BufferedReader。希望这有帮助!

于 2013-08-05T12:57:36.340 回答