Я использую модификацию, чтобы отправить вызов api, чтобы опубликовать проблему в системе отслеживания ошибок через мое приложение для Android. API нужно отформатировать определенным образом, поэтому я создал настраиваемый объект для передачи в качестве параметра. К сожалению, когда я отправляю запрос в API, он неправильно его форматирует. Он упорядочивает параметры в алфавитном порядке, помещает в кавычки как ключи, так и значения и добавляет @ в начало моих данных, что приводит к тому, что API не может понять, что я пытаюсь опубликовать. Я хочу отправить следующий формат:
{ fb_user_id: dummyUID,
email: [email protected],
first_name: John,
last_name: Smith,
project: android,
type: bug,
subject: title,
description: description }
Вместо вышеуказанного мой api получает данные как
@"description":"description",
"email":"[email protected]",
"fb_user_id":"dummyUID",
"first_name":"John",
"last_name":"Smith",
"project":"android",
"subject":"title",
"type":"bug"
Для этого я использую дооснащение, и мой интерфейс выглядит как
public interface MyAPI {
@POST("/op_create_ticket")
Observable<JsonElement> createTicket(@Body Ticket ticket);
}
И моя деятельность называет это похожим на:
public class HelpActivity extends BaseActivity {
@BindView(R.id.textView)
TextView textView;
@BindView(R.id.spinner)
Spinner spinner;
@BindView(R.id.email)
EditText email;
@BindView(R.id.firstName)
EditText firstName;
@BindView(R.id.lastName)
EditText lastName;
@BindView(R.id.subject)
EditText title;
@BindView(R.id.description)
EditText description;
@BindView(R.id.button3)
Button button3;
FirebaseAuth fbauth = FirebaseAuth.getInstance();
FirebaseUser user = fbauth.getCurrentUser();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_help);
ButterKnife.bind(this);
}
@OnClick(R.id.button3)
public void onViewClicked() {
final GsonBuilder gsonBuilder = new GsonBuilder();
final Gson gson = gsonBuilder.create();
Retrofit.Builder builder = new Retrofit.Builder();
builder.baseUrl("https://my.url");
builder.addCallAdapterFactory(RxJava2CallAdapterFactory.create());
builder.addConverterFactory(GsonConverterFactory.create());
Retrofit retrofit = builder.build();
MyAPI api = retrofit.create(TriggerWatchAPI.class);
Ticket ticket = new Ticket();
ticket.setFb_user_id(user.getUid());
ticket.setEmail(email.getText().toString());
ticket.setFirst_name(firstName.getText().toString());
ticket.setLast_name(lastName.getText().toString());
ticket.setProject("android");
ticket.setType("design");
ticket.setSubject(title.getText().toString());
ticket.setDescription(description.getText().toString());
api.createTicket(ticket).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<JsonElement>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(JsonElement jsonElement) {
Log.d(getTag(), "zzzOnNext");
}
@Override
public void onError(Throwable e) {
Log.e(getTag(), "err", e);
}
@Override
public void onComplete() {
}
});
}
}
Мне интересно, есть ли какой-нибудь конвертер или что-то, что может преобразовать мой объект в те данные, которые ищет API.
изменить: забыл добавить свой собственный pojo
package watch.trigger.Model;
public class Ticket {
private String project;
private String first_name;
private String email;
private String description;
private String subject;
private String last_name;
private String fb_user_id;
private String type;
public String getProject ()
{
return project;
}
public void setProject (String project)
{
this.project = project;
}
public String getFirst_name ()
{
return first_name;
}
public void setFirst_name (String first_name)
{
this.first_name = first_name;
}
public String getEmail ()
{
return email;
}
public void setEmail (String email)
{
this.email = email;
}
public String getDescription ()
{
return description;
}
public void setDescription (String description)
{
this.description = description;
}
public String getSubject ()
{
return subject;
}
public void setSubject (String subject)
{
this.subject = subject;
}
public String getLast_name ()
{
return last_name;
}
public void setLast_name (String last_name)
{
this.last_name = last_name;
}
public String getFb_user_id ()
{
return fb_user_id;
}
public void setFb_user_id (String fb_user_id)
{
this.fb_user_id = fb_user_id;
}
public String getType ()
{
return type;
}
public void setType (String type)
{
this.type = type;
}
@Override
public String toString()
{
return "ClassPojo [project = "+project+", first_name = "+first_name+", email = "+email+", description = "+description+", subject = "+subject+", last_name = "+last_name+", fb_user_id = "+fb_user_id+", type = "+type+"]";
}
}
только что понял, что не хватает
Можете ли вы добавить журналы модернизации?
Не знаком с модернизацией, но API ожидает JSON? Есть ли заголовок или аннотация, которые нужно установить, чтобы сообщить об отправке JSON?
это на самом деле json, если он не использует кавычки? я думал, что у json будут кавычки




не отправляйте настраиваемый объект, отправляйте объект JSON в виде строки, а в API получайте его как объект JSON.
сначала добавьте это в свой градиент:
compile 'com.squareup.retrofit2:retrofit:2.3.0'
compile 'com.squareup.retrofit2:converter-gson:2.3.0'
compile 'com.squareup.retrofit2:converter-scalars:2.3.0'
1- изменить это
public interface MyAPI {
@Headers("Content-Type: application/json")
@POST("/op_create_ticket")
Observable<JsonElement> createTicket(@Body Ticket ticket);
}
к :
public interface MyAPI {
@POST("/op_create_ticket")
Observable<String> createTicket(@Body String ticket);
}
2- изменить это
Ticket ticket = new Ticket();
ticket.setFb_user_id(user.getUid());
ticket.setEmail(email.getText().toString());
ticket.setFirst_name(firstName.getText().toString());
ticket.setLast_name(lastName.getText().toString());
ticket.setProject("android");
ticket.setType("design");
ticket.setSubject(title.getText().toString());
ticket.setDescription(description.getText().toString());
api.createTicket(ticket).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<JsonElement>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(JsonElement jsonElement) {
Log.d(getTag(), "zzzOnNext");
}
@Override
public void onError(Throwable e) {
Log.e(getTag(), "err", e);
}
@Override
public void onComplete() {
}
});
к
JSONObject tickenJson= new JSONObject();
Ticket ticket = new Ticket();
ticket.setFb_user_id(user.getUid());
ticket.setEmail(email.getText().toString());
ticket.setFirst_name(firstName.getText().toString());
ticket.setLast_name(lastName.getText().toString());
ticket.setProject("android");
ticket.setType("design");
ticket.setSubject(title.getText().toString());
ticket.setDescription(description.getText().toString());
ticketJson.put("fb_user_id",user.getUid());
ticketJson.put("email",email.getText().toString());
ticketJson.put("first_name",firstName.getText().toString());
ticketJson.put("last_name",lastName.getText().toString());
ticketJson.put("project","android");
ticketJson.put("type","design");
ticketJson.put("type",title.getText().toString());
ticketJson.put("description",description.getText().toString());
api.createTicket(ticketJson.toString()).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<JsonElement>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(JsonElement jsonElement) {
Log.d(getTag(), "zzzOnNext");
}
@Override
public void onError(Throwable e) {
Log.e(getTag(), "err", e);
}
@Override
public void onComplete() {
}
});
JsonObject.put не является допустимым методом. Вы могли иметь в виду ticketJson.addProperty?
в android есть два класса для JSON. да, ticketJson.addProperty равно ticketJson.put
После этого я получаю ответ Data: "@ \" fb_user_id \ ": \" CSLbKEtCMqf4py73Gih2udifxq73 \ ", \" email \ ": \" [email protected] \ ", \ " first_name \ ": \ "Firs t \", \ "last_name \": \ "Last \", \ "project \": \ "design \", \ "subject \" : \ "Demo \", \ "descript ion \ ": \" Фиктивный текст \ ""
используйте "JSONObject", это еще один класс для JSON. см. обновление ответа
Не забудьте добавить заголовок
изменил его с JsonObject на JSONObject, addproperty to put, добавил заголовок @Headers ({"Content-Type: application / json", "Cache-Control: max-age = 640000"}) до метода модернизации и получил тот же результат
Позвольте нам продолжить обсуждение в чате.
Пожалуйста, добавьте код Ticket.class