android retrofit2 could not add header (415 error code) - java

I'm trying to access ticket data via skyscanner api and pass it to my view, but I cannot accomplish that, because I get 415 error code I'm using retrofit2 and adding header programmatically. My interface looks like this:
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) ;
}
and in my activity, when I'm ready to make a request I have the following code:
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");
}
});
and in my log file I see the following error:
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}
I'm not sure why it occurs, because I've tried to add headers in my interface.
Skyscanner docs reference 1 and reference 2
Thanks!

Please refer same type of example : Check your parameter type which filed is query string and which field is #Field and etc.,
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);
====================
sample request
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) {
}
});
In strings.xml
<string name="api_key_title">apikey</string>
<string name="api_key_value">xxxxxxx</string>

We need to give Content-Type for this problem and need to pass as model class
#Headers("Content-Type:application/json")
#POST("saveAddressByFE")
Call<ChangeAddressModel> updateAddress(#Body AddressModel addressModel );
Retrofit response
private void getUpdateAddress(AddressModel addressModel) {
UploadService service = APIClient.getClient(CommonSettings.MY_RECORDING_SERVER_URL).create(UploadService.class);
Call<ChangeAddressModel> call = service.updateAddress(addressModel);
call.enqueue(new Callback<ChangeAddressModel>() {
#Override
public void onResponse(Call<ChangeAddressModel> call, Response<ChangeAddressModel> response) {
if (response.body().getMessage().equalsIgnoreCase("success")) {
Toast.makeText(InsuranceAgentDetailsActivity.this, "Submitted Successfully", Toast.LENGTH_SHORT).show();
}
}
#Override
public void onFailure(Call<ChangeAddressModel> call, Throwable t) {
t.printStackTrace();
Toast.makeText(InsuranceAgentDetailsActivity.this, "Something went wrong", Toast.LENGTH_SHORT).show();
}
});
}
Model class
public class ChangeAddressModel {
#SerializedName("message")
#Expose
private String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
the data we are going to send model class(AddressModel addressModel)
public class AddressModel {
private String addressType,address,custId;
public AddressModel(String addressType, String address, String custId) {
this.addressType = addressType;
this.address = address;
this.custId = custId;
}
public String getAddressType() {
return addressType;
}
public void setAddressType(String addressType) {
this.addressType = addressType;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getCustId() {
return custId;
}
public void setCustId(String custId) {
this.custId = custId;
}
}

Related

Getting 403 status code in retrofit2 in POST request

I am trying to post JSON data in the server using retrofit2 but I am getting 403 status code, see my postman window,
i tried passing all headers that is added by postman but still it gives 403 status code, and it is running successfully in postman but not running in android retrofit
Hear
my retrofit codes are :-
public interface ApiInterface {
String BASE_URL = "https:example.com";
#Headers({"Content-Type: application/json",
"User-Agent: PostmanRuntime/7.29.2",
"Accept: */*",
"Cache-Control: no-cache",
"Postman-Token: 9151e8a4-7665 - 416d - b2f5 - a84f0736a7ba",
"Host: xyz.com",
"Accept-Encoding:gzip, deflate, br",
"Content-Length: 76" })
#POST("add_aadharinfo")
Call<DataClass> posImages(#Body JSONObject data);
}
My MainActivity retrofit codes:-
private void ImageInfo() throws JSONException {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(ApiInterface.BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
ApiInterface apiInterface = retrofit.create(ApiInterface.class);
JSONObject dataInfo = new JSONObject();
dataInfo.put("phone",contact);
dataInfo.put("profile_image",encoded);
dataInfo.put("aadhar_image",encoded22);
Call<DataClass> usercall = apiInterface.posImages(dataInfo);
usercall.enqueue(new Callback<DataClass>() {
#Override
public void onResponse(Call<DataClass> call, retrofit2.Response<DataClass> response) {
if (response.isSuccessful())
{
Toast.makeText(SignUpActivity.this,response.body().getMessage(),Toast.LENGTH_LONG).show();
}
Log.d("response", "onResponse: "+response.code());
}
#Override
public void onFailure(Call<DataClass> call, Throwable t) {
Toast.makeText(SignUpActivity.this,"fail"+t.getLocalizedMessage(),Toast.LENGTH_LONG).show();
}
});
}
My dataClass:-
public class DataClass {
private String message;
private String data;
public DataClass(String message, String data) {
this.message = message;
this.data = data;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
}

Android Retrofit 2 - problem with sending the Array<Object> using POST

im new with retrofit and now, when i know how to sent the normal data without any objects, just with parameters or simple body i want to know how to sent the objects...
I spent like 20h to debug it and i'm confused because i dont know how to do this...
There is my codes:
API Interface:
#POST("/api/assortment")
Call<PostAssortment> getAssortment(#Body String PostShipmentProgress);
PostAssortment class:
public class PostAssortment {
private String JSON;
#SerializedName("token")
#Expose
private String token;
#SerializedName("assortment")
#Expose
private Assortment assortment;
#SerializedName("tokens")
#Expose
private List<String> tokens;
#SerializedName("positions")
#Expose
private List<Position> positions;
#SerializedName("deviceId")
#Expose
private String deviceId;
public String getToken() {
return token;
}
public void setToken(String token) {
this.token = token;
}
public Shipment getAssortment() {
return assortment;
}
public void setAssortment(Assortment assortment) {
this.assortment = assortment;
}
public List<String> getTokens() {
return tokens;
}
public void setTokens(List<String> tokens) {
this.tokens = tokens;
}
public List<Position> getPositions() {
return positions;
}
public void setPositions(List<Position> positions) {
this.positions = positions;
}
public String getDeviceId() {
return deviceId;
}
public void setDeviceId(String deviceId) {
this.deviceId = deviceId;
}
public String getJSON() {
return JSON;
}
public void setJSON(String JSON) {
this.JSON = JSON;
}
}
And the mainJava class:
Gson gson = new Gson();
PostAssortment postAssortment= new PostAssortment();
List<String> tokens = new ArrayList<>();
tokens.add("someToken");
postAssortment.setTokens(tokens);
postAssortment.setDeviceId("aaaaa");
List<Position> currentPosition = new ArrayList<>();
Position cp = new Position();
cp.setItemName("Some");
cp.setPlace("POLAND");
cp.setTimestamp("2020-12-09T11:00:00");
currentPosition.add(cp);
postAssortment.setPositions(currentPosition);
String postAssortmentJSON = gson.toJson(postAssortment);
Call<PostAssortment> call = ApiLoginInterface.getAssortment(postAssortmentJSON);
call.enqueue(new Callback<PostAssortment>() {
#Override
public void onResponse(Call<PostAssortment> call, Response<PostAssortment> response) {
PostAssortment assortmentResponse = response.body();
}
#Override
public void onFailure(Call<PostAssortment> call, Throwable t) {
Log.d("FAILURE", "onFailure: " + t.getMessage());
}
});
}
And my retrofit onCreate:
Gson gson = new GsonBuilder()
.setLenient()
.create();
String BASE_URL = getString(API_URL);
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create(gson))
.build();
ApiLoginInterface = retrofit.create(ApiLoginInterface.class);
And after im trying to call it im not getting any point on call enqueue just a
Android: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.Object.toString()' on a null object reference
Error...
Can someone describe this and help me to make it work? :/
You haven't provided enough information to help identify the error. Probably add the full stacktrace to the question as well. But if your API post request is expecting a json body I would start with the fixes below:
Remove this:
String postAssortmentJSON = gson.toJson(postAssortment);
Then pass your object as a pojo to your retrofit interface like this:
#POST("/api/assortment")
Call<PostAssortment> getAssortment(#Body PostAssortment postAssortment);
Then when doing your call you don't need to convert it to a string json string. The adapter does that for you:
Call<PostAssortment> call = ApiLoginInterface.getAssortment(postAssortment);
Post assortment in my problem will be in a list, so to make it works I need to change the Call to

Android retrofit expected BEING_OBJECT but was string at line 1 column 1

I'm having trouble while i was creating an Android App that have to LogIn or Register. I'm using Retrofit that make a request to a php file in my server. Below I put my code, i searched everywhere for a solution but I didn't found nothing. What I'm tryng to do is registration for now, I'm tryng to insert data in my sql database. Sorry for my bad english
Api Client
public class ApiClient {
private static final String BASE_URL = "https://tommytest22.000webhostapp.com/";
private static Retrofit retrofit;
public static Retrofit getApiClient() {
if (retrofit == null) {
Gson gson = new GsonBuilder()
.setLenient()
.create();
retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create(gson))
.build();
}
return retrofit;
}
}
Api Interface
public interface ApiInterface {
#FormUrlEncoded
#POST("/save.php")
Call<Utente> salvaUtente(
// #Field("id_utente") int id_utente,
#Field("username") String username,
#Field("password") String password
);
}
User Class
public class Utente {
#Expose
#SerializedName("id_utente") private int id_utente;
#Expose
#SerializedName("username") private String username;
#Expose
#SerializedName("password") private String password;
#Expose
#SerializedName("success") private Boolean success;
#Expose
#SerializedName("messaggio") private String messaggio;
}
Registration Method activate by click on button
private boolean registraUtente(final String username,final String password){
progressDialog.show();
apiInterface= ApiClient.getApiClient().create(ApiInterface.class);
Call<Utente> call= apiInterface.salvaUtente(username,password);
call.enqueue(new Callback<Utente>() {
#Override
public void onResponse(#NonNull Call<Utente> call, #NonNull Response<Utente> response) {
progressDialog.dismiss();
if (response.isSuccessful() && response.body() != null) {
Boolean success = response.body().getSuccess();
if (success) {
Toast.makeText(MainActivity.this, response.body().getMessaggio(), Toast.LENGTH_LONG).show();
finish();
}
} else {
Toast.makeText(MainActivity.this, response.body().getMessaggio(), Toast.LENGTH_LONG).show();
}
}
#Override
public void onFailure(#NonNull Call<Utente> call, #NonNull Throwable t) {
progressDialog.dismiss();
Toast.makeText(MainActivity.this, t.getLocalizedMessage(),Toast.LENGTH_LONG).show();
}
});
return true;
}
connect.php
<?php
$conn=mysqli_connect(PARAMETERS);
if($conn){
}else{
echo "not connected";
}
?>
save.php:
<?php
if($_SERVER['REQUEST_METHOD']=='POST'){
$username=$_POST['username'];
$password=$_POST['password'];
require_once("connect.php");
$query="INSERT INTO `Utenti`(`username`, `password`) VALUES('$username','$password')";
if(mysqli_query($conn,$query)){
$response['success']=true;
$response['message']="Utente inserito correttamente";
}else{
$response['success']=false;
$response['message']="Utente non inserito ";
}
}else{
$response['success']=false;
$response['message']="CONNESSIONE NON RIUSCITA ";
}
echo json_encode($response);
?>
You are printing "connesso" in your server response. Remove this in your save.php file.
Update your query in save.php with this:
$query="INSERT INTO `Utenti`(`username`, `password`) VALUES('".$username."','".$password')."');";

How to POST an ArrayList with a String at the same time in RETROFIT?

I'm trying to post an ArrayList and a String value in Retrofit. How can I send them at the same post ?
I've tried this but it didn't work.
Thank you.
Etiket_post.java
#POST("/api/r_etiket")
Call<Result> post_etiket(#Body List< EtiketItem_List> items, #Body String FileNo);
Print_Screen.java
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("myURL")
.addConverterFactory(GsonConverterFactory.create())
.build();
Etiket_Post etiket_post = retrofit.create(Etiket_Post.class);
String FileNo = FileId;
ArrayList<EtiketItem_List> items = new ArrayList<>();
for (int e = 0; e < okutulan_list.size(); e++) {
items.add(new EtiketItem_List(
okutulan_list.get(e).STOK_KODU,
okutulan_list.get(e).STOK_ADI,
okutulan_list.get(e).OlcuBrim,
okutulan_list.get(e).STHAR_GCMIK));
}
Call<Result> call = etiket_post.post_etiket(items, FileNo);
call.enqueue(new Callback<Result>() {
#Override
public void onResponse(Call<Result> call, Response<Result> response) {
Toast.makeText(Print_Screen.this, response.body().result, Toast.LENGTH_LONG).show();
}
#Override
public void onFailure(Call<Result> call, Throwable t) {
Toast.makeText(Print_Screen.this, t.getLocalizedMessage(), Toast.LENGTH_LONG).show();
}
});
You can send data in raw format using Retrofit2 like this.
{
"String1" :"anyString",
"arrayList":[
{
"A":"Appple",
"B":"ball"
}
]
}
modelClass example
#SerializedName("user_id")
#Expose
private String user_id;
#SerializedName("product")
#Expose
List<OneProductModel> oneProductModels;
public CartPost(String user_id, List<OneProductModel> oneProductModels) {
this.user_id = user_id;
this.oneProductModels = oneProductModels;
}
#POST("/api/r_etiket")
Call<Result> post_etiket(#Body modelClass);

Retrofit: sending POST request

This is declaration of my POST request:
#POST("/api/geo/getLoc")
public void getFriendsLocation(#Field("Id") int Id, #Field("Number") String Number, #Field("FriendNumber") String FriendNumber, Callback<JsonElement> response);
This is how i try to send and handle this request:
String ENDPOINT = "http://52.88.**.***";
FriendModel ff = new FriendModel();
ff.setFriendNumber("380935275259");
ff.setId(516);
ff.setNumber("380936831127");
RestAdapter adapter = new RestAdapter.Builder()
.setEndpoint(ENDPOINT)
.build();
WayfAPI api = adapter.create(WayfAPI.class);
api.getFriendsLocation(ff.getId(), ff.getNumber(), ff.getFriendNumber(), new Callback<JsonElement>() {
#Override
public void success(JsonElement jsonElement, Response response) {
String strObj = jsonElement.toString();
}
#Override
public void failure(RetrofitError error) {
}
});
Error:
retrofit.RetrofitError: WayfAPI.getFriendsLocation: #Field parameters can only be used with form encoding. (parameter #1)
What's wrong with my request ?
I guess you forget #FormUrlEncoded annotation in your method declaration. It should be like this:
#FormUrlEncoded
#POST("/api/geo/getLoc")
public void getFriendsLocation(#Field("Id") int Id, #Field("Number") String Number, #Field("FriendNumber") String FriendNumber, Callback<JsonElement> response);

Categories