0

Hello developer i'm developing a web base chat system using android and php (laravel) so in my case i implement a Rest API to send chat message using laravel.my problem is when i post data to the server (send messages) no any case messages save on the database.my from my android client response always go to the "onFailure" and display this error

Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $

i try to lots of ways unfortunately i can't find a proper way to solve out this problem.any one can help me it's a valuable help to me.Thank you...

this is my API code

 public function PostDataToChatRoom(Request $request){

  $ChatRoom=$request->ChatroomId;

  if($ChatRoom == '1'){

  }
  elseif ($ChatRoom == "2"){

      $message= new Message();
      $message->SenderId = $request->input('SenderId');
      $message->ChatroomId = $request ->input('ChatroomId');
      $message->MessageTxt =$request ->input('MessageTxt');
      $message->SenderName=$request->input('SenderName');

      if($message->save())
      {
          event(
              new ForxChatEvent($message)
          );

          return response()->json([$message],200);
      }
  }
  else{
      echo 'aaa';
  }

}

this is my API response data

[
{
    "SenderId": "123",
    "ChatroomId": "2",
    "MessageTxt": "yooo",
    "SenderName": "Test",
    "updated_at": "2018-06-18 12:44:41",
    "created_at": "2018-06-18 12:44:41",
    "id": 189
}
]

this is my android code segment ...Using retrofit library to the post data to the server

ApiInterface class

public interface PostChatRoomMessage {
@POST("/SendToChatRoom")
Call<Message> PostMessage(@Body Message message);
}

Message Class

public class Message implements Serializable {

@SerializedName("messages")
@Expose
private List<Message> messages;

public List<Message> getMessages() {
    return messages;
}

public void setMessages(List<Message> messages) {
    this.messages = messages;
}

@SerializedName("SenderId")
@Expose
private String senderId;
@SerializedName("ChatroomId")
@Expose
private String chatroomId;
@SerializedName("MessageTxt")
@Expose
private String messageTxt;
@SerializedName("SenderName")
@Expose
private String senderName;
@SerializedName("updated_at")
@Expose
private String updatedAt;
@SerializedName("created_at")
@Expose
private String createdAt;
@SerializedName("id")
@Expose
private int id;

public String getSenderId() {
    return senderId;
}

public void setSenderId(String senderId) {
    this.senderId = senderId;
}

public String getChatroomId() {
    return chatroomId;
}

public void setChatroomId(String chatroomId) {
    this.chatroomId = chatroomId;
}

public String getMessageTxt() {
    return messageTxt;
}

public void setMessageTxt(String messageTxt) {
    this.messageTxt = messageTxt;
}

public String getSenderName() {
    return senderName;
}

public void setSenderName(String senderName) {
    this.senderName = senderName;
}

public String getUpdatedAt() {
    return updatedAt;
}

public void setUpdatedAt(String updatedAt) {
    this.updatedAt = updatedAt;
}

public String getCreatedAt() {
    return createdAt;
}

public void setCreatedAt(String createdAt) {
    this.createdAt = createdAt;
}

public int getId() {
    return id;
}

public void setId(int id) {
    this.id = id;
}`}

`

Send Message method

 public void SendMessage(){

    String SenderId="123";
    String ChatroomId="2";
    String Message=messageEdit.getText().toString();
    String SenderName="yooo";



    if(TextUtils.isEmpty(Message)){
        AlertDialog.Builder builder=new AlertDialog.Builder(Chat.this);
        builder.setMessage("Please add Some Message")
                .setNegativeButton("Ok",null);

        AlertDialog alertDialog=builder.create();
        alertDialog.show();
    }
    else {
        Log.e("not empryy","not empty");

try{
Message message=new Message();
message.setSenderId(SenderId);
message.setChatroomId(ChatroomId);
message.setMessageTxt(Message);
message.setSenderName(SenderName);

OkHttpClient okHttpClient = new OkHttpClient.Builder()
        .addInterceptor(new okhttp3.Interceptor() {
            @Override
            public okhttp3.Response intercept(Chain chain) throws IOException {

                Request request = chain.request().newBuilder()

                        .addHeader("Content-Type", "text/html; charset=UTF-8")
                        .build();

                return chain.proceed(request);

            }
        }).addInterceptor(new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY))
        .readTimeout(60, TimeUnit.SECONDS)
        .connectTimeout(60, TimeUnit.SECONDS)
        .build();

GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.setLenient();
Gson gson = gsonBuilder.create();





Retrofit retrofit = new Retrofit.Builder()
        .baseUrl(Config.Api)
        .client(okHttpClient)
        .addConverterFactory(GsonConverterFactory.create(gson))
        .build();

PostChatRoomMessage service=retrofit.create(PostChatRoomMessage.class);
Call<Message> call = service.PostMessage(message);

Log.d("onResponse", "There rtutrutris an error");
call.enqueue(new Callback<Message>() {
    @Override
    public void onResponse(Call<Message> call, Response<Message>response) {
        Log.d("responce sucessregister", response.message());
        messageEdit.setText("");
    }
    @Override
    public void onFailure(Call<Message> call, Throwable t) {
        Log.d("OnbbbbResponse", t.getMessage());
    }    });
}
catch (Exception e){
Log.d("onResponse", "There is an error");
e.printStackTrace();
}        }
}
androidpc
  • 13
  • 5
  • I'm not an expert on `retrofit,` so I didn't understand 100% of code. The only thing I can say is that the response json is a list of object; are you correctly reading it as a list? It looks like you are reading it as a single object – Pier Giorgio Misley Jun 18 '18 at 13:05
  • yah i also trying to post data as a list and a single object.but when post as a list getting error like this "Expected BEGIN_ARRAY but was STRING at line 1 column 1 path $" – androidpc Jun 18 '18 at 13:20

2 Answers2

0

In my opinion you should make sure returned value is always Json. Now you sometimes just return string:

echo 'aaa';

and this could be cause of this error.

Also in some other cases you don't return any response that can be also problem, for example:

if($ChatRoom == '1'){

}

here again no object will be returned as response.

Marcin Nabiałek
  • 109,655
  • 42
  • 258
  • 291
  • in my testing case i use this data [{"SenderId":"1213333","ChatroomId":"2","MessageTxt":"yooo","SenderName":"Test","updated_at":"2018-06-18 12:44:41","created_at":"2018-06-18 12:44:41","id":189}] so i add chatroom id as 2 .so post chatroom id 2 in php par calling elseif code part – androidpc Jun 18 '18 at 13:14
0

You can try to declare Array Object

 class Message{

    @SerializedName("SenderId")
    @Expose
    private String senderId;
    @SerializedName("ChatroomId")
    @Expose
    private String chatroomId;
    @SerializedName("MessageTxt")
    @Expose
    private String messageTxt;
    @SerializedName("SenderName")
    @Expose
    private String senderName;
    @SerializedName("updated_at")
    @Expose
    private String updatedAt;
    @SerializedName("created_at")
    @Expose
    private String createdAt;
    @SerializedName("id")
    @Expose
    private int id;

    public String getSenderId() {
        return senderId;
    }

    public void setSenderId(String senderId) {
        this.senderId = senderId;
    }

    public String getChatroomId() {
        return chatroomId;
    }

    public void setChatroomId(String chatroomId) {
        this.chatroomId = chatroomId;
    }

    public String getMessageTxt() {
        return messageTxt;
    }

    public void setMessageTxt(String messageTxt) {
        this.messageTxt = messageTxt;
    }

    public String getSenderName() {
        return senderName;
    }

    public void setSenderName(String senderName) {
        this.senderName = senderName;
    }

    public String getUpdatedAt() {
        return updatedAt;
    }

    public void setUpdatedAt(String updatedAt) {
        this.updatedAt = updatedAt;
    }

    public String getCreatedAt() {
        return createdAt;
    }

    public void setCreatedAt(String createdAt) {
        this.createdAt = createdAt;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }
}

public interface PostChatRoomMessage {
    @POST("/SendToChatRoom")
    Call<Message[]> PostMessage(@Body Message message);
} 

https://drive.google.com/open?id=1_chkVXQHhOsYgbJtWHokBs1Y-cSLtiBb

:)

jsancheh
  • 54
  • 1
  • 3
  • thaks for your reply when i check interface like that showing this "Expected BEGIN_ARRAY but was STRING at line 1 column 1 path $" error – androidpc Jun 18 '18 at 13:25
  • Sorry, you should modify Message response class, not a List. See my picture, works fine for me. I used Gson and Message is an Object class. https://drive.google.com/file/d/18KaUiAbOLFBs60XIHyrmBC0wl8lzwql8/view?usp=sharing – jsancheh Jun 18 '18 at 13:42
  • not it's not work for me..when i check like this i cant post activity data to the retrofit interface – androidpc Jun 19 '18 at 06:04