2016-08-09 2 views
0

Я новичок. Это мое первое приложение для Android. У меня проблема с отправкой данных на мой Drupal-сервер с Android. Я использую Rest api.Android, Rest api post error - Доступ запрещен

Я могу войти как пользователь admin Drupal, я получаю идентификатор сеанса, имя сеанса и токен. Моя проблема заключается в отправке данных. Я думаю, что проблема заключается в аутентификации при публикации. Я не знаю, как это сделать.

И ИНТЕРНЕТ и ACCESS_NETWORK_STATE объявляется в явном

Вход части (рабочий)

private class LoginProcess extends AsyncTask<Void, Void, String> { 
    @Override 
    protected String doInBackground(Void... voids) { 
     String address = "http://app.flickgo.com/apistuff/user/login.json"; 
     HttpURLConnection urlConnection; 
     String requestBody; 
     Uri.Builder builder = new Uri.Builder(); 
     Map<String, String> params = new HashMap<>(); 
     params.put("username", "myUsername"); 
     params.put("password", "myPassword"); 

     // encode parameters 
     Iterator entries = params.entrySet().iterator(); 
     while (entries.hasNext()) { 
      Map.Entry entry = (Map.Entry) entries.next(); 
      builder.appendQueryParameter(entry.getKey().toString(), entry.getValue().toString()); 
      entries.remove(); 
     } 
     requestBody = builder.build().getEncodedQuery(); 

     try { 
      URL url = new URL(address); 
      urlConnection = (HttpURLConnection) url.openConnection(); 
      urlConnection.setDoOutput(true); 
      urlConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 
      OutputStream outputStream = new BufferedOutputStream(urlConnection.getOutputStream()); 
      BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(outputStream, "utf-8")); 
      writer.write(requestBody); 
      writer.flush(); 
      writer.close(); 
      outputStream.close(); 

      JSONObject jsonObject = new JSONObject(); 
      InputStream inputStream; 
      // get stream 
      if (urlConnection.getResponseCode() < HttpURLConnection.HTTP_BAD_REQUEST) { 
       inputStream = urlConnection.getInputStream(); 
      } else { 
       inputStream = urlConnection.getErrorStream(); 
      } 
      // parse stream 
      BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); 
      String temp, response = ""; 
      while ((temp = bufferedReader.readLine()) != null) { 
       response += temp; 
      } 
      // put into JSONObject 
      jsonObject.put("Content", response); 
      jsonObject.put("Message", urlConnection.getResponseMessage()); 
      jsonObject.put("Length", urlConnection.getContentLength()); 
      jsonObject.put("Type", urlConnection.getContentType()); 

      return jsonObject.toString(); 
     } catch (IOException | JSONException e) { 
      return e.toString(); 
     } 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     super.onPostExecute(result); 
     //create an intent to start the ListActivity 
     Intent intent = new Intent(LoginActivity.this, SecondActivity.class); 
     //pass the session_id and session_name to ListActivity 
     intent.putExtra("My_result", result); 
     //start the ListActivity 
     startActivity(intent); 
    } 
} 


сообщение часть, не работает.
В SecondActivity я хочу опубликовать некоторые данные. Вот где у меня проблемы. Я все время теряю доступ к сообщениям.

Как я могу использовать идентификатор сеанса, имя сеанса или токен из результата (intent.putExtra («My_result», result) - со страницы входа), чтобы опубликовать контент? Действительно ли это правильный способ сделать это? Если есть лучший способ, пожалуйста, дайте мне знать.

private class JsonPostRequest extends AsyncTask<Void, Void, String> { 
    @Override 
    protected String doInBackground(Void... voids) { 
     try { 
      String address = "http://app.flickgo.com/apistuff/node.json"; 
      JSONObject json = new JSONObject(); 
      json.put("title", "Dummy Title"); 
      json.put("type", "article"); 
      String requestBody = json.toString(); 
      URL url = new URL(address); 
      HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); 

      urlConnection.setDoOutput(true); 
      urlConnection.setRequestProperty("Content-Type", "application/json"); 
      OutputStream outputStream = new BufferedOutputStream(urlConnection.getOutputStream()); 
      BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(outputStream, "utf-8")); 
      writer.write(requestBody); 
      writer.flush(); 
      writer.close(); 
      outputStream.close(); 

      InputStream inputStream; 
      // get stream 
      if (urlConnection.getResponseCode() < HttpURLConnection.HTTP_BAD_REQUEST) { 
       inputStream = urlConnection.getInputStream(); 
      } else { 
       inputStream = urlConnection.getErrorStream(); 
      } 
      // parse stream 
      BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); 
      String temp, response = ""; 
      while ((temp = bufferedReader.readLine()) != null) { 
       response += temp; 
      } 
      // put into JSONObject 
      JSONObject jsonObject = new JSONObject(); 
      jsonObject.put("Content", response); 
      jsonObject.put("Message", urlConnection.getResponseMessage()); 
      jsonObject.put("Length", urlConnection.getContentLength()); 
      jsonObject.put("Type", urlConnection.getContentType()); 
      return jsonObject.toString(); 
     } catch (IOException | JSONException e) { 
      return e.toString(); 
     } 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     super.onPostExecute(result); 
     Toast.makeText(LoginActivity.this, result + "Test", Toast.LENGTH_LONG).show(); 
     //Log.i(LOG_TAG, "POST RESPONSE: " + result); 
     //mTextView.setText(result); 
    } 
} 

Заранее спасибо

+0

Вы объявили разрешение на доступ в интернет в файле манифеста? – TilalHusain

+0

Да, как ИНТЕРНЕТ, так и ACCESS_NETWORK_STATE объявлен в манифесте – Kong

+0

Ошибка отказа в доступе возвращается с сервера или вы получили это из какого-то заброшенного исключения? – TilalHusain

ответ

0

Я решил Эта проблема. Я не установил файлы cookie правильным способом.

urlConnection.setRequestProperty("Cookie",session_name+"="+session_id); 
0

Попробуйте этот фрагмент:

HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); 
    urlConnection.setRequestMethod("POST"); 
    urlConnection.setDoOutput(true); 
    DataOutputStream wr = new DataOutputStream(urlConnection.getOutputStream()); 
    wr.writeBytes(requestBody); 
    wr.flush(); 
    wr.close(); 

    InputStream inputStream = urlConnection.getInputStream(); 
    // .. 

Bytheway, вы бы лучше использовать OkHttp и делать запрос POST будет намного проще

+0

К сожалению, это не сработало. – Kong

+0

см. Отредактированный ответ, пожалуйста –

+0

Как насчет токена и идентификатора сеанса. Разве мне не нужно устанавливать его в заголовке, чтобы сделать сообщение? Благодарим вас за консультацию. Я посмотрю на OkHttp – Kong

0
Map<String, Object> params = new HashMap<>(); 
params.put("username", "myUsername"); 
params.put("password", "myPassword"); 
postLogin(getApplicationContext(),"http://app.flickgo.com/apistuff/node.json",params) 

public JSONObject postLogin(Context mContext, String REQUEST_URL,Map<String, Object> params) { 
       JSONObject jsonObject = null; 
       BufferedReader reader = null; 
       try { 
        URL url = new URL(REQUEST_URL); 
        StringBuilder postData = new StringBuilder(); 

        for (Map.Entry<String, Object> param : params.entrySet()) { 
         if (postData.length() != 0) postData.append('&'); 
         postData.append(URLEncoder.encode(param.getKey(), "UTF-8")); 
         postData.append('='); 
         postData.append(URLEncoder.encode(String.valueOf(param.getValue()), "UTF-8")); 
        } 
        byte[] postDataBytes = postData.toString().getBytes("UTF-8"); 

        HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
        connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 
       connection.setRequestProperty("Authorization", token); //Set your token 
        connection.setConnectTimeout(8000); 
        connection.setRequestMethod("POST"); 
        connection.setUseCaches(false); 
        connection.setDoOutput(true); 
        connection.getOutputStream().write(postDataBytes); 
        connection.connect(); 
        StringBuilder sb; 
        int statusCode = connection.getResponseCode(); 
        if (statusCode == 200) { 
         sb = new StringBuilder(); 
         reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); 
         String line; 
         while ((line = reader.readLine()) != null) { 
          sb.append(line); 
         } 
         jsonObject = new JSONObject(sb.toString()); 
        } 
        connection.disconnect(); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } finally { 
        if (reader != null) { 
         try { 
          reader.close(); 
         } catch (Exception e) { 
          e.printStackTrace(); 
         } 
        } 
       } 
       return jsonObject; 
      } 
Смежные вопросы