2016-04-01 13 views
0

Jetzt vereinfache ich das Problem.Der Wert eines Abfragezeichenfolgenparameters darf kein '=' Trennzeichen enthalten

Ich versuche, direkt zu kopieren und die Abfrage fügen Sie diesen% 3D verwenden, um confrim statt ‚=‘

var xhrSNS = Ti.Network.createHTTPClient({ 
     onload :function(e) { 
      Ti.API.info("test Post query:" + JSON.stringify(e)); 
      Ti.API.info(this.responseText); 
     }, 
     onerror : function(e){ 
      Ti.API.debug("test Create PlatForm Endpoint registerPush error:" + e.error); 
      Ti.API.info(this.responseText); 

     }  
    }); 

     getUrl = "http://sns.ap-northeast-1.amazonaws.com?AWSAccessKeyId=AAAAAAAAAAAAAAA&Action=CreatePlatformEndpoint&PlatformApplicationArn=arn%3Aaws%3Asns%3Aap-northeast-1%3A776188326341%3Aapp%2FGCM%2Fmyapp&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=2016-04-03T15%3A05%3A51.465Z&Token=APA91bEiaB-902cRmwwgCwoqi2jRIJzzTIZNB7XduELuBKit_WF29tN5twrVW5t1BHpj07ARgwjzoc-I5xVur5K6I6ZQcnoErguUyi-VBHvuI5eY9HS4jq1J6KbIC05Etoe8indjpY9X&Version=2010-03-31&Signature=DzxQpP%2BcALS91C53eia6ZkBhxg3lQ32ctqiEmqKwwLA%3D"; 
     xhrSNS.open('GET',getUrl); 
     xhrSNS.send(); 

Bitte beachten Sie den letzten Buchstaben getUrl, es verwenden, ‚% 3D‘ sicher.

Aber Rückkehr ist das gleiche.

Es macht eine Beschwerde, dass Satz '=' Trennzeichen enthalten.

[DEBUG] test Create PlatForm Endpoint registerPush error:400 : Bad Request 
[INFO] <ErrorResponse xmlns="http://webservices.amazon.com/AWSFault/2005-15-09"> 
[INFO] <Error> 
[INFO] <Type>Sender</Type> 
[INFO] <Code>MalformedQueryString</Code> 
[INFO] <Message>AWSAccessKeyId=AAAAAAAAAAAAAAA&amp;Action=CreatePlatformEndpoint&amp;PlatformApplicationArn=arn%3Aaws%3Asns%3Aap-northeast-1%3A776188326341%3Aapp%2FGCM%2Fmyapp&amp;SignatureMethod=HmacSHA256&amp;SignatureVersion=2&amp;Timestamp=2016-04-03T15%3A05%3A51.465Z&amp;Token=APA91bEiaB-902cRmwwgCwoqi2jRIJzzTIZNB7XduELuBKit_WF29tN5twrVW5t1BHpj07ARgwjzoc-I5xVur5K6I6ZQcnoErguUyi-VBHvuI5eY9HS4jq1J6KbIC05Etoe8indjpY9X&amp;Version=2010-03-31&amp;Signature=DzxQpP%2BcALS91C53eia6ZkBhxg3lQ32ctqiEmqKwwLA= is not valid; the value of a query string parameter may not contain a '=' delimiter</Message> 

----------------------------- Hinzufügen bis hier ----------- ------

ich verwende API Amazon SNS

ich uRL wie das machte es funktioniert gut auf Browser.

http://sns.ap-northeast-1.amazonaws.com?AWSAccessKeyId=AAAAAAAAAAAAA&Action=CreatePlatformEndpoint&PlatformApplicationArn=arn%3Aaws%3Asns%3Aap-northeast-1%3A776188326341%3Aapp%2FGCM%2Fmyapp&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=2016-04-01T21%3A06%3A29.861Z&Token=APA91bEiaB-902cRmwwgCwoqi2jRIJzzTIZNB7XduELuBKit_WF29tN5twrVW5t1BHpj07ARgwjzoc-I5xVur5K6I6ZQcnoErguUyi-VBHvuI5eY9HS4jq1J6KbIC05Etoe8indjpY9X&Version=2010-03-31&Signature=Dt9tXa0Rjl%2Ff6YxZ4JaPfsm%2BT%2BMX03gS712nIKKekAI%3D 

Allerdings, wenn ich von Android versuche.

Dies gibt 400 ungültige Anforderung zurück.

<ErrorResponse xmlns="http://webservices.amazon.com/AWSFault/2005-15-09"> 
<Error> 
<Type>Sender</Type> 
<Code>MalformedQueryString</Code> 
<Message>AWSAccessKeyId=AAAAAAAAAAAAA&amp;Action=CreatePlatformEndpoint&amp;PlatformApplicationArn=arn%3Aaws%3Asns%3Aap-northeast-1%3A776188326341%3Aapp%2FGCM%2Fmyapp&amp;SignatureMethod=HmacSHA256&amp;SignatureVersion=2&amp;Timestamp=2016-04-01T21%3A06%3A29.861Z&amp;Token=APA91bEiaB-902cRmwwgCwoqi2jRIJzzTIZNB7XduELuBKit_WF29tN5twrVW5t1BHpj07ARgwjzoc-I5xVur5K6I6ZQcnoErguUyi-VBHvuI5eY9HS4jq1J6KbIC05Etoe8indjpY9X&amp;Version=2010-03-31&amp;Signature=Dt9tXa0Rjl%2Ff6YxZ4JaPfsm%2BT%2BMX03gS712nIWUekAI= 
is not valid; the value of a query string parameter may not contain a '=' delimiter</Message> 
</Error> 
<RequestId>5b40d988-af34-577a-8839-96f04a217dec</RequestId> 
</ErrorResponse> 

Ich denke

der Wert eines Query-String-Parameter kann nicht enthalten a '=' Begrenzer

ist die Ursache des Problems aber ich herausfinden kann nicht wie sie beheben es.

Derselbe Code funktioniert auf dem iPhone.

es funktioniert nicht nur von Android.

ich von dieser Funktion

URL-Strings gemacht
var array = { 
    PlatformApplicationArn : Ti.App.global.androidArn 
}; 
awsObj = getSignature("CreatePlatformEndpoint",date,awsUrl,event.registrationId,array); 
    var getUrl = "http://" + awsUrl + '?' + awsObj.str_para + "&Signature=" + awsObj.encodedString; 
Ti.API.info('GETurl :' + getUrl); 
xhrSNS.open('GET',getUrl); 


function getSignature(action,date,awsUrl,token,array){ 
    Ti.include('/jssha/jssha256.js'); 

    var base = { 
     Action:action, 
     AWSAccessKeyId : Ti.App.global.awsAccessKey, 
     SignatureMethod : "HmacSHA256", 
     SignatureVersion :2, 
     Token: token, 
     Timestamp : date, 
     Version : "2010-03-31", 
    }; 
    para = arrayMerge(array,base); 

    var para_array = []; 

    for(var pname in para){ 
     para_array.push(pname + "=" + encodeURIComponent(para[pname])); 
    } 
    para_array.sort(); 

    var str_para = para_array.join('&'); 
    var str_signature = "GET" + "\n" + awsUrl + "\n" + "/" + "\n" + str_para; 

    console.log("str_signature:" + str_signature); 

    HMAC_SHA256_init(Ti.App.global.awsSecretKey); 
    HMAC_SHA256_write(str_signature); 
    var array_hash = HMAC_SHA256_finalize(); 

    var str_hash = ""; 
    for (var i = 0; i < array_hash.length; i++) { 
     str_hash += String.fromCharCode(array_hash[i]); 
    } 

    var awsObj = new Object(); 
    awsObj.encodedString = encodeURIComponent(base64encode(str_hash)); 

    Ti.API.info("awsObj.encodedString:" + awsObj.encodedString); // I have confirmed encodedString is correct here. 
    awsObj.str_para = str_para; 
    return awsObj; 
} 
+0

Die Symptome hier sehen so aus, als ob der User-Agent in Titan schlecht kaputt ist und versucht, den Query-String zu normalisieren, was er nicht tun sollte. Beachten Sie, dass SNS auch Anfragen als "POST" anstelle von "GET" akzeptiert. Das ist eigentlich das korrektere Verb für diese Aktion, und die Parameter wären dann im Anfragetext und nicht im Abfragetext enthalten. Das scheint ein lohnenswerter Ansatz zu sein. Sie scheinen auch ein schwerwiegenderes Problem zu haben, das Sie ebenfalls ansprechen müssen: 'Ti.App.global.awsSecretKey' ... Sie integrieren Ihre AWS-Zugangsdaten in Ihre App? Das ist eine sehr unsichere Designentscheidung. –

+0

Ausgehend von der Theorie, dass der User-Agent in Titan tatsächlich die Anfrage bearbeitet, habe ich eine Testseite unter https://echo.sqlbot.net/, die die Anfrage, die Sie mir senden, im Antworttext zurückschickt. für genau solche Zwecke. Es könnte nützlich sein, eine zweite Meinung über die URL zu erhalten, die Sie * wirklich * mit Ihrer Anfrage senden, indem Sie die gleiche Anfrage senden und den Hostnamen meines Testservers ersetzen. Wenn meine Seite '=' am Ende zeigt, wenn Sie denken, dass Sie '% 3D' am Ende senden, sollte das den Finger eindeutig auf etwas auf der Android-Seite zeigen, das sich sehr schlecht verhält. –

+1

Stimmen Sie mit Michael überein.Ein wilder Gedanke, haben Sie versucht, Signatur in getUrl an den Anfang der Abfragezeichenfolge zu verschieben? Vielleicht kann Android am Ende gar nicht mit% 3D umgehen. – Yangfan

Antwort

1

URL in Browser: Signature = Dt9tXa0Rjl% 2Ff6YxZ4JaPfsm% 2BT% 2BMX03gS712nIKKekAI% 3D

URL in Android: Signature = Dt9tXa0Rjl% 2Ff6YxZ4JaPfsm% 2BT% 2BMX03gS712nIWUekAI =

+0

Allerdings benutze ich urlencode bereits. Ich habe den Artikel hinzugefügt. Bitte beachten Sie die Funktion getSignature. Und es funktioniert gut auf dem iPhone. – whitebear

+0

Was ist dann das Zeichen '=' am Ende der Signatur? – helloV

+0

mmm ... Irgendwelche Fehlermeldungen enthalten '=' char. Ti.API.info ('GETurl:' + getUrl) zeigt% 3D anstelle von =, also denke ich, dass URL korrekt kodiert ist. – whitebear