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/9FM, 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 'org.springframework:spring-webmvc:4.3.3.RELEASE'
   compile 'org.springframework.boot:spring-boot-starter:1.4.1.RELEASE'
   compile 'org.springframework.boot:spring-boot-starter-tomcat:1.4.1.RELEASE'
   compile 'org.milyn:milyn-smooks-edi:1.4'
   compile 'org.milyn.edi.unedifact:d01b-binding:1.4'
}
Sedangkan berikut merupakan kelas yang berisi anotasi @SpringBootApplication, sekadar konfigurasi untuk membuat Spring Boot bisa membuang kontrol ke thread lain dan bisa langsung kembalikan kontrol ke client (jadi teringat kelas abstrak android.os.AsyncTask di android atawa javax.swing.SwingWorker di java desktop, kah?), serta mengganti nomor port bawaannya yaitu 8080 menjadi 5080.
//berkas Application.java
package id.co.blogspot.datacomlink;

... //import dihilangkan supaya singkat

@SpringBootApplication
@EnableAsync
public class Application extends AsyncConfigurerSupport {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Override
    public Executor getAsyncExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.initialize();
        return executor;
    }

    @Bean
    public EmbeddedServletContainerCustomizer containerCustomizer() {
        return new EmbeddedServletContainerCustomizer() {
            @Override
            public void customize(ConfigurableEmbeddedServletContainer container) {
                container.setPort(5080);
            }
        };
    }
}
Disini saya membuat kelas EDIFACTHttpMessageConverter yang mewarisi kelas org.springframework.http.converter.AbstractHttpMessageConverter<T> supaya metode onMessageReceived() milik kelas JAXMServlet yang ditandai untuk mengolah metode HTTP POST 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?
package org.springframework.http.converter.edifact;

... //import yang lain dihilangkan supaya singkat
import org.milyn.edi.unedifact.d01b.D01BInterchangeFactory;
import org.milyn.smooks.edi.unedifact.model.UNEdifactInterchange;
import org.xml.sax.SAXException;
...

public class EDIFACTHttpMessageConverter extends AbstractHttpMessageConverter<UNEdifactInterchange> {
    private D01BInterchangeFactory factory;

    public EDIFACTHttpMessageConverter() {
        //https://tools.ietf.org/html/rfc1767
        super(new MediaType("application", "EDIFACT"));
        try {
            this.factory = D01BInterchangeFactory.getInstance();
        } catch (IOException | SAXException ex) {
            ex.printStackTrace();
        }
    }

    @Override
    protected UNEdifactInterchange readInternal(Class<? extends UNEdifactInterchange> clazz,
                                                HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException {
        return factory.fromUNEdifact(inputMessage.getBody());
    }

    @Override
    protected boolean supports(Class<?> clazz) {
        return true;
    }

    @Override
    protected void writeInternal(UNEdifactInterchange interchange,
                                 HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException {
        factory.toUNEdifact(interchange, new OutputStreamWriter(outputMessage.getBody(), "UTF-8"));
    }
}
Agar kelas EDIFACTHttpMessageConverter yang baru saja dibuat bisa digunakan Spring untuk negosiasi konten, kelas tersebut perlu didaftarkan dengan membuat konfigurasi spring berbasis anotasi yang mewarisi kelas org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport
package id.co.blogspot.datacomlink;

... //import yang lain dihilangkan supaya singkat
import org.springframework.http.converter.edifact.EDIFACTHttpMessageConverter;

@Configuration
public class WebConfig extends WebMvcConfigurationSupport {
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.add(new EDIFACTHttpMessageConverter());
        addDefaultHttpMessageConverters(converters);
    }
}
Berikut ini merupakan kelas JAXMServlet yang ditandai dengan anotasi @RestController, seluruh permintaan HTTP dengan Request URI /9999US_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.java
package id.co.blogspot.datacomlink;

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

@RestController
public class JAXMServlet {//implements javax.xml.messaging.OnewayListener

    @Async
    @ResponseStatus(HttpStatus.ACCEPTED)
    @PostMapping(value = "/9999US_AS2_20150715190948")
    public void onMessageReceived(@RequestBody UNEdifactInterchange41 amplop) {
        amplop.getMessages().stream().forEach(surat -> {
            // Membaca surat...
            System.out.println("\tNama topik: " + surat.getMessageHeader().getMessageIdentifier().getId());
            Orders pesananPembelian = (Orders) surat.getMessage();
            System.out.println("\tNama mitra " + pesananPembelian.getSegmentGroup2().get(0).getNameAndAddress().getPartyName().getPartyName1());
            System.out.println("\tJumlah SKU " + pesananPembelian.getSegmentGroup28().size());
            System.out.println("\tDeskripsi SKU " + pesananPembelian.getSegmentGroup28().get(0).getItemDescription().get(0).getItemDescription().getItemDescription1());
            System.out.println("\tJumlah " + pesananPembelian.getSegmentGroup28().get(0).getQuantity().get(0).getQuantityDetails().getQuantity());
        });
    }
}
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 /9999US_AS2_20150715190948 milik pemasok kita
$ch = curl_init('http://localhost:5080/9999US_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/9999US_AS2_20150715190948
HTTP/1.1 202
Content-Length: 0
Date: Sun, 18 Sep 2016 05:16:59 GMT
  • -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/restful-edifact.git
  2. cd ke dalam direktori restful-edifact/
  3. langsung jalankan program dengan perintah $ gradlew bootRun

Daftar Pustaka:


  1. S. Allamaraju, "Using the Uniform Interface," in RESTful Web services cookbook, 1st ed. Sebastopol, CA: O'Reilly, 2010, ch. 1, sec. 10, pp. 19-22.
  2. 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.
  3. 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.
  4. C. Holland, G. Lockett and I. Blackman, "Planning for electronic data interchange", Strategic Management Journal, vol. 13, no. 7, pp. 539-550, 1992.
  5. G. Jansen, "Methods", Thoughts on RESTful API Design, 2012. [Online]. Available: http://restful-api-design.readthedocs.io/en/latest/methods.html#asynchronous-requests. [Accessed: 06- Sep- 2016].
  6. 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.
  7. L. Richardson and S. Ruby, "REST and ROA Best Practices," in RESTful web services, 1st ed. Sebastopol, CA: O'Reilly, 2007, ch. 8, sec. 8, pp. 228-230.
  8. J. Thijssen, "Asynchronous operations - The RESTful cookbook", - The RESTful cookbook, 2012. [Online]. Available: http://restcookbook.com/Resources/asynchroneous-operations/. [Accessed: 06- Sep- 2016].
  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. J. Senn, "ELECTRONIC DATA INTERCHANGE", Information Systems Management, vol. 9, no. 1, pp. 45-53, 1992.
  12. S. Turner and R. Housley, Implementing Email Security and Tokens: Current Standards, Tools, and Practices, 1st ed. Indianapolis, IN: Wiley, 2008.
  13. S. Turner, "Secure/Multipurpose Internet Mail Extensions", IEEE Internet Computing, vol. 14, no. 5, pp. 82-86, 2010.
  14. 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 ×