«Ваш API-ключ недопустим в этом домене» при вызове Disqus из WP7 - PullRequest
0 голосов
/ 27 августа 2011

Я пытаюсь получить доступ к REST Disqus API, используя следующий URL:

http://disqus.com/api/3.0/threads/listPosts.json
?api_key=myKey
&forum=myForum
&thread:ident=myIdent

Когда я захожу на URL в Chrome, он работает нормально. Когда я пытаюсь загрузить его в WebClient, у меня возникают трудности:

            WebClient data = new WebClient();
            Uri queryUri = new Uri(DisqusQuery + ident, UriKind.Absolute);
            data.DownloadStringCompleted += new DownloadStringCompletedEventHandler(onDownloadCompleted);
            data.DownloadStringAsync(queryUri);

DownloadStringCompletedEventArgs содержит следующую ошибку:

{"The remote server returned an error: NotFound."}
 at System.Net.Browser.ClientHttpWebRequest.InternalEndGetResponse(IAsyncResult asyncResult)
   at System.Net.Browser.ClientHttpWebRequest.<>c__DisplayClass2.<EndGetResponse>b__1(Object sendState)
   at System.Net.Browser.AsyncHelper.<>c__DisplayClass4.<BeginOnUI>b__1(Object sendState)
   at System.Reflection.RuntimeMethodInfo.InternalInvoke(RuntimeMethoThe thread '<No Name>' (0xfc10086) has exited with code 0 (0x0).

Что я мог делать не так?

Обновление: Поиск в Fiddler показывает, что ответ такой:

HTTP/1.1 400 BAD REQUEST
Date: Sun, 28 Aug 2011 14:51:39 GMT
Server: Apache/2.2.14 (Ubuntu)
Vary: Cookie,Accept-Encoding
p3p: CP="DSP IDC CUR ADM DELi STP NAV COM UNI INT PHY DEM"
Content-Length: 68
Connection: close
Content-Type: application/json
X-Pad: avoid browser bug

{"code": 11, "response": "Your API key is not valid on this domain"}

Вот ответ на запрос от Chrome Incognito (не вошел в disqus):

HTTP/1.1 200 OK
Date: Mon, 29 Aug 2011 17:00:29 GMT
Server: Apache/2.2.14 (Ubuntu)
X-Ratelimit-Remaining: 1000
Content-Encoding: gzip
Vary: Cookie,Accept-Encoding
X-Ratelimit-Limit: 1000
p3p: CP="DSP IDC CUR ADM DELi STP NAV COM UNI INT PHY DEM"
X-Ratelimit-Reset: 1314640800
Content-Length: 3120
Connection: close
Content-Type: application/json

/* expected JSON response */

Обновление 2 : Приведенная выше ошибка использует мой открытый ключ. Использование секретного ключа приводит к:

HTTP/1.1 403 FORBIDDEN
Date: Sun, 28 Aug 2011 20:40:32 GMT
Server: Apache/2.2.14 (Ubuntu)
Vary: Cookie,Accept-Encoding
p3p: CP="DSP IDC CUR ADM DELi STP NAV COM UNI INT PHY DEM"
Connection: close
Transfer-Encoding: chunked
Content-Type: application/json

2a
{"code": 5, "response": "Invalid API key"}
0

Ответы [ 2 ]

1 голос
/ 02 сентября 2011

FIX:

Добавьте что-то похожее на следующую строку в ваш HttpRequest:

client.Headers[HttpRequestHeader.Referer] = "http://mywebsite.com";

Более длинное описание:

Проблема связана с тем, как Windows Phone устанавливает заголовок HTTP Referer.

При выполнении успешного запроса из адресной строки браузера Fiddler показал мне следующее:

GET /api/3.0/forums/listPosts.json?forum=disqus&api_key=jRml... HTTP/1.1
Accept: */*
Accept-Language: en-US
Accept-Encoding: gzip, deflate, peerdist
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; Zune 4.7; InfoPath.3; MS-RTC LM 8)
Connection: Keep-Alive
Host: disqus.com
Cookie: disqus_unique=...
X-P2P-PeerDist: Version=1.0

Когда я изучил запрос, отправленный Silverlight в Fiddler, я увидел следующее:

GET /api/3.0/forums/listPosts.json?forum=disqus&api_key=jRml... HTTP/1.1
Accept: */*
Referer: file:///Applications/Install/9036AAF3-F213-4CFB-B57E-576A05E1896D/Install/
Accept-Encoding: identity
User-Agent: NativeHost
Host: disqus.com
Connection: Keep-Alive

После удаления заголовка Referer и повторной отправки через Fiddler, запрос работал, как я и ожидал! Итак ... все, что вам нужно сделать, это вручную установить заголовок HTTP Referer на то, что вы контролируете (вместо того, чтобы позволить Silverlight сделать это за вас), и у вас все получится.

Да, а также убедитесь, что вы используете открытый ключ, а не секретный ключ.

/ ск

0 голосов
/ 29 августа 2011

Похоже, что браузер получает дополнительную информацию, такую ​​как имя пользователя или что-то еще: X-User: anon: 182210122933. Это отсутствует, когда WebClient получает свой ответ обратно. Я предполагаю, что это как-то связано с тем, что вы вошли в браузер или у вас есть опечатка в вашем ключе API.

Другим интересным для вас точечным объектом будет библиотека типа http://disqussharp.codeplex.com/, которая большую часть времени выполняет аутентификацию.

Удачи!

...