2016-09-27 20 views
0

スカイスキャナーAPI経由でチケットデータにアクセスして、ビューに渡そうとしていますが、これを達成できません。415エラーコード私は使用していますretrofit2を追加し、プログラムでヘッダを追加します。私のインターフェイスは、次のようになります。私は次のエラーが表示アンドロイドretrofit2さんがヘッダーを追加できませんでした。(415エラーコード)

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"); 
     } 
    }); 

と私のログファイルに:

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) ; 
} 

と私は、次のコードを持っている要求を作成する準備ができてよ、私の活動、中

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} 

私は自分のインターフェイスにヘッダーを追加しようとしたため、なぜそれが発生するのかわかりません。

スカイスキャナードキュメント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を確認してください。サンプル要求のstrings.xmlで

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) { 

       } 
}); 

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

I

====================

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); 
改造2を使用し、改造1に基づいた回答を掲載したコードを修正してください。ありがとう –

関連する問題