2016-12-18 6 views
0

Я пытаюсь использовать REST API с Android-приложением, которое я разрабатываю в Android Studio. Я разработал API, используя Spring Boot.

Проблема:

Всякий раз, когда я звоню в свой API, я всегда возвращаю неавторизованный ответ 401. Msgstr "Предварительно аутентифицированная точка входа называется. Отклонение доступа."

Я настроил мой CORS следующим образом:
cors: allowed-origins: "*" allowed-methods: GET, PUT, POST, DELETE, OPTIONS allowed-headers: "*" exposed-headers: allow-credentials: true max-age: 1800Android HttpURLConnection всегда неавторизованный ответ 401 (Spring Boot REST API)

Моего апи работает на локальном хосте: 8080, и я делаю запросы от моего устройства с моим WLAN адресом IPv4.

Такие, как: завиток -v -X ПОЛУЧИТЬ http://192.168.1.xx:8080/api/users
Это возвращает 200 OK ответ.
Я также могу назвать это в почтальоне/DHC и т. Д. И получить ответ 200 OK.

Однако, когда я вызываю тот же адрес с HttpURLConnection через мое устройство Android, я получаю ответ 401.

Noob разработчик здесь - любые идеи относительно того, что может быть причиной этого, будем очень благодарны!

Редактировать, чтобы включить мой запрос GET:

@Override 
protected String doInBackground(String... params){ 
    String stringUrl = params[0]; 
    String result; 
    String inputLine; 
    try { 
     //Create a URL object holding our url 
     URL myUrl = new URL(stringUrl); 
     //Create a connection 
     HttpURLConnection connect =(HttpURLConnection) 
       myUrl.openConnection(); 
     connect.setRequestMethod(REQUEST_METHOD); // GET 
     connect.setRequestProperty("Host", HOST); 
     connect.setRequestProperty("Connection", "keep-alive"); 
     connect.setRequestProperty("Origin", ORIGIN); 
     connect.setRequestProperty("User-Agent", System.getProperty("http.agent")); 
     connect.setRequestProperty("Content-Type", CONTENT_TYPE); 
     connect.setRequestProperty("Accept", "*/*"); 
     connect.setRequestProperty("Accept-Encoding", ACCEPT_ENCODING); 
     connect.setRequestProperty("Accept-Language", ACCEPT_LANGUAGE); 

     connect.setDoOutput(true); 
     connect.setDoInput(true); 

     //Connect to our url 
     connect.connect(); 
     String responseMessage = connect.getResponseMessage(); // Unathorized 
     int responseCode = connect.getResponseCode(); //401 
     //Create a new InputStreamReader 
     InputStreamReader streamReader = new 
       InputStreamReader(connect.getInputStream()); 
     //Create a new buffered reader and String Builder 
     BufferedReader reader = new BufferedReader(streamReader); 
     StringBuilder stringBuilder = new StringBuilder(); 
     //Check if the line we are reading is not null 
     while((inputLine = reader.readLine()) != null){ 
      stringBuilder.append(inputLine); 
     } 
     //Close our InputStream and Buffered reader 
     reader.close(); 
     streamReader.close(); 
     //Set our result equal to our stringBuilder 
     result = stringBuilder.toString(); 
    } 
    catch(IOException e){ 
     e.printStackTrace(); 
     result = null; 
    } 
    return result; 
} 
+0

Это может помочь вам - Http: // StackOverflow .com/questions/6176609/connect-an-android-device-to-a-web-service-on-local-host – Rahul

+0

Заменить: - InputStreamReader streamReader = new InputStreamReader (connect.getInputStream()); С: - InputStreamReader streamReader = new InputStreamReader (connect.getErrorStram()); Это поможет вам отслеживать, почему 401 тогда вы можете продолжить решение этой проблемы. 401-- проблема на стороне сервера, сервер не может обработать ваш запрос, проверьте, нужно ли передавать данные в заголовке или URL-адресе, когда вы используете запрос на получение. – Mrinmoy

ответ

1

Заменить: -

InputStreamReader StreamReader = новый InputStreamReader (connect.getInputStream());

С: -

InputStreamReader StreamReader = новый InputStreamReader (connect.getErrorStram());

Это поможет вам отслеживать, почему 401 тогда вы можете продолжить решение этой проблемы.

401-- проблема на стороне сервера, сервер не может обработать ваш запрос, проверить, если вы должны передать данные в заголовке или URL, как вы используете запрос GET

+1

Эй, отлично, спасибо за это. Я понял, что это проблема с моим фильтром CORS. В случае, если кто-то задается вопросом, что фильтр безопасности пружины имел более высокий приоритет, чем мой фильтр CORS, и поэтому отклонял мои запросы с моего планшета. Я исправил это, добавив '.authorizeRequests() .antMatchers (HttpMethod.OPTIONS, "/ **"). AllowAll() 'в моей SecurityConfiguration. – Dayna

+0

Как настроить фильтр CORS на '@Order (Ordered.HIGHEST_PRECEDENCE)' По умолчанию цепочка безопасности установлена ​​в Order '0', которую можно установить с помощью таких свойств, как' security.filter-order = ' – Dayna

Смежные вопросы