2017-03-06 111 views
1

因此,我正在研究一個uni項目,我已經創建了一個應用程序,我希望通過POST請求與我的服務器進行通信。Android有問題可以發送請求到我的服務器

我有代碼作爲獨立的Java文件運行時沒有問題,但是當我把代碼放到我的應用程序中時什麼也沒有發生,我一直在這裏用了大約5個小時,現在使用各種各樣的從套接字到現在簡單的POST請求的不同方法。

我已經在這裏包含了Android版本的代碼,它基本上與獨立版本相同。

//Register on the sever 
     String url = "myurl"; 
     String data = "uuid:!:harry6:,:timestamp:!:1337"; 
     postData(url, data); 

    } 

    //Method for sending data to the server 
    public static void postData(String urlN, String data) { 

     try { 
      data = splitArgs(data); 
      URL url = new URL(urlN); 
      URLConnection conn = url.openConnection(); 
      conn.setDoOutput(true); 
      OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream()); 
      wr.write(data); 
      wr.flush(); 

      BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream())); 
      String line; 
      while ((line = rd.readLine()) != null) { 
       System.out.println(line); 
      } 
      wr.close(); 
      rd.close(); 
     } catch (Exception e) { 

     } 
    } 

    //Function which will split the arguments for HTML parsing 
    public static String splitArgs(String data){ 

     HashMap<String, String> finalData = new HashMap<String, String>(); 

     String[] data2 = data.split(":,:"); 

     for(String d : data2){ 
      String[] d2 = d.split(":!:"); 
      finalData.put(d2[0].toString(), d2[1].toString()); 
     } 

     String encodedString = ""; 
     String charset = "UTF-8"; 

     for (String key : finalData.keySet()) { 
      try{ 
       encodedString += URLEncoder.encode(key, charset) + "=" + URLEncoder.encode(finalData.get(key), charset) + "&"; 
      }catch(Exception e){ 

      } 
     } 

     encodedString = encodedString.substring(0, encodedString.length()-1); 

     return encodedString; 
    } 

任何建議都會很棒,我還啓用了清單中的Internet權限!

回答

0

您需要使用AsyncTask類將數據發佈到服務器。下面的代碼:

首先由包括以下依賴

compile 'com.squareup.okhttp3:okhttp:3.6.0' 

這異步課程將幫助你POST請求發送給服務器添加Okhttp庫。

private class GetMyTask extends AsyncTask<Void, Void, Boolean> { 

    private final String mToken; 

    GetMyTask(String token) { 
     mToken = token; 
    } 

    @Override 
    protected Boolean doInBackground(Void... params) { 
     // TODO: attempt authentication against a network service. 
     try { 
      responsecode = 0; 
      responsedata = ""; 
      responsemsg = ""; 
      RequestBody body = RequestBody.create(JSON, parameters); 
      Request request = new Request.Builder() 
        .url(url) 
        .post(body) 
        .addHeader("Authorization", "Bearer " + mToken) 
        .addHeader("Content-Type", "application/x-www-form-urlencoded") 
        .addHeader("Content-Length", String.valueOf(url.length())) 
        .build(); 
      Response response = client.newCall(request).execute(); 
      responsecode = response.code(); 
      responsemsg = response.message(); 
      responsedata = response.body().string(); 
     } 
     catch (IOException iox){ 
      if(iox!=null){ 
      } 

      return false; 
     } 

     return true; 
    } 

    @Override 
    protected void onPostExecute(final Boolean success) { 

     try { 
      if (success) { 
       if (responsecode == 200) { 
        //GSON responsedata 
        if(responsedata!=null) { 
         if (responsedata != "") { 
          JSONArray jsonArray = new JSONArray(responsedata); 
         } 
        } 
       } else if(responsecode==401){ 
//      Toast.makeText(this, "Somthing went wrong!", Toast.LENGTH_LONG).show(); 
       } 
       else { 
//      Toast.makeText(this, responsedata, Toast.LENGTH_LONG).show(); 
       } 
      } else { 
       validationmsg = "Access denied!"; 
//     Toast.makeText(this, validationmsg, Toast.LENGTH_LONG).show(); 
      } 
     } 
     catch (Exception e){ 
      if(e!=null){ 
      } 
     } 
    } 

    @Override 
    protected void onCancelled() { 
//   showProgress(false); 
    } 
} 

而當你想POST請求發送到服務器調用這個類:

private GetMyTask myTask = null; 
OkHttpClient client = new OkHttpClient.Builder() 
       .connectTimeout(5, TimeUnit.MINUTES) 
       .readTimeout(5, TimeUnit.MINUTES) 
       .build(); 

myTask = new GetMyTask(access_token); 
url = ""; // your server URL 
myTask.execute(); 
相關問題