2008-12-17 16 views
52

Huzurlu bir tasarıma bakıyorum ve HTTP yöntemlerini (POST, GET, ...) ve HTTP başlıklarını mümkün olduğunca kullanmak istiyorum. Zaten PUT ve DELETE HTTP yöntemlerinin tarayıcıdan desteklenmediğini öğrendim.Tarayıcı tarafından gönderilen HTTP isteğinin başlığını değiştirebilir miyim?

Şimdi aynı kaynağın farklı temsillerini almak istiyorum ve isteğin Accept üstbilgisini değiştirerek bunu yapmak istiyorum. Bu Accept başlığına bağlı olarak, sunucu aynı kaynak üzerinde farklı bir görünüm sunabilir.

Sorun, tarayıcımı bu üstbilgiyi değiştirmesini söylemenin bir yolunu bulamadım.

<a..> etiketi (Firefox'ta o network.http.accept.default anahtarla about:config değiştirilebilir) bir mim türü olabilir bir type attribute, iyi bir aday gibi görünüyordu ama başlık hala tarayıcı varsayılan olarak bulunur.

+0

Seni duyuyorum. Bazı üstbilgileri kodlamak harika olurdu ve tarayıcınızın sekmesinde kodunuzu test etmek için sadece URL'leri ziyaret edin. Chrome Postman uygulaması gibi tam gelişmiş bir arayüz istemiyorum. –

+0

Bu uzantı benim için gayet güzel çalışıyor: https://chrome.google.com/webstore/detail/modify-headers-for-google/innpjfdalfhpcoinfnehdnbkglpmogdi?hl=tr-US –

cevap

9

Bunu yapmaya çalıştığınız şekilde yapmanın mümkün olduğunu düşünmüyorum.

Kabul edilen veri formatının belirtilmesi, genellikle uzantının kaynak adına eklenmesiyle yapılır. Sen kabul yapmak zorunda

/resources/resource.xml 

: Eğer var ise, kaynak

/resources/resource 

ve GET /resources/resource gibi aşağıdaki modeli kullanabilirsiniz, bunun yerine kendi XML gösterimini istediğinizi belirtmek için, onun HTML temsilini döndürür Sunucu tarafında içerik türü belirleme sihri, o zaman. Veya James önerdiği gibi Javascript kullanın.

+0

- bkz Shonzilla cevabı – mb14

1

Bazı javascript kullanın!

 
xmlhttp=new XMLHttpRequest(); 
xmlhttp.open('PUT',http://www.mydomain.org/documents/standards/browsers/supportlist) 
xmlhttp.send("page content goes here"); 
+0

Hızlı cevap için teşekkürler ama soru Varsayılan başlıkların değiştirilmesi HTTP isteğinde gönderilir. Özellikle Kabul başlığı. – JeroenWyseur

+0

Bir yan notta, belirtim (http://www.w3.org/TR/2006/WD-XMLHttpRequest-20060405/#dfn-open) PUT ve DELETE hakkında hiçbir şey söylemiyor, editör notuna bakın. Ayrıca, bu durumda, ajaxified kullanıcı arabiriminin ne güzel olduğu, ancak başka türlü sunulmadığı gönderilmez. – JeroenWyseur

35

Milano'nun URI'de istenen gösterimi gömme önerisine kısmen katılmıyorum. tünel HTTP yöntemleri/fiiller için

nasıl olsa Mümkünse, URI'ler sadece adresleme kaynaklar için kullanılmalıdır edilmeli ve değil. Sonunda, belirli iş eylem (düzenleme, kilit, vs.) oluşturursanız URI gömülü olabilir (POST) veya güncelleme (PUT) yalnız bir amaca hizmet etmeyen: Belirli bir istekte durumunda

 
POST http://shonzilla.com/orders/08/165;edit 

URI'deki temsiliyetinizi URI tasarımınızı bozmanız, sonuçta çirkin hale getirerek iki ayrı REST kavramını aynı yerde (yani URI) karıştırmanız ve sunucu tarafında istekleri genel olarak işlemeyi zorlaştırmanız gerekir. Milan ne önerdiğini ve çoğunun aynı şeyi yapıyor, dahil. Flickr, tam olarak bu.

Bunun yerine, daha dinlendirici bir yaklaşım istemci işleyebilir içerik türleri sunucu/süreci ve sunucu denemeden anlatır içerik müzakere için kullanılan Accept HTTP başlığı kullanarak tercih edilen temsil kodlamak için ayrı bir yere kullanılarak olur müşterinin isteğini yerine getirmek. Bu yaklaşım, yazılım uyumlu ve web tarayıcıları tarafından desteklenen HTTP 1.1 standard'un bir parçasıdır.Eğer XMLHttpRequest nesnenin setRequestHeader yöntemi kullanarak herhangi bir içerik türü talep edebilir bir web tarayıcısından

 
GET /orders/08/165 HTTP/1.1 
Accept: application/xml 

: Buna

 
GET /orders/08/165.xml HTTP/1.1 
or 
GET /orders/08/165&format=xml HTTP/1.1 

:

karşılaştırın. Örneğin:

 
function getOrder(year, yearlyOrderId, contentType) { 
var client = new XMLHttpRequest(); 
client.open("GET", "/order/" + year + "/" + yearlyOrderId); 
client.setRequestHeader("Accept", contentType); 
client.send(orderDetails); 
} 

Özetle: adresi, bir kaynağın diğer bir deyişle tanım temsilinin bağımsız olmalıdır ve XMLHttpRequest.setRequestHeader yöntemi Accept HTTP başlığı kullanarak herhangi bir temsilini talep sağlar.

Şerefe!
Shonzilla

+3

Dezavantajı, doğrudan 'XML' kaynağını söylemek için (hiper) bağlantının imkansız olmasıdır. Bazı uygulamalar için bu gerekli olabilir. Örneğin OpenCPU'da, grafikler "PNG", "PDF" veya "SVG" formatında alınabilir. Ancak, bir "Accept" başlığının erişim için gerekli olması durumunda, PNG'nin görüntüsünü bir HTML sayfasına yerleştirmek imkansız olurdu. – Jeroen

+2

@Jeroen: Eğer tarayıcı SVG'yi PNG'den daha iyi destekliyorsa, o zaman SVG ile PNG'den daha yüksek bir Accept üstbilgisi göndermeli ve SVG ile yanıt vermelidir. SVG'yi desteklemeyen tarayıcılarda, Accept üstbilgileri uygulama/svg + xml içermeyecek ve böylece sunucu PNG'yi geri gönderecektir. Eğer bir sebepten dolayı, PNG versiyonunun PDF/SVG versiyonundan daha yüksek bir sadakate sahip olduğunu düşünürseniz (örn., Vektörle izlenen fotoğraf gibi), bu durumda, sunucu, PNG sürümü için daha yüksek bir ağırlık ayarlamalıdır. üç eşit olarak. İçerik müzakeresinin bu şekilde çalışması gerekiyor. –

+0

Bu yanıt beni neredeyse ikna etti, ancak daha sonra benzer bir konu üzerinde [bu yanıtı] gördüm (http://programmers.stackexchange.com/a/251555/216886) ve ikincisine katılıyorum. Birçok (veya çoğu) durumda, biçim bilgisi gerçekten kaynak kimliğinin bir parçasıdır ve farklı müşteriler arasında böyle bir URI'yi paylaştıktan sonra beklenmedik sonuçlardan kaçınmak için URI'ye dahil olabilir (veya içermelidir). Bu durumlarda Kabuller başlığı ikinci bir rol oynamalıdır. Bu vakaları ayırt etmek önemlidir. –

10

Ben tam olarak aynı şeyi (dinlendirici web hizmeti) yapmak arıyordu ve ben istekleri için kabul başlıkları (aslında, herhangi bir istek başlıklar) değiştirmenize olanak tanır bu firefox eklenti, tökezledi. Mükemmel çalışıyor.

https://addons.mozilla.org/en-US/firefox/addon/967/

+0

Teşekkür ederim, bu tam olarak ihtiyacım olan şey. – lathomas64

+0

Chris, uzantının bir sorunu varsa ya da uzantı istediğiniz tarayıcı sürümüyle çalışmazsa veya geliştiriciler uzantıları güncellemeyi durdurduysa? İstek başlıklarını eklemenize/değiştirmenize izin veren tüm Firefox eklentileri olmasa bile, bunun çoğu için olduğunu görüyorum. Eklentiler kolay olabilir ve üretken olabilir, ancak uzantılarla ilgili sorunlar olduğunda işe yaramaz. – testerjoe2

İlgili konular