2016-09-27 115 views
0

我試圖通過skyscanner api訪問票據數據並將其傳遞給我的視圖,但我無法完成此操作,因爲我得到了415錯誤代碼我正在使用retrofit2並以編程方式添加標題。我的界面看起來是這樣的:android retrofit2無法添加標題(415錯誤代碼)

public interface GetFlightDetails { 

@POST("apiservices/pricing/v1.0/") 
Call<TicketData> getFlightList(@Query("apiKey") String apiKey, 
           @Query("country") String country, 
           @Query("currency") String currency, 
           @Query("locale") String locale, 
           @Query("originPlace") String originPlace, 
           @Query("destinationPlace") String destinationPlace, 
           @Query("outboundPartialDate")String outboundPartialDate, 
           @Query("inboundPartialDate") String inboundPartialDate, 
           @Query("locationschema") String locationschema, 
           @Query("cabinclass") String cabinclass, 
           @Query("adults") int adults, 
           @Query("children") int children, 
           @Query("infants") int infants, 
           @Query("groupPricing") boolean groupPricing) ; 
} 

和我的活動,當我準備做一個請求,我有以下代碼:

Gson gson = new GsonBuilder() 
      .setDateFormat("yyyy-MM-dd'T'HH:mm:ssZ") 
      .create(); 


    OkHttpClient.Builder httpClient = new OkHttpClient.Builder(); 
    //adding logging 
    HttpLoggingInterceptor logging = new HttpLoggingInterceptor(); 
    logging.setLevel(HttpLoggingInterceptor.Level.BASIC); 
    httpClient.interceptors().add(logging); 
    //headers 
    httpClient.addInterceptor(new Interceptor() { 
     @Override 
     public okhttp3.Response intercept(Chain chain) throws IOException { 
      Request original = chain.request(); 

      //adding header info 
      Request request = original.newBuilder() 
        .header("Content-Type", "application/x-www-form-urlencoded") 
        .header("Accept", "application/json") 
        .method(original.method(), original.body()) 
        .build(); 

      return chain.proceed(request); 
     } 
    }); 

    Retrofit retrofit = new Retrofit.Builder() 
      .baseUrl(BASE_URL) 
      .addConverterFactory(GsonConverterFactory.create(gson)) 
      .client(httpClient.build()) 
      .build(); 

    GetFlightDetails api = retrofit.create(GetFlightDetails.class); 

    Call<TicketData> mresponse = api 
      .getFlightList(API_KEY, country, currency, locale, from, to, 
        departDate.substring(0,10), returnDate.substring(0,10), 
        locationSchema, cabinClass, adult, children, infants, false); 

    mresponse.enqueue(new Callback<TicketData>() 
    { 
     @Override 
     public void onResponse(Call<TicketData> call, Response <TicketData> response) { 

      if (!response.isSuccessful()){ 
       Log.d("UnSuccess", response.raw().toString()); 
       return; 
      } 
      else { 
       progress.cancel(); //cancel progress dialog 
       Log.d("Success", response.raw().toString()); 
       TicketData ticketData = response.body(); 

       RecyclerAdapter adapter = new RecyclerAdapter(getApplicationContext(), ticketData); 
       mRecyclerView.setAdapter(adapter); 
      } 
     } 

     @Override 
     public void onFailure(Call<TicketData> call, Throwable t){ 
      progress.setMessage("Retrofit Error Occured"); 
     } 
    }); 

,在我的日誌文件,我看到下面的錯誤:

com.example.ex D/OkHttp: --> POST http://partners.api.skyscanner.net/apiservices/pricing/v1.0/?apiKey=xxxxxxxx&country=US&currency=USD&locale=en-us&originPlace=SFO&destinationPlace=LAX&outboundPartialDate=2016-10-24&inboundPartialDate=2016-10-31&locationschema=iata&cabinclass=Economy&adults=1&children=0&infants=0&groupPricing=false http/1.1 (0-byte body) 
com.example.ex D/OkHttp: <-- 415 Unsupported Media Type http://partners.api.skyscanner.net/apiservices/pricing/v1.0/?apiKey=xxxxxxxx&country=US&currency=USD&locale=en-us&originPlace=SFO&destinationPlace=LAX&outboundPartialDate=2016-10-24&inboundPartialDate=2016-10-31&locationschema=iata&cabinclass=Economy&adults=1&children=0&infants=0&groupPricing=false (403ms, 0-byte body) 
com.example.ex D/UnSuccess: Response{protocol=http/1.1, code=415, message=Unsupported Media Type, url=http://partners.api.skyscanner.net/apiservices/pricing/v1.0/?apiKey=xxxxxxxx&country=US&currency=USD&locale=en-us&originPlace=SFO&destinationPlace=LAX&outboundPartialDate=2016-10-24&inboundPartialDate=2016-10-31&locationschema=iata&cabinclass=Economy&adults=1&children=0&infants=0&groupPricing=false} 

我不知道它爲什麼會發生,因爲我試圖在我的界面添加標題。

Skyscanner上的文檔reference 1reference 2

謝謝!

回答

1

請參考同類型的例子:檢查該申請的查詢字符串,並且場@Field等你的參數類型,

public static final String TRAVEL_API = "http://business.skyscanner.net/"; 

public interface TravelApiInterface { 

    @FormUrlEncoded 
    @Headers("Content-Type:application/x-www-form-urlencoded; charset=UTF-8") 
    @POST("/apiservices/pricing/v1.0/") 

    void getTravelApi(
     @Field("country") String country, 
     @Field("currency") String currency, 
     @Field("locale") String locale, 
     @Field("locationSchema") String locationSchema, 
     @Field("apikey") String apikey, 
     @Field("grouppricing") String grouppricing, 
     @Field("originplace") String originplace, 
     @Field("destinationplace") String destinationplace, 
     @Field("outbounddate") String outbounddate, 
     @Field("inbounddate") String inbounddate, 
     @Field("adults") int adults, 
     @Field("children") int children, 
     @Field("infants") int infants, 
     @Field("cabinclass") String cabinclass, Callback<Object> response); 
} 

TravelApiInterface currencyRequestInterfaceService;

RestAdapter adapter = new RestAdapter.Builder() 
      .setEndpoint(Url.TRAVEL_API) 
      .setRequestInterceptor(new RequestInterceptor() { 
       @Override 
       public void intercept(RequestFacade request) { 
        request.addQueryParam(getString(R.string.api_key_title), getString(R.string.api_key_value)); 
       } 
      }) 
      .setLogLevel(RestAdapter.LogLevel.FULL) 
      .build(); 

    currencyRequestInterfaceService = adapter.create(TravelApiInterface.class); 

==================== 樣本請求

requestConversion("UK", "GBP", "en-GB", "iata", "xxxxxxxx","on", "EDI", "LHR", 
    "2016-10-04", "2016-10-11", 1, 0, 0, "Economy", new Callback<Object>() { 

       @Override 
       public void success(Object o, Response response) { 

       } 

       @Override 
       public void failure(RetrofitError error) { 

       } 
}); 

在strings.xml中

<string name="api_key_title">apikey</string> 
<string name="api_key_value">xxxxxxx</string> 
+0

我使用改造2和代碼您發佈了基於改造1的答案,請您修改它嗎?謝謝 –