Forum: D Programlama Dili RSS
d ile multipart form post etme
Mengu (Moderatör) #1
Kullanıcı başlığı: NONSERVIAM
Üye Tem 2009 tarihinden beri · 347 mesaj · Konum: Dersaadet
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: d ile multipart form post etme
d'nin curl wrapperi berbat. binding kafasiyla yapilmis. tek kelimeyle berbat. ya basit data post edebiliyorsun ya da upload ile dosya gonderebiliyorsun, ikisini birden yapmana izin vermiyor. ben de bunun ustesinden gelebilmek icin basit bir struct yazdim.

import etc.c.curl;
import std.net.curl;
import std.string;
 
pragma(lib, "curl");
pragma(lib, "ssl");
 
 
struct PostForm {
 
  Curl curl;
  curl_httppost *formpost;
  curl_httppost *lastptr;
  curl_slist *headerlist;
  string url;
 
  this(string url){
    this.url = url;
  }
 
  void addHeader(string key, string value) {
    headerlist = curl_slist_append(headerlist,
                                   cast(char*)format("%s:%s", key, value));
  }
 
  auto addField(string fieldName, string value, bool isFile=false) {
    if (isFile) {
      curl_formadd(&formpost,
                   &lastptr,
                   CurlForm.copyname, fieldName.ptr,
                   CurlForm.file, value.ptr,
                   CurlForm.end);
    } else {
      curl_formadd(&formpost,
                   &lastptr,
                   CurlForm.copyname, fieldName.ptr,
                   CurlForm.copycontents, value.ptr,
                   CurlForm.end);
    }
  }
 
  auto post() {
    curl.initialize();
    curl.set(CurlOption.url, url);
    curl.set(CurlOption.post, 1L);
    curl.set(CurlOption.httppost, formpost);
    curl.set(CurlOption.verbose, 1L);
    if (headerlist) {
      curl.set(CurlOption.httpheader, headerlist);
    }
    curl.perform(true);
  }
 
}

kullanimini da su sekilde:

const postURL = "http://127.0.0.1:8080/posts/upload/";
PostForm form = PostForm(postURL);
form.addField("file", filename, true);
form.addField("filename", fixedFileName);
form.post();

hata olustugunda dogru sekilde ele alinmasi var bir tek. onu da libcurl'u tam ogrendikten sonra yapacagim. :) sagolsunlar, curl katkicilari harika bir dokuman ve api hazirlamislar.

soyle olsa daha iyi olur dediginiz yerler var mi?
http://www.mengu.net - some kind of monster
acehreli (Moderatör) #2
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Hemen gözüme çarpan, bool isFile parametresi oldu. bool parametre değerlerinin ne oldukları kullanıldıkları yerde anlaşılamayabiliyor (Python'da kolay):
form.addField("file", filename, true);    // true ne demek acaba? 
Onun yerine ya bir enum türü kullanmalı:
enum FieldType { regular, file }
auto addField(string fieldName, string value, FieldType type = FieldType.regular) {}
form.addField("file", filename, FieldType.file);    // şimdi anlaşılıyor 
ya da iki farklı işlev yazmalı:
auto addRegularField(string fieldName, string value);
auto addFileField(string fieldName, string value);
Ali
Mengu (Moderatör) #3
Kullanıcı başlığı: NONSERVIAM
Üye Tem 2009 tarihinden beri · 347 mesaj · Konum: Dersaadet
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
acehreli:
Hemen gözüme çarpan, bool isFile parametresi oldu. bool parametre değerlerinin ne oldukları kullanıldıkları yerde anlaşılamayabiliyor (Python'da kolay):
form.addField("file", filename, true);    // true ne demek acaba? 
Onun yerine ya bir enum türü kullanmalı:
enum FieldType { regular, file }
auto addField(string fieldName, string value, FieldType type = FieldType.regular) {}
form.addField("file", filename, FieldType.file);    // şimdi anlaşılıyor 
ya da iki farklı işlev yazmalı:
auto addRegularField(string fieldName, string value);
auto addFileField(string fieldName, string value);
Ali

FieldType fikrini begendim, benim direkt bool bir deger gecme fikrinden daha iyi. duzenliyorum :)
http://www.mengu.net - some kind of monster
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-11-19, 05:54:44 (UTC -08:00)