【问题标题】:Android sending post data to webservice [duplicate]Android将发布数据发送到网络服务[重复]
【发布时间】:2013-10-27 01:59:06
【问题描述】:

您好,我正在尝试将数据发送到网络服务

字符串 url = "https://www.myurl.com";

    URL urlobj =  new URL(url);
    HttpsURLConnection con = (HttpsURLConnection) urlobj.openConnection();
    con.setRequestMethod("POST");
    con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");

    String urlParameters = GenerateUrlParameters(data);

    con.setDoOutput(true);
    con.setDoInput(true);

    Log.i("test", "hit1");

    DataOutputStream  wr = new DataOutputStream(con.getOutputStream());

    Log.i("test", "hit2");

    wr.writeBytes(urlParameters);

    wr.flush();
    wr.close();

Hit1 被击中,但在下一行失败并且没有击中 hit2。我做错了什么?

我的日志猫

10-18 09:17:33.302: D/gralloc_goldfish(2228): Emulator without GPU emulation detected.
10-18 09:17:33.322: W/TextLayoutCache(2228): computeValuesWithHarfbuzz -- need to force to single run
10-18 09:17:37.862: I/test(2228): hit1
10-18 09:17:37.872: D/AndroidRuntime(2228): Shutting down VM
10-18 09:17:37.872: W/dalvikvm(2228): threadid=1: thread exiting with uncaught exception (group=0x409961f8)
10-18 09:17:37.912: E/AndroidRuntime(2228): FATAL EXCEPTION: main
10-18 09:17:37.912: E/AndroidRuntime(2228): java.lang.IllegalStateException: Could not execute method of the activity
10-18 09:17:37.912: E/AndroidRuntime(2228):     at android.view.View$1.onClick(View.java:3039)
10-18 09:17:37.912: E/AndroidRuntime(2228):     at android.view.View.performClick(View.java:3480)
10-18 09:17:37.912: E/AndroidRuntime(2228):     at android.view.View$PerformClick.run(View.java:13983)
10-18 09:17:37.912: E/AndroidRuntime(2228):     at android.os.Handler.handleCallback(Handler.java:605)
10-18 09:17:37.912: E/AndroidRuntime(2228):     at android.os.Handler.dispatchMessage(Handler.java:92)
10-18 09:17:37.912: E/AndroidRuntime(2228):     at android.os.Looper.loop(Looper.java:137)
10-18 09:17:37.912: E/AndroidRuntime(2228):     at android.app.ActivityThread.main(ActivityThread.java:4340)
10-18 09:17:37.912: E/AndroidRuntime(2228):     at java.lang.reflect.Method.invokeNative(Native Method)
10-18 09:17:37.912: E/AndroidRuntime(2228):     at java.lang.reflect.Method.invoke(Method.java:511)
10-18 09:17:37.912: E/AndroidRuntime(2228):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
10-18 09:17:37.912: E/AndroidRuntime(2228):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
10-18 09:17:37.912: E/AndroidRuntime(2228):     at dalvik.system.NativeStart.main(Native Method)
10-18 09:17:37.912: E/AndroidRuntime(2228): Caused by: java.lang.reflect.InvocationTargetException
10-18 09:17:37.912: E/AndroidRuntime(2228):     at java.lang.reflect.Method.invokeNative(Native Method)
10-18 09:17:37.912: E/AndroidRuntime(2228):     at java.lang.reflect.Method.invoke(Method.java:511)
10-18 09:17:37.912: E/AndroidRuntime(2228):     at android.view.View$1.onClick(View.java:3034)
10-18 09:17:37.912: E/AndroidRuntime(2228):     ... 11 more
10-18 09:17:37.912: E/AndroidRuntime(2228): Caused by: android.os.NetworkOnMainThreadException
10-18 09:17:37.912: E/AndroidRuntime(2228):     at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1084)
10-18 09:17:37.912: E/AndroidRuntime(2228):     at java.net.InetAddress.lookupHostByName(InetAddress.java:391)
10-18 09:17:37.912: E/AndroidRuntime(2228):     at java.net.InetAddress.getAllByNameImpl(InetAddress.java:242)
10-18 09:17:37.912: E/AndroidRuntime(2228):     at java.net.InetAddress.getAllByName(InetAddress.java:220)
10-18 09:17:37.912: E/AndroidRuntime(2228):     at libcore.net.http.HttpConnection.<init>(HttpConnection.java:71)
10-18 09:17:37.912: E/AndroidRuntime(2228):     at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50)
10-18 09:17:37.912: E/AndroidRuntime(2228):     at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:351)
10-18 09:17:37.912: E/AndroidRuntime(2228):     at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:86)
10-18 09:17:37.912: E/AndroidRuntime(2228):     at libcore.net.http.HttpConnection.connect(HttpConnection.java:128)
10-18 09:17:37.912: E/AndroidRuntime(2228):     at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:308)
10-18 09:17:37.912: E/AndroidRuntime(2228):     at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.makeSslConnection(HttpsURLConnectionImpl.java:460)
10-18 09:17:37.912: E/AndroidRuntime(2228):     at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.connect(HttpsURLConnectionImpl.java:432)
10-18 09:17:37.912: E/AndroidRuntime(2228):     at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:282)
10-18 09:17:37.912: E/AndroidRuntime(2228):     at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:232)
10-18 09:17:37.912: E/AndroidRuntime(2228):     at libcore.net.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:80)
10-18 09:17:37.912: E/AndroidRuntime(2228):     at libcore.net.http.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:188)
10-18 09:17:37.912: E/AndroidRuntime(2228):     at libcore.net.http.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:280)
10-18 09:17:37.912: E/AndroidRuntime(2228):     at dk.example.epaypayment.EpayHttpRequest.MakePayment(EpayHttpRequest.java:53)
10-18 09:17:37.912: E/AndroidRuntime(2228):     at dk.example.epaypayment.MainActivity.sendMessage(MainActivity.java:37)
10-18 09:17:37.912: E/AndroidRuntime(2228):     ... 14 more
10-18 09:22:38.232: I/Process(2228): Sending signal. PID: 2228 SIG: 9

【问题讨论】:

  • 请google那个异常android.os.NetworkOnMainThreadException

标签: java android web-services https


【解决方案1】:

好吧,我可以建议使用 HttpClient 以更高的抽象度来做。

DefaultHttpClient httpClient = null;

HttpParams my_httpParams = new BasicHttpParams();

httpClient = new DefaultHttpClient(my_httpParams);

然后发送

HttpPost httpPost = new HttpPost(stringUri);
httpPost.setHeader("Content-type", "application/x-www-form-urlencoded");
httpPost.setHeader("charset", "utf-8");

if (!TextUtils.isEmpty(someStringToSend)) {
    httpPost.setEntity(new StringEntity(someStringToSend, HTTP.UTF_8));
}

HttpResponse responsePOST = httpClient.execute(httpPost);
HttpEntity resEntity = responsePOST.getEntity();

if (resEntity != null) {
    response = EntityUtils.toString(resEntity, HTTP.UTF_8);
}

我没有测试过,但应该可以工作。

【讨论】:

    【解决方案2】:

    使用参数调用sendPostRequest(String username, String pass) 方法。您可以从 UI 线程调用此方法,请求将从不同的线程发送(AsyncTask 已嵌入)。

    private void sendPostRequest(String givenUsername, String givenPassword) {
    
        class SendPostReqAsyncTask extends AsyncTask<String, Void, String> {
    
            @Override
            protected String doInBackground(String... params) {
                String paramUsername = params[0];
                String paramPassword = params[1];
    
                System.out.println("*** doInBackground ** paramUsername "
                    + paramUsername + " paramPassword :" + paramPassword);
    
                HttpClient httpClient = new DefaultHttpClient();
                HttpPost httpPost = new HttpPost(
                    "http://lib-dm.process9.com/libertydm/ValidateUserHandler.ashx");// replace with your url
                httpPost.addHeader("Content-type",
                    "application/x-www-form-urlencoded");
                BasicNameValuePair usernameBasicNameValuePair = new BasicNameValuePair(
                    "UserId", paramUsername);  // Make your own key value pair
                BasicNameValuePair passwordBasicNameValuePAir = new BasicNameValuePair(
                    "Password", paramPassword);// make your own key value pair
    
                // You can add more parameters like above
    
                List<NameValuePair> nameValuePairList = new ArrayList<NameValuePair>();
                nameValuePairList.add(usernameBasicNameValuePair);
                nameValuePairList.add(passwordBasicNameValuePair);
    
                try {
                    UrlEncodedFormEntity urlEncodedFormEntity = new UrlEncodedFormEntity(
                        nameValuePairList);
                    httpPost.setEntity(urlEncodedFormEntity);
    
                    try {
                        HttpResponse httpResponse = httpClient
                            .execute(httpPost);
                        InputStream inputStream = httpResponse.getEntity()
                            .getContent();
                        InputStreamReader inputStreamReader = new InputStreamReader(
                            inputStream);
                        BufferedReader bufferedReader = new BufferedReader(
                            inputStreamReader);
                        StringBuilder stringBuilder = new StringBuilder();
                        String bufferedStrChunk = null;
                        while ((bufferedStrChunk = bufferedReader.readLine()) != null) {
                            stringBuilder.append(bufferedStrChunk);
                        }
    
                        return stringBuilder.toString();
    
                        } catch (ClientProtocolException cpe) {
                            System.out
                                .println("First Exception coz of HttpResponese :"
                                    + cpe);
                            cpe.printStackTrace();
                        } catch (IOException ioe) {
                            System.out
                                .println("Second Exception coz of HttpResponse :"
                                    + ioe);
                            ioe.printStackTrace();
                        }
    
                } catch (UnsupportedEncodingException uee) {
                    System.out
                        .println("An Exception given because of UrlEncodedFormEntity argument :"
                            + uee);
                    uee.printStackTrace();
                }
                return null;
            }
    
            @Override
            protected void onPostExecute(String result) {
                super.onPostExecute(result);
            }
        }
    
        SendPostReqAsyncTask sendPostReqAsyncTask = new SendPostReqAsyncTask();
        sendPostReqAsyncTask.execute(givenUsername, givenPassword);
    }
    

    【讨论】:

      【解决方案3】:

      尝试实现此代码,它应该可以工作。 如果你的安卓版本在 4.0 以上,那么你将不得不强制使用 Asyn Task ,这样这个 http 请求就不会在主线程上运行。否则应用程序将崩溃。 如果应用程序使用 HTTPGET 或 HTTPPOST 方法并在主线程上运行,它将崩溃。 Asyn TAsk 是解决方案。

         HttpClient client = new DefaultHttpClient();
          HttpResponse response;
          JSONObject json=new JSONObject();
          HttpPost post = new HttpPost(url1);
      
          try {
              json.put("Key","your value");
              json.put("Key", "Value");
      
      
              StringEntity stringEntity = new StringEntity(json.toString());
      
              stringEntity.setContentEncoding("UTF-8");
              stringEntity.setContentType("application/json");
              post.setEntity(stringEntity);
      
              response = client.execute(post);
              Log.e("RESPONSE", response.toString());
              String responseBody = EntityUtils
                      .toString(response.getEntity());
               res= responseBody.toString();
      
              Log.e("RESPONSE BODY", responseBody);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-05
        • 1970-01-01
        相关资源
        最近更新 更多