android - 如何使用 Retrofit 从 android 发送 FCM 通知?

标签 android retrofit retrofit2

我想使用 retrofitfcm notification 从 android 设备发送到另一台设备。

我试试这个,但是,

public interface ApiInterface {
    @Headers("Authorization : key=AAAA4Ubio1Q:APA91bGWkw84b1XX2nnnOKn8MO25U2giLRXXXTUkXidojFluZk_qKXXXlS27oMZZV5goTQdwRtpdmvI1iAPRZZDNKz6c-mpU6nvHZJ-Jg9f1fQ5NdttftqUpqwAkObLEEX26VFDDbXN8")
    @POST("fcm/send")
    Call<ResponseBody> sendChatNotification(@Field("to") String token,@Body RequestNotificaton requestNotificaton);

}

我遇到了这个错误

java.lang.IllegalArgumentException: Unexpected char 0x20 at 13 in header name: Authorization 
        at okhttp3.Headers$Builder.checkNameAndValue(Headers.java:330)
        at okhttp3.Headers$Builder.add(Headers.java:288)
        at retrofit2.ServiceMethod$Builder.parseHeaders(ServiceMethod.java:329)
        at retrofit2.ServiceMethod$Builder.parseMethodAnnotation(ServiceMethod.java:270)
        at retrofit2.ServiceMethod$Builder.build(ServiceMethod.java:175)
        at retrofit2.Retrofit.loadServiceMethod(Retrofit.java:170)
        at retrofit2.Retrofit$1.invoke(Retrofit.java:147)
        at java.lang.reflect.Proxy.invoke(Proxy.java:913)
        at $Proxy0.sendChatNotification(Unknown Source)
        at com.rudruam.v2chat.Activity.ChatActivity.sendNotificationToPatner(ChatActivity.java:288)
        at com.rudruam.v2chat.Activity.ChatActivity.access$400(ChatActivity.java:94)
        at com.rudruam.v2chat.Activity.ChatActivity$4.onClick(ChatActivity.java:227)
        at android.view.View.performClick(View.java:6294)
        at android.view.View$PerformClick.run(View.java:24770)
        at android.os.Handler.handleCallback(Handler.java:790)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6499)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:442)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)

我认为 Header 中有一个错误

注意: 我得到这个https://github.com/square/retrofit/issues/1153 , 但它对我不起作用

最佳答案

问题终于解决了!

header 写错了,实际上是这样的

@Headers({"Authorization: key=AAAA4Ubio1Q:APA91bGWkw84b1XX2nnnOKn8MO25U2giLRXXXTUkXidojFluZk_qKXXXlS27oMZZV5goTQdwRtpdmvI1iAPRZZDNKz6c-mpU6nvHZJ-Jg9f1fQ5NdttftqUpqwAkObLEEX26VFDDbXN8",
            "Content-Type:application/json"})

如何使用 retrofit 从 android 发送 fcm 通知 的完整代码:-

public interface ApiInterface {
    @Headers({"Authorization: key=AAAA4Ubio1Q:APA91bGWkw84b1Pw2nnnOKn8MO25U2giLRtv5TUkXidojFluZk_qKOGllS27oMZZV5goTQdwRtpdmvI1iAPRZZDNKz6c-mpU6nvHZJ-Jg9f1fQ5NdttftqUpqwAkObLEED26VFDDbXN8",
            "Content-Type:application/json"})
    @POST("fcm/send")
    Call<ResponseBody> sendChatNotification(@Body RequestNotificaton requestNotificaton);
}

ApiClient 类:-

public static final String BASE_URL = "https://fcm.googleapis.com/";
    private static Retrofit retrofit = null;

    public static Retrofit getClient() {
        if (retrofit==null) {
            retrofit = new Retrofit.Builder()
                    .baseUrl(BASE_URL)
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
        }
        return retrofit;
    }

模型类:- RequestNotificaton.class

public class RequestNotificaton {

    @SerializedName("token") //  "to" changed to token
    private String token;

    @SerializedName("notification")
    private SendNotificationModel sendNotificationModel;

    public SendNotificationModel getSendNotificationModel() {
        return sendNotificationModel;
    }

    public void setSendNotificationModel(SendNotificationModel sendNotificationModel) {
        this.sendNotificationModel = sendNotificationModel;
    }

    public String getToken() {
        return token;
    }

    public void setToken(String token) {
        this.token = token;
    }
}

模型类:-SendNotificationModel.class

public class SendNotificationModel {
    private String body,title;

    public SendNotificationModel(String body, String title) {
        this.body = body;
        this.title = title;
    }

    public String getBody() {
        return body;
    }

    public void setBody(String body) {
        this.body = body;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }
}

主要代码:-

private void sendNotificationToPatner() {

        SendNotificationModel sendNotificationModel = new SendNotificationModel("check", "i miss you");
        RequestNotificaton requestNotificaton = new RequestNotificaton();
        requestNotificaton.setSendNotificationModel(sendNotificationModel);
        //token is id , whom you want to send notification ,
        requestNotificaton.setToken(token);

        apiService =  ApiClient.getClient().create(ApiInterface.class);
        retrofit2.Call<ResponseBody> responseBodyCall = apiService.sendChatNotification(requestNotificaton);

        responseBodyCall.enqueue(new Callback<ResponseBody>() {
            @Override
            public void onResponse(retrofit2.Call<ResponseBody> call, retrofit2.Response<ResponseBody> response) {
                Log.d("kkkk","done");
            }

            @Override
            public void onFailure(retrofit2.Call<ResponseBody> call, Throwable t) {

            }
        });
    }

希望对您有所帮助!

注意

依赖是:-

// retrofit, gson
    implementation 'com.google.code.gson:gson:2.8.0'
    implementation 'com.squareup.retrofit2:retrofit:2.4.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.3.0'

关于android - 如何使用 Retrofit 从 android 发送 FCM 通知?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49828430/

相关文章:

java - 在 libgdx 中绘制一条直线的简单方法?

java - 我可以同时发布 Retrofit @Path 和 @Field 吗?

Retrofit2 OkHttp3响应正文为空错误

Android - 仅在发布 apk 时出现,java.lang.IllegalArgumentException : Unable to create converter for class

java - 扩展的正则表达式

android - 在 android 中创建 Windows Phone 风格的屏幕

android - 如何将字符串从 Retrofit 转换为我的数据类模型中的自定义对象?

retrofit - 如何在onError(RxJava)之后保留订户

android - 在改造中发送可选字段和多部分

android - 如何从 Android Studio 调用 C++ 源代码?