0

デバイスに国籍メッセージを送信したいのですが、このエラーが発生します

 com.google.android.gcm.server.InvalidRequestException: HTTP Status Code: 404

理由はよくわかりません。

これが私のコードです

package com.avilyne.gcm;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.google.android.gcm.server.Message;
import com.google.android.gcm.server.MulticastResult;
import com.google.android.gcm.server.Sender;

public class GCMBroadcast extends HttpServlet {
    private static final String myApiKey = "AIzaSyAHUdHy-7o-XJS59mhAzUUoTqn-EUb9s88";
    private static final String regID = "APA91bHUcUuv3ViHfIkZg7YyKeiq3Ta1WVqEWrdIs9AZwdQ2nfSA2r-9BcH4WxRnAb0mHXEqEi7WMngPKQyrzcP5EhCFLqsprJpscHLIyi8gK80SdMpHluLBk3iRUCQTShY8szNvy3f4IBiGZv75ioe-Ai8wnZLqKw";
    private List<String> androidTargets = new ArrayList<String>();
    private static final long serialVersionUID = 1L;

    public GCMBroadcast() {

        super();

        androidTargets.add(regID);

    }


    /*protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {

            doPost( req, resp);*/


    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {

        String userMessage = "";
        userMessage = req.getParameter("Message");

        Sender sender = new Sender(myApiKey);
        Message message = new Message.Builder().addData("Message", userMessage)
                .build();

        MulticastResult result = sender.send(message, androidTargets, 1);

        if (result.getResults() != null) {
            int canonicalRegId = result.getCanonicalIds();
            if (canonicalRegId != 0) {

            }
        } else {
            int error = result.getFailure();
            System.out.println("Broadcast failure: " + error);
        }

        req.setAttribute("Message", userMessage);

        req.getRequestDispatcher("index.jsp").forward(req, resp);
    }

}

doGet メソッドなしでこのコードを試すと、「HTTP ステータス 405 - HTTP メソッド GET はこの URL ではサポートされていません」というエラーが返されます。doGet メソッドを追加し、doGet で doPost メソッドを呼び出します。「HTTP ステータス 500 - HTTP ステータス コード: 404( 見つかりませんでした。

見つかりません

エラー404

)"

メッセージをサーバーに送信しようとしたときに表示される完全なエラー メッセージは次のとおりです。

 com.google.android.gcm.server.InvalidRequestException: HTTP Status Code: 404(<HTML>
<HEAD>
<TITLE>Not Found</TITLE>
</HEAD>
<BODY BGCOLOR="#FFFFFF" TEXT="#000000">
<H1>Not Found</H1>
<H2>Error 404</H2>
</BODY>
</HTML>)
    at com.google.android.gcm.server.Sender.sendNoRetry(Sender.java:367)
    at com.google.android.gcm.server.Sender.send(Sender.java:261)
    at com.avilyne.gcm.GCMBroadcast.doPost(GCMBroadcast.java:49)
    at com.avilyne.gcm.GCMBroadcast.doGet(GCMBroadcast.java:35)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1001)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

なぜこのエラーが発生するのかわかりません。誰でも助けることができますか?ドキュメントには、404 コードについては何も書かれていません。

それが web.xml コードです。

 <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
      <servlet>
        <servlet-name>GCMBroadcast</servlet-name>
        <servlet-class>com.avilyne.gcm.GCMBroadcast</servlet-class>
      </servlet>
      <servlet-mapping>
        <servlet-name>GCMBroadcast</servlet-name>
        <url-pattern>/GCMBroadcast</url-pattern>
      </servlet-mapping>
      <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
      </welcome-file-list>
    </web-app>

それが index.jsp コードです。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<%
    // retrieve our passed CollapseKey and Message parameters, if they exist.

    String message  = "Generic Broadcast Message";

    Object msgObj =  request.getAttribute("Message");

    if (msgObj != null) {
        message = msgObj.toString();
    }

%>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Android GCM Broadcast</title>

</head>
<body>

    <h2>GCM Broadcast Demo</h2>

    <form action="GCMBroadcast" method="post">
        <label>Broadcast Message </label>

        <br/><textarea name="Message" rows="3" cols="60" ><%=message %> </textarea> 
        <br/><input type="submit" name="submit" value="Submit" />
        </form>   
    </body>
</html>
4

3 に答える 3

2

クラス Sender のコードを投稿します。しかし、ほとんどの場合、GCM サーバーへの URL が間違っています。次への HTTPS POST 要求である必要があります。

https://android.googleapis.com/gcm/send
于 2012-08-14T15:03:05.613 に答える
1

GCM 経由でメッセージを送信しようとしたときに同じエラーが発生しました (PHP から送信しましたが、ここではそれほど重要ではないと思います)。

ここに私の質問へのリンクがあります:

Google GCM サーバーが 404 エラーを返す

私はすでに自分の問題が何であるかを知りました(そして自分の質問に答えました:))。null 値を GCM に渡そうとするたびにエラーが表示されました。null を空の文字列に置き換えましたが、すべて問題ありません。理由はわかりませんが、ドキュメントにはこの問題について何も書かれていませんが、それだけです。

したがって、これがこのエラーが発生する理由である可能性があります。または、GCM サーバーへのリンクが間違っている可能性があります。

于 2012-09-21T19:09:28.330 に答える
0

Google が提供する com.google.android.gcm.server.Sender クラスには、URL が埋め込まれています。最善の選択肢は、Eclipse デバッグ セッションを介して doPost() をステップ実行し、sender.send() の瞬間、または result.getResults() の瞬間、またはその前のどこかでエラーが実際に発生するかどうかを確認することです。

これらのポイントの前にエラーが発生し (「メッセージ」と「CollapseKey」の値が適切に渡されているか?)、プロセスの後半でのみエラーがトラップされ、表示されるスタック トレースが得られる可能性があります。

于 2012-08-16T16:03:39.160 に答える