2016-07-19 182 views
0

我目前正在試圖通過做一個REST請求來獲得響應JSON,但問題是「當狀態是200:好吧,然後我得到JSON響應,但是當狀態是403:禁止然後我無法獲取JSON響應「。下面是關於200我的工作代碼:OK,但沒有任何其他狀態消息:POST請求403禁止不被支持

接口:

@Rest(rootUrl = "http://something.com", converters = {FormHttpMessageConverter.class, GsonHttpMessageConverter.class}) 
public interface RestClient { 
    @Post("/isec/api/user/login") 
    JsonObject LoginIt(@Field String email, @Field String password, @Field String type); 
} 

用法:

JsonObject p = restClient.LoginIt(emailText.getText().toString(),passwordText.getText().toString(),spinner1.getSelectedItem().toString().toUpperCase()); 
      GsonStr = new Gson().toJson(p); 
      ShowResults(p); 

登錄:

E/AndroidRuntime: FATAL EXCEPTION: pool-1-thread-1 
        Process: com.jutt.isec, PID: 3463 
        org.springframework.web.client.HttpClientErrorException: 403 Forbidden 
         at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:88) 
         at org.springframework.web.client.RestTemplate.handleResponseError(RestTemplate.java:585) 
         at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:541) 
         at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:499) 
         at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:447) 
         at com.jutt.isec.RestClient_.LoginIt(RestClient_.java:41) 
         at com.jutt.isec.MainActivity.doLogin(MainActivity.java:130) 
         at com.jutt.isec.MainActivity_.access$201(MainActivity_.java:31) 
         at com.jutt.isec.MainActivity_$5.execute(MainActivity_.java:159) 
         at org.androidannotations.api.BackgroundExecutor$Task.run(BackgroundExecutor.java:405) 
         at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:422) 
         at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
         at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:152) 
         at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:265) 
         at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
         at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
         at java.lang.Thread.run(Thread.java:818) 

任何建議或解決方案?在此先感謝

+0

如果你得到一個403禁止,那麼你將不會得到一個JSON響應開始。所以不要試圖把它作爲json來處理。 – greenapps

+0

那麼我應該如何處理這個異常或其他東西,否則我的應用程序崩潰 –

+0

將調用放入try catch塊中。那麼你的應用程序不會崩潰。如果您的應用程序崩潰,您會在LogCat中找到原因。所以你知道拋出哪個異常。告訴我們你有什麼例外。 – greenapps

回答

0

你沒有收到一個JSON,但你可以檢查你收到的狀態。 您應該使用RestErrorHandler,如前所述here

我的代碼示例

@EBean 
public class RestErrorHandler implements RestErrorHandler { 

    @RootContext 
    Context context; 

    @Bean 
    MyErrorHandler mErrorHandler; 

    @Bean 
    OttoBus ottoBus; 

    @Override 
    public void onRestClientExceptionThrown(NestedRuntimeException e) { 

     if (e instanceof HttpStatusCodeException) { 
      HttpStatusCodeException exception = (HttpStatusCodeException) e; 
      if (exception.getStatusCode() == HttpStatus.UNAUTHORIZED) { 
     mErrorHandler.handleGenericError(context.getString(R.string.auth_error)); 
      } else { 
       mErrorHandler.handleGenericError(context.getString(R.string.generic_error)); 
      } 
     } else if (e instanceof RestClientException) { 
      // do something else 
     } else { 
      mErrorHandler.handleGenericError(context.getString(R.string.root_error)); 
      Log.e("errorw", e.getMessage()); 
     } 
    } 
} 

你RESTClient實現必須擴展RestClientErrorHandling這樣

public interface RestClient extends RestClientErrorHandling 

然後,你實例化你的RESTClient實現,你應該設置您的RestErrorHandler如下:

@AfterInject 
public void init() { 
    mService.setRestErrorHandler(mErrorHandler); 
} 

你可以改變HttpStatus.UNAUTHORIZED與HttpStatus.FORBIDDEN

相關問題