문제

다음 코드를 사용하여 푸시 알림을 Windows Phone에 보낼 때 다음 오류가 발생합니다.

푸시 알림 페이로드 오류가 발생했습니다. XML에는 유효하지 않거나 부적절하게 형식화 된 XML이 포함되어 있거나 헤더에 지정된 알림 유형이 사용 된 페이로드 유형과 일치하지 않습니다.

try {
            String channelUri = "http://db3.notify.live.net/throttledthirdparty/01.00/AQFrOsAuKMIrQ6_3k_u4ZLo5AgAAAAADAQAAAAQUZm52OkJCMjg1QTg1QkZDMkUxREQFBkVVTk8wMQ";
            URL url = new URL(channelUri);
        URLConnection uc = url.openConnection();

        String name="hello";
        String body="from junit ";

         String toastMessage = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
                    "<wp:Notification xmlns:wp=\"WPNotification\">" +
                       "<wp:Toast>" +
                            "<wp:Text1>" + name + "</wp:Text1>" +
                            "<wp:Text2>" + body + "</wp:Text2>" +
                            "<wp:Param>/Page2.xaml?NavigatedFrom=Toast Notification</wp:Param>" +
                       "</wp:Toast> " +
                    "</wp:Notification>";

        byte[] mesg = toastMessage.getBytes("UTF-8");


        uc.setRequestProperty("ContentType", "text/xml");
        uc.setRequestProperty("X-WindowsPhone-Target", "toast");
        uc.setRequestProperty("X-NotificationClass", "2");

        uc.setDoOutput(true);
        uc.setDoInput(true);

        OutputStreamWriter writer = new OutputStreamWriter(uc.getOutputStream(),"utf-8");
        writer.write(mesg.toString(),0,mesg.toString().length());
        uc.connect();

        Map<String, List<String>> map = uc.getHeaderFields();
        for (Map.Entry<String, List<String>> entry : map.entrySet()) {
            System.out.println("Key : " + entry.getKey() + 
                     " ,Value : " + entry.getValue());
        }

        writer.flush();
        writer.close();

        String res = this.getURLOutput(uc);
        System.out.print(res);

    } catch(Exception e) {
       System.out.println(e.getMessage());
       Assert.fail();
   }

이 링크의 C# 코드를 참조로 사용했습니다. http://msdn.microsoft.com/en-us/library/windowsphone/develop/hh202967%28v=vss.105%29.aspx

도움이 되었습니까?

해결책

UTF-8 인코딩을 사용하여 문자열을 바이트 배열로 변환합니다. 그런 다음 UTF-16 인코딩으로 스트림 작가를 만들고 바이트 값을 문자열로 변환 한 후 스트림에 씁니다. 솔직히 어떻게 작동하는지 모르겠습니다.

대신 시도해보십시오.

    String toastMessage = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
                "<wp:Notification xmlns:wp=\"WPNotification\">" +
                   "<wp:Toast>" +
                        "<wp:Text1>" + name + "</wp:Text1>" +
                        "<wp:Text2>" + body + "</wp:Text2>" +
                        "<wp:Param>/Page2.xaml?NavigatedFrom=Toast Notification</wp:Param>" +
                   "</wp:Toast> " +
                "</wp:Notification>";

    // Do your stuff, initialize the headers, and so on... 

    OutputStreamWriter writer = new OutputStreamWriter(uc.getOutputStream(), "utf-8");
    writer.write(toastMessage, 0, toastMessage.length());
    uc.connect();

문자열을 전달할 수없는 경우 write 메소드를 한 다음 출력 스트림에 직접 씁니다.

     String toastMessage = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
                "<wp:Notification xmlns:wp=\"WPNotification\">" +
                   "<wp:Toast>" +
                        "<wp:Text1>" + name + "</wp:Text1>" +
                        "<wp:Text2>" + body + "</wp:Text2>" +
                        "<wp:Param>/Page2.xaml?NavigatedFrom=Toast Notification</wp:Param>" +
                   "</wp:Toast> " +
                "</wp:Notification>";

    byte[] mesg = toastMessage.getBytes("UTF-8");

    uc.setDoOutput(true);
    uc.setDoInput(true);

    uc.getOutputStream().write(mesg, 0, mesg.length());
    uc.connect();
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top