Как использовать WebResponse для Загрузки .wmv файла

Это - польза и хитрый вопрос. Тема [1 136] дизайн URI одновременно самая видная часть API REST и , поэтому, потенциально долгосрочное обязательство к пользователям того API.

Начиная с эволюции приложения и, до меньшей степени, ее API является фактом жизни и что это даже подобно эволюции на вид сложного продукта как язык программирования, , дизайн URI должен иметь меньше естественные ограничения , и это должно сохраняться со временем . Чем дольше продолжительность жизни приложения и API, тем больше обязательство перед пользователями приложения и API.

, С другой стороны, другой факт жизни - то, что трудно предвидеть все ресурсы и их аспекты, которые были бы использованы через API. К счастью не необходимо разработать весь API, который будет использоваться до Апокалипсис . Достаточно правильно определить все конечные точки ресурса и схему адресации каждого ресурса и экземпляра ресурса.

Со временем Вы, возможно, должны добавить новые ресурсы и новые атрибуты к каждому конкретному ресурсу, но метод, за которым пользователи API следуют для доступа к детали ресурсы, не должен изменяться, как только схема адресации ресурса становится достоянием общественности и поэтому финал.

Этот метод относится к семантике глагола HTTP (например, ПОМЕЩЕННЫЙ должен всегда обновлять/заменять), и Коды состояния HTTP, которые поддерживаются в более ранних версиях API (они должны продолжить работать так, чтобы клиенты API, которые работали без человеческого вмешательства, были в состоянии продолжить работать как этот).

, Кроме того, начиная со встраивания версии API в URI разрушил бы понятие гиперсреда как механизм состояния приложения (указанный в докторе философии Roy T. Fieldings диссертация) при наличии адреса/URI ресурса, который будет изменяться со временем, я пришел бы к заключению, что версии API не должны сохраняться в ресурсе URIs в течение долгого времени подразумевать, что ресурс URIs, от которого могут зависеть пользователи API, должен быть постоянными ссылками .

Несомненно, возможно встроить версию API в основной URI, но только для разумного и ограниченного использования как отладка клиента API , который работает с новая версия API. Такие имеющие версию API должны быть ограничены временем и доступны ограниченным группам пользователей API (как во время закрытых бет) только. Иначе Вы фиксируете себя, где Вы не были должны.

Несколько мыслей относительно обслуживания версий API, которые имеют дату истечения срока на них. Все платформы/языки программирования, наиболее часто используемые для реализации веб-сервисов (Java.NET, PHP, Perl, направляющие, и т.д.), позволяют легкую привязку конечной точки (точек) веб-сервиса к основному URI. Таким образом, это легко к [1 146], собирают и сохраняют набор файлов/классов/методов отдельным через различные версии .

API

От пользователей API POV, также легче работать с и связать с конкретной версией API, когда это - это очевидное, но только в течение ограниченного времени, т.е. во время разработки.

От POV специалиста по обслуживанию API, легче поддержать различные версии API параллельно при помощи систем управления исходным кодом, которые преимущественно работают над файлами как самая маленькая единица (исходного кода) управление версиями.

Однако с версиями API, явно видимыми в URI существует протест: можно было бы также возразить этому подходу с тех пор , история API становится visible/aparent в дизайне URI и поэтому подвержена изменениям со временем , который идет вразрез с инструкциями REST. Я соглашаюсь!

способ обойти это разумное возражение, для реализации последней версии API под versionless URI основы API. В этом случае разработчики клиента API могут принять решение также:

  • разрабатывают против последнего (фиксирующий себя для поддержания приложение, защищающее его от возможных изменений API, которые могли бы повредить их плохо разработанный клиент API ).

  • связывают с определенной версией API (который становится очевидным), но только на ограниченный срок

, Например, если API v3.0 является последней версией API, следующие два должны быть псевдонимами (т.е. вести себя тождественно ко всем запросам API):

http://shonzilla/api/customers/1234
http://shonzilla/api/v3.0/customers/1234
http://shonzilla/api/v3/customers/1234

, Кроме того, клиентам API, которые все еще пытаются указать на старый API, нужно сообщить для использования последней предыдущей версии API, , если версия API, которую они используют, является устаревшей или не поддерживаемая еще . Так получая доступ к любому из устаревших URIs как они:

http://shonzilla/api/v2.2/customers/1234
http://shonzilla/api/v2.0/customers/1234
http://shonzilla/api/v2/customers/1234
http://shonzilla/api/v1.1/customers/1234
http://shonzilla/api/v1/customers/1234

должен возвратить любой из 30x Коды состояния HTTP, которые указывают на перенаправление , которые используются в сочетании с Location HTTP-заголовок, который перенаправляет к соответствующей версии URI ресурса, которые остаются быть этим:

http://shonzilla/api/customers/1234

существует по крайней мере два Кода состояния HTTP перенаправления, которые подходят для сценариев управления версиями API:

  • 301 Перемещенный постоянно указание, что ресурс с требуемым URI перемещен постоянно в другой URI (который должен быть постоянной ссылкой экземпляра ресурса, которая не содержит информацию о версии API). Этот код статуса может использоваться для указания на устаревшую/неподдерживаемую версию API, сообщая клиенту API, который присвоил версию URI ресурса, замененный постоянной ссылкой ресурса .

  • 302 Найденных указание, что требуемый ресурс временно расположен в другом местоположении, в то время как требуемый URI может все еще поддерживаемый. Этот код статуса может быть полезным, когда версия меньше, URIs временно недоступны и что запрос должен быть повторен с помощью адреса перенаправления (например, указывающий на URI со встроенной версией API) и мы хотим сказать клиентам продолжать использовать его (т.е. постоянные ссылки).

  • другие сценарии могут быть найдены в Перенаправление 3xx глава спецификации

HTTP 1.1

5
задан abelenky 26 July 2009 в 04:29
поделиться

3 ответа

Вам просто нужно загрузить его как двоичный, а не текстовый. Вот метод, который должен помочь вам:

public void DownloadFile(string url, string toLocalPath)
{
    byte[] result = null;
    byte[] buffer = new byte[4097];

    WebRequest wr = WebRequest.Create(url);

    WebResponse response = wr.GetResponse();
    Stream responseStream = response.GetResponseStream;
    MemoryStream memoryStream = new MemoryStream();

    int count = 0;

    do {
        count = responseStream.Read(buffer, 0, buffer.Length);
        memoryStream.Write(buffer, 0, count);

        if (count == 0) {
            break;
        }
    }
    while (true);

    result = memoryStream.ToArray;

    FileStream fs = new FileStream(toLocalPath, FileMode.OpenOrCreate, FileAccess.ReadWrite);

    fs.Write(result, 0, result.Length);

    fs.Close();
    memoryStream.Close();
    responseStream.Close();
}
5
ответ дан 13 December 2019 в 19:33
поделиться

Я не понимаю, почему вы заполняете MemoryStream m по одному байту, а затем записываете sr в файл. В этот момент я считаю, что sr пуст, а MemoryStream m никогда не используется.

Ниже приведен код, который я написал для выполнения аналогичной задачи. Он получает WebResponse по 32 КБ за один раз и выгружает его прямо в файл.

public void GetStream()
{
    // ASSUME: String URL is set to a valid URL.
    // ASSUME: String Storage is set to valid filename.

    Stream response = WebRequest.Create(URL).GetResponse().GetResponseStream();
    using (FileStream fs = File.Create(Storage)) 
    {
        Byte[] buffer = new Byte[32*1024];
        int read = response.Read(buffer,0,buffer.Length);
        while (read > 0)
        {
            fs.Write(buffer,0,read);
            read = response.Read(buffer,0,buffer.Length);
        }
    }
    // NOTE: Various Flush and Close of streams and storage not shown here.
}
4
ответ дан 13 December 2019 в 19:33
поделиться

. Вы используете StreamReader и StreamWriter для передачи вашего потока, но эти классы предназначены для обработки текста. Ваш файл двоичный, и есть вероятность, что последовательности CR, LF и CR LF могут затираться при передаче данных. Я понятия не имею, как обрабатываются символы NUL.

2
ответ дан 13 December 2019 в 19:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: