pembaharuan: pertanyaan saya mengenai apakah AS2 dan SOAP Web Service fungsinya sama? terjawab dengan hasil surel dari Pak Dale Moberg penemu protokol AS2 RFC 4130 berikut: A Conversation with Dale Moberg about RFC 4130.
Hm.. kata pertama itu susah, tapi kali ini sedang ingin berkenalan dengan sintaks PDE (Pertukaran Data Elektronik) standar PBB untuk bertukar Purchase Order, Invoice, atau dokumen komersil lainnya, sudah lama sih standarnya, sudah sejak 1987, bagi yang belum pernah mendengar keberadaan EDIFACT yuk mampir ke tulisanku Pengantar Pertukaran Data Elektronik, tapi saya sendiri baru mendengar EDIFACT itu entah sekitar bulan agustus 2016 ini je, jadi kalau ada ketidak akurasian dengan isi tulisan mohon maaf yak..
yah, sudah 1987 kok masih dibahas, bukannya sudah jadul itu, pasti sudah ditinggalkan ya? iyah ditinggalkan oleh bisnis yang bermodal kecil, sebut saja Walmart [[5]http://lib.ui.ac.id/detail?id=20369097] yang harga pokok penjualannya 4800 triliun rupiah, berapa kali APBNnya Indonesia ya? terus Amazon (http://s.id/a6y, http://s.id/a6z) yang juga hampir mendekati 1000 triliun rupiah harga pokok penjualannya [marketwatch.com, 19 agustus 2016], Carrefour, Tesco, Target, Kmart, Sears, Metro dan silahkan cari sendiri dah..
Saya jadi tertarik ngoprek EDIFACT karena susah mencari penjelasan protokol AS2/RFC 4130 yang mudah dicerna, lha perangkat lunak AS2 yang bersumber terbuka saja bisa dihitung dengan jari keberadaanya, lha penemu AS2 sendiri yaitu Pak Rik Drummond nggak suka open saus http://s.id/eC7, lha gegara projek Oliot EPCIS (http://s.id/9Sw) punya mahasiswa PhD ilmu komputer kaist.ac.kr, Pak Jaewook Byun itu juga memberi pilihan opsional untuk mendukung AS2 atau tidak di pdf yang jadi acuan standarnya tapi beliau lebih pilih SOAP (JaewookByun commented on 16 Jul), ya makanya apa memang fungsinya sama kok dijadikan alternatif? lha sebelumnya ketika ingin mencoba membuat esai Kontribusiku Bagi Indonesia untuk mengikuti beasiswa LPDP (gagal maning son :'() malah menemukan komentarnya CEO Xterprise, Dean Frew berikut:
EPCIS was made up at MIT (Tesisnya James Luke Waldrop di http://s.id/9FU) with people that did not have a clue as to what systems customers already have and how they are not wanting to go on a wholesale enterprise system refresh.


Nah usut punya usut, semua menyusut pada pidatonya Bill Gates di tanggal 4 Maret 1999 inih http://s.id/EbQ, dan mak kluthik biasanya kalau ada rilis fitur baru, kan kompetitor membuat tanggapan, dan sila cek tanggappannya IBM sehari setelah Microsoft mengumumlam kerja sama dengan SAP, MasterCard dan kawan-kawannya dalam membuat dokumen BizTalk. Mbuh, sampai hari ini saya tidak mengerti bagaimana politik dalam berbisnis itu, saya tidak paham, tapi tanggapan pihak IBM itu sebagai berikut:
Developing e-commerce systems is a services business that involves "Connecting computers from wide range of vendors" and making them robust enough to handle huge volumes of business. "these are not historical strength of Microsoft,"

Oke jadi, karena Bill Gates dan James Waldrop itu sama saja dikatakan "kemeruh" oleh yang merasa "pemain lama" diatas, saya juga pengen meneladani mereka, James Waldrop dan Bill Gates, boleh dong, #eeh  #eaa
Nyak oke, karena AS2 itu juga protokol http yang ditambahi S/MIME, saya mencoba bermain sembrono dengan memakai protokol http biasa toh juga nggak ada yang bakalan memakainya kan, saya mah apa atuh, bukan mahasiswa MIT apalagi CEO Microsoft gituh.
Oke ditulisan ini saya ingin mengirim Purchase Order kepada sistem ERP milik manufaktur yang diimplementasikan dengan framework Spring Boot, dan akan dipanggil dengan bahasa PHP yang seolah olah sebagai sistem milik ritel dengan dokumen Purchase Order yang saya ambil contoh dari sini Carrefour Moscow (Карфур, Москва, Российская) EDIFACT D01B Purchase Order GuideLine.
Berikut daftar dependensi gradle-nya, beruntung di java ada pustaka sumber terbuka Smooks
//berkas build.gradle
dependencies {
    compile('io.projectreactor.ipc:reactor-netty:0.7.0.RC1') {
        exclude group: 'io.netty', module: 'netty-transport-native-epoll'
    }
    compile('io.netty:netty-transport-native-epoll:4.1.15.Final:linux-x86_64') {
        exclude group: 'commons-logging', module: 'commons-logging'
    }
    compile 'org.milyn:milyn-smooks-edi:1.4'
    compile 'org.milyn.edi.unedifact:d01b-binding:1.4'
    compile 'org.springframework:spring-webflux:5.0.0.RC4'
    compile('org.springframework:spring-context:5.0.0.RC4') {
        exclude group: 'org.springframework', module: 'spring-aop'
    }
    compile 'org.jetbrains.kotlin:kotlin-stdlib-jre8:1.1.4-3'
}
Disini saya membuat kelas EDIFACTDecoder yang mengimplementasikan kontrak antarmuka org.springframework.core.codec.Decoder<T> supaya fungsi yang memiliki predikat dengan request path /999US_AS2_20150715190948 dengan tipe konten EDIFACT milik kelas JAXMServlet tinggal menerima amplop yang berwujud org.milyn.smooks.edi.unedifact.model.r41.UNEdifactInterchange41, dan karena unmarshalling atau deserializing atau disassemble itu bukan tanggung jawabnya salah satu metode milik kelas JAXMServlet gituh.., ngomong-ngomong sebagai bahan pencarian di mbah Google, kelas org.milyn.smooks.edi.unedifact.model.r41.UNEdifactInterchange41 itu tanggung jawabnya kok mirip yah dengan kelas com.sun.xml.messaging.ebxml.EbXMLMessageImpl, tannya kenapa?
//berkas EDIFACTDecoder.java
package org.springframework.http.codec.edifact;

... //import yang lain dihilangkan
import org.milyn.edi.unedifact.d01b.D01BInterchangeFactory;
...

public class EDIFACTDecoder implements Decoder<Object> {

private D01BInterchangeFactory factory;

public EDIFACTDecoder() {
try {
this.factory = D01BInterchangeFactory.getInstance();
} catch (IOException | SAXException ex) {
}
}

@Override
public List<MimeType> getDecodableMimeTypes() {
return Arrays.asList(new MimeType("application", "EDIFACT"));
}

@Override
public boolean canDecode(ResolvableType elementType, MimeType mimeType) {
return true;
}

@Override
public Flux<Object> decode(Publisher<DataBuffer> inputStream, ResolvableType elementType,
MimeType mimeType, Map<String, Object> hints) {
throw new UnsupportedOperationException("Not supported yet");
}

@Override
public Mono<Object> decodeToMono(Publisher<DataBuffer> inputStream, ResolvableType elementType,
MimeType mimeType, Map<String, Object> hints) {
return Mono.from(inputStream).map(dataBuffer -> {
try {
return factory.fromUNEdifact(dataBuffer.asInputStream());
} catch (IOException ex) {
return Mono.error(new CodecException("Error while reading the data", ex));
} finally {
DataBufferUtils.release(dataBuffer);
}
});
}
}
Agar kelas EDIFACTDecoder yang baru saja dibuat bisa digunakan Spring untuk negosiasi konten, kelas tersebut perlu didaftarkan dengan memanggil metode customCodecs() milik kelas org.springframework.web.reactive.function.server.DefaultHandlerStrategiesBuilder
//berkas ExtendedHandlerStrategiesBuilder.java
package org.springframework.web.reactive.function.server;

import org.springframework.http.codec.edifact.EDIFACTDecoder;

public class ExtendedHandlerStrategiesBuilder {

public HandlerStrategies build() {
DefaultHandlerStrategiesBuilder builder = new DefaultHandlerStrategiesBuilder();
builder.defaultConfiguration();
builder.codecs(configurer -> configurer.customCodecs().decoder(new EDIFACTDecoder()));
return builder.build();
}
}
Berikut ini merupakan kelas JAXMServlet, seluruh permintaan HTTP dengan Request URI /999US_AS2_20150715190948 akan ditangani oleh kelas JAXMServlet berikut. Request URI umumnya merupakan kesepakatan antara mitra dagang dan dipertukarkan di luar jaringan. Kelas ini hanya memanfaatkan satu metode HTTP POST saja, serta berdasarkan [1][2][3][4], untuk operasi asinkron cocoknya kode status HTTP yang digunakan adalah 202 atau Accepted, umumnya untuk RESTful Web Services menggunakan semua verb yang ada di HTTP, jadi bila merujuk Richardson Maturity Model, solusi yang saya paparkan masih level 0[4].
//berkas JAXMServlet.kt
package id.co.blogspot.interoperabilitas

import org.milyn.edi.unedifact.d01b.ORDERS.Orders
import org.milyn.smooks.edi.unedifact.model.r41.UNEdifactInterchange41
... //import yang lain dihilangkan supaya singkat

object JAXMServlet {//: javax.xml.messaging.OnewayListener

    @JvmStatic fun main(args: Array<String>) {
        val route: RouterFunction<ServerResponse> = router {
            POST("/999US_AS2_20150715190948").apply {
                contentType(MediaType("application", "EDIFACT")) {request ->
                    request.bodyToMono(UNEdifactInterchange41::class.java)
                           .subscribeOn(Schedulers.single())
                           .subscribe({amplop ->
                                amplop.getMessages().forEach {surat ->
                                    // Membaca surat...
                                    println("\tNama topik: " + surat.getMessageHeader().getMessageIdentifier().getId())
                                    val pesananPembelian: Orders = surat.getMessage() as Orders
                                    println("\tNama mitra " + pesananPembelian.getSegmentGroup2().get(0).getNameAndAddress().getPartyName().getPartyName1())
                                    println("\tJumlah SKU " + pesananPembelian.getSegmentGroup28().size)
                                    println("\tDeskripsi SKU " + pesananPembelian.getSegmentGroup28().get(0).getItemDescription().get(0).getItemDescription().getItemDescription1())
                                    println("\tJumlah " + pesananPembelian.getSegmentGroup28().get(0).getQuantity().get(0).getQuantityDetails().getQuantity())
                                }
                            })
                           ServerResponse.accepted().build()
                    }
                }
            }
        val builder: ExtendedHandlerStrategiesBuilder = ExtendedHandlerStrategiesBuilder()
        HttpServer.create("127.0.0.1", 5080)
                  .startAndAwait(ReactorHttpHandlerAdapter(toHttpHandler(route, builder.build())), null)
        println("Sigkill to shutdown.")
    }
}
Dalam mencari pustaka php yang sudah matang untuk mengolah surat EDIFACT itu susahnya minta ampun, saya sendiri baru menemukan ini saja, jadinya ya saya hanya memakai String mentahan gituh ajah:
$ composer require sabas/edifact
$ composer require metroplex-systems/edifact
Berikut di bawah ini adalah kode untuk Client RESTful-nya:
//berkas jangan.php, iyah jangan diphpin yah >.<
<?php

$waktu_awal = microtime(true);
//http://www.carrefour.net/tableau/pdf_migs/ORDERS_D01B_APEX_SUP_V13F.pdf
$amplop = "UNA:+.? 'UNB+UNOD:3+4680001859997:14+4670001659017:14+080430:1446+CAR000001++SUPAPEXORV13MB++1++1'UNH+123456789+ORDERS:D:01B:UN:EAN010'BGM+220:::ORDERS+12345678+9'DTM+137:20080430:102'DTM+2:20080501:102'DTM+64:20080501:102'DTM+63:20080503:102'FTX+PUR+1++Confirmation of the august 23rd order done by phone'RFF+ACD:26862'NAD+SU+4607077429992::9++SUPPLIER1 SRAGEN+24 BOL NIKITSKAYA ULITSA+SRAGEN++103009'RFF+VA:RU56225432'CTA+IC'COM+0033169479417:FX'NAD+DP+4607077429992::9++CARREFOUR SRAGEN+101 BOL NIKITSKAYA ULITSA:ADDITIONAL INFORMATION+SRAGEN++24024'RFF+YC1:12987'RFF+ACD:01'NAD+BY+4607077429994::9'RFF+SD:10'CUX+2:RON:9'LIN+1++4602345111115:SRV'IMD+F+ANM+:::white paper A4 Description text of the Item format'QTY+21:500'QTY+59:100'PRI+AAA:65.50::NTP'PAC+100++CT'UNS+S'CNT+2:1'UNT+27+123456789'UNZ+1+CAR000001'";

//kirimkan amplop ini ke endpoint /999US_AS2_20150715190948 milik pemasok kita
$ch = curl_init('http://localhost:5080/999US_AS2_20150715190948');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_POSTFIELDS, $amplop);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type: application/EDIFACT', //https://tools.ietf.org/html/rfc1767
'Content-Length: '.strlen($amplop), )
);
curl_exec($ch);
$info = curl_getinfo($ch);
curl_close($ch);
http_response_code($info['http_code']);
$waktu_akhir = microtime(true);
$jeda = $waktu_akhir - $waktu_awal;
if ($info['http_code'] == 202) {
echo 'Kode Status: '.$info['http_code'].' Artinya Lamaranmu sedang dipertimbangkan, eh, Amplopmu diterima untuk diproses tapi belum komplit :v. Lamaranmu eh permintaan httpmu ditanggapi dalam waktu: '.$jeda.' mikro detik, cepet amat nyak nanggepi lamarannya, eh permintaan httpnya, yah lebih mending dari pada diphpin, eh.. :v';
}

Kalau skrip php di atas dipanggil dari peramban kesukaan anda, maka akan seketika menampilkan pesan berapa lama lamaranmu dijawab :v, karena ketika amplop EDIFACT terkirim saat fungsi curl_exec() tereksekusi, proses pengolahannya entah Purchase Order ataupun Invoice bisa berlangsung cepat karena metode onMessageReceived() di sisi server telah ditandai dengan penanda (annotation di dunia java, attribute di dunia .NET) @Async, penanda yang berfungsi untuk membuang kontrol eksekusi ke thread lain, berikut ini merupakan tampilan pesan-pesannya di peramban rubah api Netscape, eh Mozilla Firefox:
Berikut merupakan hasil eksekusi program server-nya:
Sedangkan berikut ini merupakan contoh permintaan HTTP POST, menggunakan program curl

$ curl -i -X POST -H "Content-Type: application/EDIFACT" -d "UNA:+.? 'UNB+UNOD:3+4680001859997:14+4670001659017:14+080430:1446+CAR000001++SUPAPEXORV13MB++1++1'UNH+123456789+ORDERS:D:01B:UN:EAN010'BGM+220:::ORDERS+12345678+9'DTM+137:20080430:102'DTM+2:20080501:102'DTM+64:20080501:102'DTM+63:20080503:102'FTX+PUR+1++Confirmation of the august 23rd order done by phone'RFF+ACD:26862'NAD+SU+4607077429992::9++SUPPLIER1 SRAGEN+24 BOL NIKITSKAYA ULITSA+SRAGEN++103009'RFF+VA:RU56225432'CTA+IC'COM+0033169479417:FX'NAD+DP+4607077429992::9++CARREFOUR SRAGEN+101 BOL NIKITSKAYA ULITSA:ADDITIONAL INFORMATION+SRAGEN++24024'RFF+YC1:12987'RFF+ACD:01'NAD+BY+4607077429994::9'RFF+SD:10'CUX+2:RON:9'LIN+1++4602345111115:SRV'IMD+F+ANM+:::white paper A4 Description text of the Item format'QTY+21:500'QTY+59:100'PRI+AAA:65.50::NTP'PAC+100++CT'UNS+S'CNT+2:1'UNT+27+123456789'UNZ+1+CAR000001'" http://localhost:5080/999US_AS2_20150715190948
HTTP/1.1 202
content-length: 0
  • -i memastikan anda bisa melihat pesan tanggapan termasuk header HTTP.
  • -X POST metode POST digunakan untuk mengirim surat EDIFACT
  • -H "Content-Type: application/EDIFACT" mengatur content type sehingga aplikasi mengerti tubuh permintaan HTTP berisi surat EDIFACT
  • -d "UNA:+.? 'UNB+UNOD:3+4680001859997:14+4670001659017:14+080430:1446+CAR000001++SUPAPEXORV13MB++1++1'UNH+123456789+ORDERS:D:01B:UN:EAN010'BGM+220:::ORDERS+12345678+9'DTM+137:20080430:102'DTM+2:20080501:102'DTM+64:20080501:102'DTM+63:20080503:102'FTX+PUR+1++Confirmation of the august 23rd order done by phone'RFF+ACD:26862'NAD+SU+4607077429992::9++SUPPLIER1 SRAGEN+24 BOL NIKITSKAYA ULITSA+SRAGEN++103009'RFF+VA:RU56225432'CTA+IC'COM+0033169479417:FX'NAD+DP+4607077429992::9++CARREFOUR SRAGEN+101 BOL NIKITSKAYA ULITSA:ADDITIONAL INFORMATION+SRAGEN++24024'RFF+YC1:12987'RFF+ACD:01'NAD+BY+4607077429994::9'RFF+SD:10'CUX+2:RON:9'LIN+1++4602345111115:SRV'IMD+F+ANM+:::white paper A4 Description text of the Item format'QTY+21:500'QTY+59:100'PRI+AAA:65.50::NTP'PAC+100++CT'UNS+S'CNT+2:1'UNT+27+123456789'UNZ+1+CAR000001'" adalah data yang akan dikirim
Kode Sumber

  1. Anda bisa mengunduh dan unzip repository untuk artikel ini, atau klon menggunakan Git: git clone https://github.com/dawud-tan/spring-kotlin-functional.git
  2. cd ke dalam direktori spring-kotlin-functional/
  3. langsung jalankan program dengan perintah $ gradlew run

Daftar Pustaka

  1. Basalamah, A. and Antonio, J. (2003). Peranan Microsoft Biztalk Server 2000 dalam Aplikasi Electronic Data Interchange (EDI) pada PT. EDI Indonesia. Undergraduate. Universitas Bina Nusantara.
  2. B. Burke, "Is anybody doing HTTP message signing and encryption?", Bill the Plumber, 2011. [Online]. Available: https://bill.burkecentral.com/2011/08/16/is-anybody-doing-http-message-signing-and-encryption/amp/. [Accessed: 23- Aug- 2017].
  3. K. Choudhary, U. Pandey, M. Nayak and D. Mishra, "Electronic Data Interchange: A Review", 2011 Third International Conference on Computational Intelligence, Communication Systems and Networks, 2011.
  4. R. Drummond, "The Impact of IETF's EDI over Internet Recommendations on World-wide Electronic Commerce", Journal of Internet Banking and Commerce, vol. 2, no. 1, p. 20, 1997.
  5. C. Holland, G. Lockett and I. Blackman, "Planning for electronic data interchange", Strategic Management Journal, vol. 13, no. 7, pp. 539-550, 1992.
  6. D. Hook, Beginning cryptography in Java. Indianapolis, IN: Wiley Pub., 2005.
  7. Y. Kabak and A. Dogac, "A survey and analysis of electronic business document standards", ACM Computing Surveys, vol. 42, no. 3, pp. 1-31, 2010.
  8. J. Long, "joshlong/integration-gateway", GitHub, 2011. [Online]. Available: https://github.com/joshlong/integration-gateway/blob/master/README. [Accessed: 22- Sep- 2017].
  9. K. Meadors, "Secure Electronic Data Interchange over the Internet", IEEE Internet Computing, vol. 9, no. 3, pp. 82-89, 2005.
  10. Michelle, "Supply chain management practices in Wal mart and Ikea", S.E., UNIVERSITAS INDONESIA, 2014.
  11. B. Murtiyasa, "Desain Kriptosistem kunci publik dengan invers kiri/kanan", Dr., UNIVERSITAS GAJAH MADA, 2005.
  12. J. Senn, "ELECTRONIC DATA INTERCHANGE", Information Systems Management, vol. 9, no. 1, pp. 45-53, 1992.
  13. S. Turner and R. Housley, Implementing Email Security and Tokens: Current Standards, Tools, and Practices, 1st ed. Indianapolis, IN: Wiley, 2008.
  14. S. Turner, "Secure/Multipurpose Internet Mail Extensions", IEEE Internet Computing, vol. 14, no. 5, pp. 82-86, 2010.
  15. J. Wu and H. Miao, "Formal Specification for Secure Electronic Data Interchange System in Maude", 2007 IEEE International Conference on Automation and Logistics, 2007.

Reactions:

You Might Also Like:

Berikan Komentar Sembunyikan Komentar

Hello, how may we help you? Just send us a message now to get assistance.

Facebook Messenger ×