Forum: Projeler turna RSS
Ortam değişkeninden değer okumak(get ve post methodu için)
canalpay (Moderatör) #1
Kullanıcı başlığı: Can Alpay Çiftçi
Üye Tem 2009 tarihinden beri · 1133 mesaj · Konum: İzmir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
C dilinde:


    char Buffer[512]; 
    int InputLength = atoi( getenv("INPUT_LENGTH") ); 
    fread( Buffer, InputLength, 1, stdin );

biçiminde yazılan,

perlde ise :

read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});

biçiminde yazılan kodu D'ye çeviremedim.

Sanırım env ile uzunluk alıp o kadar uzunluktaki veriyi okuyoruz ancak nasıl olacak bilmiyorum.
acehreli (Moderatör) #2
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4389 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Ben o cgi deneme programında cgi için ilginç olan değişkenleri getenv ile okuyordum:

import std.stdio;
import std.process;
import std.conv;
 
void main()
{
    try {
        writeln("Uzunluk: ", to!int(getenv("CONTENT_LENGTH")));
 
    } catch (ConvException) {
        stderr.writeln("Geçersiz değer");
    }
}

Ali
canalpay (Moderatör) #3
Kullanıcı başlığı: Can Alpay Çiftçi
Üye Tem 2009 tarihinden beri · 1133 mesaj · Konum: İzmir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
getenv ile içerik uzunluğunu alıyoruz. Buraya kadar her şey tamam.
Sonrada akımdan o kadar uzunluktaki boyutu okuyacağız. Ancak nasıl? Sanırım getchar ile okuyabiliyorduk. Geçmiş mesajlara bakayım.
acehreli (Moderatör) #4
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4389 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Hangi akımdan okuyoruz? Benim bildiğim kadarıyla cgi programlarının ihtiyaçları ortam değişkeni olarak gelir. Şu programla oynadıkça QUERY_STRING'in nasıl değiştiğine bak:

  http://ddili.org/cgi-bin/deneme

Şu programda da sorguDönüştür() diye bir işlevden yararlanmıştım:

  http://ddili.org/ornek_kod/trileri_deneme.d

Ali
acehreli (Moderatör) #5
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4389 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
acehreli:
sorguDönüştür() diye bir işlevden yararlanmıştım

Onun sonucunu da ayrıştır() diye bir işleve gönderip string[string] bir eşleme tablosu elde etmişim.

Ali
canalpay (Moderatör) #6
Kullanıcı başlığı: Can Alpay Çiftçi
Üye Tem 2009 tarihinden beri · 1133 mesaj · Konum: İzmir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Hmm benim hatam. Ben POST methodu için konuşuyordum. Siz GET methodu için anlamışsınız.


Şuan get için konuşuyorum:
Onun sonucunu da ayrıştır() diye bir işleve gönderip string[string] bir eşleme tablosu elde etmişim.

Bende sizin kodunuza bakmadan önce aynı şeyi yapıyorum. Kabul belki daha önceden bakıp esinlenmiş olabilirim :-p
Bakın unittesti:
unittest
{
    string[string] deneme;
    
    deneme=fixedString("hayvan=at&derece=Orta&sevilen+hayvan=ğüsçü&ikinci+d%C3%BC%C4%9Fme=Ba%C5%9Fka+D%C3%BC%C4%9Fme");
    assert(deneme["hayvan"]=="at");
    assert(deneme["sevilen hayvan"]=="ğüşçü");
 
}
Kod burada. İşlevin adı fixedString: https://github.com/canalpay/turna/blob/master/library/get.…


Hangi akımdan okuyoruz? Benim bildiğim kadarıyla cgi programlarının ihtiyaçları ortam değişkeni olarak gelir. Şu programla oynadıkça QUERY_STRING'in nasıl değiştiğine bak:
Bu method Get için. Benim get ile şuan bir sorunum yok.

Şu programda da sorguDönüştür() diye bir işlevden yararlanmıştım:

Evet bende sizin kodlarınızı alıp library modülüne ekledim:https://github.com/canalpay/turna/blob/f7ce8bb1644cf917e36…



Şimdi Post modülüne konuşuyoruz:

Ben post modülünü nasıl yazacağım hakkında konuşuyordum. Yani post ile nasıl veriyi alacağımı. İlk mesajda örnekler vardı başka dillerden. O kodlardan yararlanıp o kodları D diline çevirmeye çalıştım ancak yapamamıştım. Şuan anladığım kadarıyla şu biçimde olacak. :

 
import std.stdio;
import std.process;
import std.conv;
import std.cstream;
void main()
{
    char[] deneme;
    try {
        writeln("Uzunluk: ", to!int(getenv("CONTENT_LENGTH")));
 
    } catch (Exception) {
        stderr.writeln("Geçersiz değer");
    }
    
    while(deneme.length<to!int(getenv("CONTENT_LENGTH"))){
        
        deneme~=din.getc;
    }
        
}

Sanırım bu kod sayesinde post methodu ile gönderilen verileri alabileceğim. Şimdi deneyeceğim.
acehreli (Moderatör) #7
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4389 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
POST, standart girişten geliyormuş. Deneme programındaki formu method="POST" olarak değiştirince şu çalıştı:

    writeln("\n<b>Standart giriş:</b>\n");
 
    foreach (satır; stdin.byLine()) {
        writeln("satır: ", satır, "<br>");
    }

Ali
canalpay (Moderatör) #8
Kullanıcı başlığı: Can Alpay Çiftçi
Üye Tem 2009 tarihinden beri · 1133 mesaj · Konum: İzmir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
    writeln("\n<b>Standart giriş:</b>\n");
 
    foreach (satır; stdin.byLine()) {
        writeln("satır: ", satır, "<br>");
    }

Ben
    char[] deneme;
    while(deneme.length<to!int(getenv("CONTENT_LENGTH"))){
        
        deneme~=din.getc;
    }

biçiminde yaptım.

Ayrıca

Şu programda da sorguDönüştür() diye bir işlevden yararlanmıştım:

Ayrıca ona gerek yokmuş. std.uri'deki decode işlevi sanırım aynı işe yarıyor? Ayrıca başka işlevlerde var hangisi daha doğru bilmiyorum. Ben şuanlık decode işlevini kullanacağım.
Bu mesaj canalpay tarafından değiştirildi; zaman: 2011-02-10, 08:07.
acehreli (Moderatör) #9
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4389 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
İşi görüyorsa tamamdır. :)

canalpay:
    char[] deneme;
    while(deneme.length<to!int(getenv("CONTENT_LENGTH"))){

O satırı okurken < karakterini kapatan > karakteri aradım ama bulamadım. Beynim C++'ın şablonlarında kalmış. :D İşlecin etrafında boşluklar olsa daha güzel olur: ;)

    while(deneme.length < to!int(getenv("CONTENT_LENGTH"))){


std.uri'deki decode işlevi sanırım aynı işe yarıyor?

Güzel. :) Bir sürü şeye de dikkat ediyor. Kesinlikle onu kullanmak gerek.

Ali
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:
Forum: Projeler turna RSS
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-03-25, 14:42:54 (UTC -07:00)