2017-02-21 44 views
2

БрифинГ ДО «технические вещи»
Не новый к работе с Модернизированный, но наткнулся на это странное поведение, которое я с очень трудное время, чтобы понять и исправить, У меня есть два веб-сервиса, оба работают нормально, как и ожидалось в Postman и iOS, но только один работает в Retrofit, а не в другом,
В моей защите я могу сказать, что получаю (неавторизованный) ответ, что означает, что я смог ударить сервер и получить результат
В защите разработчика API он говорит, что он работает в Postman и других устройствах, поэтому не проблема обслуживанияПолучение 401 Несанкционированное ретрофитом, но работает в Почтальон и Swift

Если какой-либо эксперт по доработке, расскажите мне, что может быть сделано за моей спиной, чтобы получить эту ошибку?

ТЕХНИЧЕСКИЕ STUFF
Говоря о типе службы, он содержит Авторизация Bearer лексема в качестве заголовка, который истекает через каждые 6 часов и не содержит Params вообще (так оно должно быть просто, правда?) И простой URL http://hashchuna.nn-assets.com/api/locations
К сожалению, маркер заголовка наклоняю совместно с действительным ключом, потому it'l быть истек до любой желающий может попробовать, но здесь это все равно Авторизация Bearer 3d44626a55dbb024725984e0d37868336fd7e48a

, что я попытался
Я использую okhttp перехватывать добавить Authorization заголовок для запроса с использованием как AddHeader/заголовок метода, без пробелов в URL потому что не г нет Params
Getting 401 unauthorized error in retrofit?
Java: Android: Retrofit - using Call but, Response{code = 401,message=unauthorized}
https://github.com/square/retrofit/issues/1290
Но не они помогли

ПРЕДУПРЕЖДЕНИЕ
Теперь сложная часть, чтобы иметь в виде, маркер, когда истек должны дать 401 ошибки, которая, как ожидается, но проблема даже для недавно созданных лексем я получаю 401, которая является моей основной проблемой

LOG

D/OkHttp: --> GET http://hashchuna.nn-assets.com/api/locations http/1.1 
D/OkHttp: Authorization: Bearer 7c0d53de006b6de931f7d8747b22442354cecef9 
D/OkHttp: --> END GET 
D/OkHttp: <-- 401 Unauthorized http://hashchuna.nn-assets.com/api/locations (773ms) 
D/OkHttp: Date: Mon, 20 Feb 2017 10:44:11 GMT 
D/OkHttp: Server: Apache 
D/OkHttp: X-Powered-By: PHP/7.0.15 
D/OkHttp: Access-Control-Allow-Origin: * 
D/OkHttp: Access-Control-Allow-Credentials: true 
D/OkHttp: Access-Control-Max-Age: 1000 
D/OkHttp: Access-Control-Allow-Headers: X-Requested-With, Content-Type, Origin, Authorization, Accept, Client-Security-Token, Accept-Encoding 
D/OkHttp: Access-Control-Allow-Methods: POST, GET, OPTIONS, DELETE, PUT 
D/OkHttp: Expires: Thu, 19 Nov 1981 08:52:00 GMT 
D/OkHttp: Cache-Control: no-store, no-cache, must-revalidate 
D/OkHttp: Pragma: no-cache 
D/OkHttp: Set-Cookie: PHPSESSID=u477o8g0q387t92hms4nhc14n1; path=/ 
D/OkHttp: Vary: Authorization 
D/OkHttp: X-Powered-By: PleskLin 
D/OkHttp: Keep-Alive: timeout=5 
D/OkHttp: Connection: Keep-Alive 
D/OkHttp: Transfer-Encoding: chunked 
D/OkHttp: Content-Type: application/json;charset=utf-8 
D/OkHttp: <-- END HTTP 

КОД
Intercept

Request request = chain 
         .request() 
         .newBuilder() 
         //.header("Authorization","Bearer "+ SharedPrefsUtils.getSPinstance().getAccessToken(context)) 
         .addHeader("Authorization","Bearer 1ed6b7c1839e02bbf7a1b4a8dbca84d23127c68e") 
         //.addHeader("cache-control", "no-cache") 
         //.cacheControl(CacheControl.FORCE_NETWORK) 
         .build(); 

дооснащения Instance

private Api getApiInstance(Context context) { 
     HttpLoggingInterceptor logInter = new HttpLoggingInterceptor(); 
     logInter.setLevel(HttpLoggingInterceptor.Level.BODY); 
     OkHttpClient mIntercepter = new OkHttpClient.Builder() 
       .addInterceptor(new RequestResponseInterseptor(context)) 
       .addInterceptor(logInter) 
       .build(); 

     Retrofit retrofitInstance = new Retrofit.Builder() 
       //.addConverterFactory(new NullOnEmptyConverterFactory()) 
       .addConverterFactory(GsonConverterFactory.create()) 
       .baseUrl(BASE_URL) 
       .client(mIntercepter) 
       .build(); 
     return retrofitInstance.create(Api.class); 
    } 
+1

Вы АБСОЛЮТНО уверены, что добавляете обновленный токен в свои заголовки? Похоже, вы просто используете старый токен. – C0D3LIC1OU5

+0

@ C0D3LIC1OU5 Да, я знаю, что проблема звучит так, как ошибка OBVIOUS, но ее нет, я даже жестко запрограммирован, как только я сгенерировал новый токен, если не произойдет некоторое кэширование с помощью модификации, о котором я не знаю – Ujju

+0

Еще одна вещь, проверьте, что КЛЮЧИ, добавляемые в заголовок, соответствуют тому, что ожидает сервер, и у них нет опечаток. Как и ключ «Авторизация» для значения токена (или того, что вы их вызываете) – C0D3LIC1OU5

ответ

3

РЕШЕНИЕ
Благодаря некоторые советы, реальная причина Несовместимость службы, Supposedly POSTMAN и IOS клиента хранения и повторного использования COOKIE все само по себе, когда запросы сделаны без необходимости явного обращения, Cookie в Почтальон может быть проверен с помощью Postman Intercepter, но не может изменить, так как хром не позволяет редактирования куков с помощью плагин

Однако ДООСНАСТКА/OkHttp, если указано не будет рассматривать его выключенным (по соображениям безопасности, может быть), добавляется
Cookie либо внутри Interseptor как один из заголовков addHeader("Cookie","KEY-VALUE")
или
Использование cookieJar добавить в

OkHttpClient mIntercepter = new OkHttpClient.Builder() 
       .cookieJar(mCookieJar) 
       .addInterceptor(new RequestResponseInterseptor(context)) 
       .addInterceptor(logInter) 
       .build(); 

зависимости от ваших потребностей и печенья типа

+1

Для вашего 'но can not отредактируйте, потому что chrome не разрешает редактирование cookie плагинами', я думаю, вы можете попробовать Postman App для Win/MacOS на https://www.getpostman.com/ – BNK

+0

Да, я даю вам попробовать, мог бы сэкономить много времени, если я его до этого, .. – Ujju

2

Я думаю, что вы перекрывая другие заголовки Retrofit добавляет для вас, в результате чего ваш API не заботиться о вашем Authorization заголовке. Код ниже добавит заголовок к существующим заголовкам вместо их переопределения.

OkHttpClient mIntercepter = new OkHttpClient.Builder() 
      ... 
      .addInterceptor(new Interceptor() { 
       @Override 
       public Response intercept(Chain chain) throws IOException { 
         Request request = chain.request().newBuilder().addHeader("Authorization", "Bearer " + "1ed6b7c1839e02bbf7a1b4a8dbca84d23127c68e").build(); 
         return chain.proceed(request); 
      }) 
      ... 
      .build(); 

Формат этих заголовков является правильно здесь, ключ должен быть Authorization и значение должно быть Bearer 1ed6b7c1839e02bbf7a1b4a8dbca84d23127c68e (в вашем случае).

+0

Я использую Retrofit 2.1.0, как 'RestAdapter', так и' RequestInterceptor' был заменен на 'Request' и' OkHttpClient' – Ujju

+0

См. edit - обновлено для версии 2.1.0' – C0D3LIC1OU5

+0

Но это выглядит так же, как мой перехват справа ,,? мой 'RequestResponseInterseptor' расширяет' Interceptor' и создает тот же запрос, вы можете проверить мой код Intercept – Ujju

1
401 Unauthorized http://www.stackoverflow.com/api/[email protected]&password=123456 
Date: Fri, 07 Apr 2017 11:23:28 GMT 
Server: Apache/2.4.25 (Amazon) PHP/5.6.29 
X-Powered-By: PHP/5.6.29 
Cache-Control: no-cache, private 
X-RateLimit-Limit: 60 
X-RateLimit-Remaining: 59 
Content-Length: 41 
Keep-Alive: timeout=5, max=100 
Connection: Keep-Alive 
Content-Type: application/json 
{"msg":"Invalid Credentials"} 

я столкнулся вопрос, как этого не умелая выборкой сообщение об ошибке.

Когда сервер бросает ошибку как 401 или другой ошибки мы получаем null body от server.But вы можете получить сообщение об ошибке от сервера в errorBody

String response = response.errorBody().string() 
+0

Спасибо за ответ, но моя проблема была не в том, чтобы не получить сообщение об ошибке msg, я получил ошибкуBody просто отлично, в моем случае msg был somthing like '{ "errors": [{"code": "bad_request", "title": "not_authorised"}]} ' – Ujju

0

В моем случае, к сожалению ни один из советов, перечисленных в @Ujju «s решение не работает (т. е. не используется ни «Cookie», ни CookieJar). Единственное, что мне помогло - это просто замена addInterceptor на addNetworkInterceptor, и все стало работать.