1

我有以下 DropWizard 资源,它应该发出 Google Cloud Messaging 请求并返回响应。我不断收到未经授权的 401 错误。

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;

@Path(value="/gcm")
@Produces(MediaType.APPLICATION_JSON)
public class GcmResource {
    Client client;

    public GcmResource(Client client) {
        this.client = client;
    }

    @GET
    public String sendMsg() {
        WebResource r = client.resource("https://android.googleapis.com/gcm/send");
        r.header("Authorization", "key=MY_SERVER_API_KEY");
        r.accept(MediaType.APPLICATION_JSON);
        r.type(MediaType.APPLICATION_JSON);

        ClientResponse res = r.post(ClientResponse.class, "{\"registration_ids\":[\"ABC\"]}");
        return res.getEntity(String.class);
    }

}
  • 我正在使用有效的 API 密钥。
  • 我的 API 密钥属于“服务器(带有 IP 阻塞)”类型。
  • 我在阻止列表中没有 IP。因此,允许所有 IP。
  • 我还从我的网络托管服务器运行了上面的代码,我也得到了同样的错误。

我究竟做错了什么?

4

1 回答 1

1

最后我发现了上面代码中的错误。我实际上编写了一个 PHP 代码来转储它接收到的所有 Http 请求 - 标头和正文。我更改了上面的代码以将请求发送到我的 PHP 代码。那时我注意到我设置的标题都没有被发送!然后我注意到了这个错误。

我曾假设像r.header("Authorization", "key=MY_SERVER_API_KEY")实际修改这样的行r。我错了。它们返回一个Builder具有这些更改的新对象。所以,现在下面的修改版本可以工作了。

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;

@Path(value="/gcm")
@Produces(MediaType.APPLICATION_JSON)
public class GcmResource {
    Client client;

    public GcmResource(Client client) {
        this.client = client;
    }

    @GET
    public String sendMsg() {
        WebResource r = client.resource("https://android.googleapis.com/gcm/send");
        ClientResponse res = r
            .header("Authorization", "key=MY_SERVER_API_KEY")
            .accept(MediaType.APPLICATION_JSON)
            .type(MediaType.APPLICATION_JSON)
            .post(ClientResponse.class, "{\"registration_ids\":[\"ABC\"]}");
        return res.getEntity(String.class);
    }

}
于 2013-11-05T02:54:09.990 回答