Error Server Internal 500 - EmptyPath

Anda sedang melihat dokumentasi Apigee Edge.
Buka dokumentasi Apigee X.
info

Gejala

Aplikasi klien mendapatkan kode status HTTP 500 Internal Server Error dengan kode error protocol.http.EmptyPath sebagai respons untuk panggilan API.

Pesan error

Aplikasi klien mendapatkan kode respons berikut:

HTTP/1.1 500 Internal Server Error

Selain itu, Anda mungkin melihat pesan error berikut:

{
   "fault":{
      "faultstring":"Request path cannot be empty",
      "detail":{
         "errorcode":"protocol.http.EmptyPath"
      }
   }
}

Kemungkinan penyebab

Error ini terjadi jika URL permintaan server backend, yang ditunjukkan oleh variabel alur target.url, berisi jalur kosong.

Sesuai spesifikasi RFC 3986, bagian 3: Komponen Sintaksis dan RFC 3986, bagian 3.3: Jalur:

  1. Sintaksis URI memiliki komponen berikut:

            foo://example.com:8042/over/there?name=ferret#nose
            \_/   \______________/\_________/ \_________/ \__/
             |            |            |            |       |
          scheme      authority       path        query   fragment
    
  2. Komponen path wajib dan HARUS selalu memiliki garis miring (/), meskipun tidak ada karakter lain sebagai bagian dari jalur.

Oleh karena itu, jika URL permintaan server backend tidak memiliki komponen path sama sekali, atau bahkan tidak memiliki garis miring (/), Apigee Edge akan merespons dengan 500 Internal Server Error dan kode error protocol.http.EmptyPath.

Misalnya: Jika target.url memiliki nilai https://www.mocktarget.apigee.net, error ini akan terjadi saat komponen path kosong atau tidak ada.

Penyebab Deskripsi Petunjuk pemecahan masalah yang berlaku untuk
URL server backend (target.url) memiliki jalur kosong URL server backend yang diwakili oleh variabel flow target.url memiliki jalur kosong. Pengguna Edge Publik dan Private Cloud

Langkah-langkah diagnosis umum

Gunakan salah satu alat/teknik berikut untuk mendiagnosis error ini:

Pemantauan API

Prosedur #1: Menggunakan Pemantauan API

Untuk mendiagnosis error menggunakan API Monitoring:

  1. Login ke UI Apigee Edge sebagai pengguna dengan peran yang sesuai.
  2. Beralihlah ke organisasi tempat Anda ingin menyelidiki masalah.

  3. Buka halaman Analyze > API Monitoring > Menyelidiki.
  4. Pilih jangka waktu spesifik saat Anda melihat error.
  5. Tempatkan Kode Kesalahan terhadap Waktu.

  6. Pilih sel yang memiliki kode kesalahan protocol.http.EmptyPath seperti yang ditunjukkan di bawah ini:

  7. Informasi tentang kode kesalahan protocol.http.EmptyPath ditampilkan seperti yang ditunjukkan di bawah ini:

  8. Klik Lihat log untuk meluaskan baris untuk permintaan yang gagal.

  9. Dari jendela Logs, perhatikan detail berikut:
    • Kode Status: 500
    • Sumber Kesalahan: target
    • Kode Kesalahan: protocol.http.EmptyPath
  10. Jika Sumber Kesalahan adalah target dan Kode Kesalahan adalah protocol.http.EmptyPath, hal ini menunjukkan bahwa URL server backend memiliki jalur kosong.

Rekaman aktivitas

Prosedur #2: Menggunakan alat Trace

Untuk mendiagnosis error menggunakan alat Trace:

  1. Aktifkan sesi perekaman aktivitas dan
    • Tunggu hingga error 500 Internal Server Error terjadi, atau
    • Jika Anda dapat merekonstruksi masalah, buat panggilan API untuk mereproduksi masalah 500 Internal Server Error
  2. Pastikan Show all FlowInfos diaktifkan:

  3. Pilih salah satu permintaan yang gagal dan periksa rekaman aktivitas.
  4. Jelajahi berbagai fase rekaman aktivitas dan temukan lokasi terjadinya kegagalan.
  5. Anda akan menemukan error biasanya dalam alur setelah fase Alur Permintaan Target Dimulai seperti yang ditunjukkan di bawah ini:

  6. Catat nilai error dari rekaman aktivitas.

    error: Jalur permintaan wajib diisi

    Karena error muncul oleh Apigee Edge setelah fase Alur Permintaan Target Dimulai, hal ini menunjukkan bahwa path di URL server backend kosong. Hal ini kemungkinan besar akan terjadi jika variabel alur target.url (yang mewakili URL untuk server backend) mungkin telah diperbarui dengan jalur kosong melalui salah satu kebijakan dalam alur permintaan.

  7. Periksa bagian Variabel yang Dibaca dan Ditetapkan di setiap alur mundur dari titik error menuju fase Alur Permintaan Target Dimulai.
  8. Tentukan kebijakan tempat variabel flow target.url diupdate.

    Contoh rekaman aktivitas yang menunjukkan kebijakan JavaScript memperbarui variabel alur target.url:

    Dalam contoh rekaman aktivitas yang ditampilkan di atas, perhatikan bahwa nilai variabel variabel alur target.url diperbarui dalam kebijakan JavaScript bernama SetTargetURL sebagai berikut:

    target.url : https://mocktarget.apigee.net
    
  9. Perlu diperhatikan bahwa target.url memiliki komponen berikut:
    • skema: https://mocktarget.apigee.net
    • path: kosong
  10. Oleh karena itu, Anda mendapatkan error Request path cannot be empty.
  11. Buka Fase AX (Data Analytics Dicatat) di trace, lalu klik Fase tersebut.
  12. Scroll ke bawah ke bagian Phase Details - Error Headers, lalu tentukan nilai X-Apigee-fault-code dan X-Apigee-fault-source seperti yang ditunjukkan di bawah ini:

  13. Anda akan melihat nilai X-Apigee-fault-code dan X-Apigee-fault-source masing-masing protocol.http.EmptyPath dan target , yang menunjukkan bahwa error ini disebabkan karena URL server backend memiliki jalur kosong.
    Header Respons Nilai
    X-Apigee-fault-code protocol.http.EmptyPath
    X-Apigee-fault-source target

NGINX

Prosedur #3: Menggunakan Log Akses NGINX

Untuk mendiagnosis error menggunakan log akses NGINX:

  1. Jika Anda adalah pengguna Private Cloud, Anda dapat menggunakan log akses NGINX untuk menentukan informasi penting tentang HTTP 500 Internal Server Error.
  2. Periksa log akses NGINX:

    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

  3. Telusuri untuk melihat apakah ada error 500 dengan kode error protocol.http.EmptyPath selama durasi tertentu (jika masalah terjadi di masa lalu) atau apakah ada permintaan yang masih gagal dengan 500.
  4. Jika Anda menemukan error 500 dengan X-Apigee-fault-code yang cocok dengan nilai protocol.http.EmptyPath, tentukan nilai dari X-Apigee-fault-source.

    Contoh error 500 dari log akses NGINX:

    Contoh entri di atas dari log akses NGINX memiliki nilai berikut untuk X- Apigee-fault-code dan X-Apigee-fault-source:

    Header Nilai
    X-Apigee-fault-code protocol.http.EmptyPath
    X-Apigee-fault-source target

    Perhatikan bahwa nilai X-Apigee-fault-code dan X-Apigee-fault-source masing-masing adalah protocol.http.EmptyPath dan target , menunjukkan bahwa error ini disebabkan karena URL server backend memiliki jalur kosong.

Penyebab: URL server backend (target.url) memiliki jalur kosong

Diagnosis

  1. Tentukan Kode Kesalahan dan Sumber Kesalahan untuk 500 Internal Server Error menggunakan Pemantauan API, Alat Pelacakan, atau log akses NGINX seperti yang dijelaskan dalam Langkah-langkah diagnosis umum.
  2. Jika Fault Code adalah protocol.http.EmptyPath dan Fault Source memiliki nilai target, maka ini menunjukkan bahwa URL server backend memiliki jalur kosong.
  3. URL server backend direpresentasikan oleh variabel alur target.url di Apigee Edge. Error ini biasanya terjadi jika Anda mencoba memperbarui URL server backend, yaitu, target.url secara dinamis menggunakan salah satu kebijakan (dalam alur Proxy/bersama) di alur permintaan Target, sehingga memiliki jalur kosong.

  4. Tentukan apakah variabel flow target.url memang memiliki jalur kosong dan sumber nilainya menggunakan salah satu langkah berikut:

    Rekaman aktivitas

    Menggunakan alat Trace

    Jika Anda telah merekam aktivitas error ini, gunakan langkah-langkah seperti yang dijelaskan dalam Menggunakan Alat Rekaman Aktivitas dan:

    1. Verifikasi apakah target.url memiliki jalur kosong.
    2. Jika ya, cari tahu kebijakan mana yang mengubah atau memperbarui nilai target.url agar berisi jalur kosong.

      Contoh rekaman aktivitas yang menunjukkan kebijakan JavaScript memperbarui variabel alur target.url:

    3. Pada contoh rekaman aktivitas di atas, perhatikan bahwa kebijakan JavaScript telah mengubah atau memperbarui nilai target.url agar berisi jalur kosong.
    4. Perhatikan bahwa target.url memiliki komponen berikut:
      • skema: https://mocktarget.apigee.net
      • path: kosong

    Log

    Menggunakan log di server log

    1. Jika Anda tidak memiliki rekaman aktivitas untuk error ini (masalah intermiten), periksa apakah Anda telah mencatat informasi tentang nilai variabel alur target.url, menggunakan kebijakan seperti MessageLogging atau ServiceCallout ke server log Anda.
    2. Jika Anda memiliki log tersebut, tinjau log dan:
      1. Verifikasi apakah target.url memiliki jalur kosong, dan
      2. Lihat apakah Anda dapat menentukan kebijakan mana yang mengubah target.url agar berisi jalur kosong

    Proxy API

    Meninjau proxy API yang gagal

    Jika Anda tidak memiliki rekaman aktivitas atau log untuk error ini, tinjau proxy API yang gagal untuk menentukan apa yang mengubah atau memperbarui variabel flow target.url agar berisi jalur yang tidak valid. Periksa hal-hal berikut:

    • Kebijakan dalam proxy API
    • Setiap alur bersama yang dipanggil dari proxy
  5. Periksa kebijakan spesifik (Misalnya, AllowMessage atau JavaScript) yang mengubah atau mengupdate variabel alur target.url dengan cermat dan menentukan penyebab update target.url agar memiliki jalur kosong.

    Berikut adalah beberapa contoh kebijakan yang salah memperbarui variabel alur target.url agar berisi jalur kosong yang mengarah ke error ini.

    Contoh #1

    Contoh #1: Kebijakan JavaScript yang memperbarui variabel target.url

    var url = "https://mocktarget.apigee.net"
    context.setVariable("target.url", url);
    

    Pada contoh di atas, perhatikan bahwa variabel flow target.url diperbarui dengan nilai https://mocktarget.apigee.net yang terdapat dalam variabel lain url.

    Perhatikan bahwa target.url memiliki komponen berikut:

    • skema: https://mocktarget.apigee.net
    • path: kosong

    Karena jalur tersebut kosong, Apigee Edge akan menampilkan 500 Internal Server Error dengan kode error protocol.http.EmptyPath.

    Contoh #2

    Contoh #2: Kebijakan JavaScript yang memperbarui variabel target.url

    var path = context.getVariable("request.header.Path");
    var url = "https://mocktarget.apigee.net" + path
    context.setVariable("target.url", url);

    Pada contoh di atas, perhatikan bahwa variabel flow target.url diperbarui dengan menggabungkan nilai https://mocktarget.apigee.net yang terdapat dalam variabel url dan nilai variabel lain path, yang nilainya diambil dari request.header.Path.

    Jika memiliki akses ke permintaan atau trace sebenarnya, Anda dapat memverifikasi nilai sebenarnya yang diteruskan ke request.header.Path.

    Contoh Permintaan yang dibuat oleh pengguna:

    curl -v https://HOST_ALIAS/v1/myproxy -H "Authorization: Bearer <token>
    

    Dalam contoh ini, jalur header tidak dikirim sebagai bagian dari permintaan. Oleh karena itu, nilai jalur variabel dalam kebijakan JavaScript adalah null.

    Jadi:

    • url = https://mocktarget.apigee.net + path
    • url = https://mocktarget.apigee.net + null
    • target.url = https://mocktarget.apigee.netnull

    Perlu diperhatikan bahwa target.url memiliki komponen berikut:

    • skema: https://mocktarget.apigee.netnull
    • path: kosong

    Contoh #3

    Contoh #3: Kebijakan Menetapkan Pesan yang memperbarui variabel target.url melalui variabel lain

    <AssignMessage async="false" continueOnError="false" enabled="true" name=">AM-SetTargetURL">
        <DisplayName>AM-SetTargetURL</DisplayName>
        <AssignVariable>
             <Name>target.url</Name>
             <Value>https://mocktarget.apigee.net</Value>
        </AssignVariable>
        <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
        <AssignTo createNew="false" transport="http" type="request"/>
    </AssignMessage>
    

    Perlu diperhatikan bahwa target.url memiliki komponen berikut:

    • skema: https://mocktarget.apigee.net
    • path: kosong

    Dalam semua contoh di atas, jalur di URL server backend, yaitu target.url, kosong, sehingga Apigee Edge menampilkan 500 Internal Server Error dengan kode error protocol.http.EmptyPath.

Resolusi

Sesuai spesifikasi RFC 3986, bagian 2: Komponen Sintaksis, komponen path diperlukan dan HARUS selalu memiliki garis miring (/), meskipun tidak ada karakter lain sebagai bagian dari path. Lakukan langkah-langkah berikut untuk memperbaiki masalah ini:

  1. Pastikan URL server backend, yang diwakili oleh variabel alur target.url selalu memiliki jalur yang tidak kosong.
    1. Dalam beberapa kasus, Anda mungkin tidak memiliki nama resource di jalur, lalu pastikan jalur setidaknya memiliki garis miring (/).
    2. Jika Anda menggunakan variabel lain untuk menentukan nilai variabel flow target.url, pastikan variabel lain tidak memiliki jalur kosong.
    3. Jika Anda melakukan operasi string untuk menentukan nilai variabel flow target.url, pastikan hasil atau hasil operasi string tidak memiliki jalur kosong.
  2. Dalam contoh yang dibahas dalam Diagnosis, Anda dapat memperbaiki masalah ini seperti yang dijelaskan di bawah:

    Contoh #1

    Contoh #1: Kebijakan JavaScript yang memperbarui variabel target.url

    Tambahkan garis miring (/) ke variabel url untuk memperbaiki masalah ini seperti yang ditunjukkan di bawah:

    var url = "https://mocktarget.apigee.net/"
    context.setVariable("target.url", url);
    

    Contoh #2

    Contoh #2: Kebijakan JavaScript yang memperbarui variabel target.url

    var path = context.getVariable("request.header.Path");
    var url = "https://mocktarget.apigee.net" + path
    context.setVariable("target.url", url);
    

    Pastikan Anda meneruskan jalur yang valid, misalnya, /iloveapis sebagai bagian dari header permintaan Path untuk memperbaiki masalah ini seperti yang ditunjukkan di bawah ini:

    Contoh permintaan:

    curl -v https://HOST_ALIAS/v1/myproxy -H "Authorization: Bearer <token> -H "Path: /iloveapis"
    

    Contoh #3

    Contoh #3: Kebijakan ProvideMessage memperbarui variabel target.url melalui variabel lain

    Tambahkan jalur yang valid di elemen <Value> dari kebijakan ProvideMessage. Misalnya, Anda dapat menggunakan /json sebagai jalur untuk MockTarget API. Artinya, ubah elemen <Value> menjadi https://mocktarget.apigee.net/json seperti yang ditunjukkan di bawah ini:

    <AssignMessage async="false" continueOnError="false" enabled="true" name="AM-SetTargetURL">
        <DisplayName>AM-SetTargetURL</DisplayName>
        <AssignVariable>
             <Name>target.url</Name>
             <Value>https://mocktarget.apigee.net/json</Value>
        </AssignVariable>
        <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
        <AssignTo createNew="false" transport="http" type="request"/>
    </AssignMessage>
    

Spesifikasi

Apigee Edge memperkirakan bahwa URL server backend tidak memiliki jalur kosong sesuai dengan spesifikasi berikut:

Spesifikasi
RFC 3986, bagian 3: Komponen Sintaksis
RFC 3986, bagian 3.3: Jalur

Jika Anda masih memerlukan bantuan dari Dukungan Apigee, buka Harus mengumpulkan informasi diagnostik.

Harus mengumpulkan informasi diagnostik

Jika masalah berlanjut bahkan setelah mengikuti petunjuk di atas, kumpulkan informasi diagnostik berikut, lalu hubungi Dukungan Apigee Edge.

Jika Anda adalah pengguna Cloud Publik, berikan informasi berikut:

  • Nama organisasi
  • Nama lingkungan
  • Nama Proxy API
  • Selesaikan perintah curl yang digunakan untuk mereproduksi 500 Internal Server Error dengan kode error protocol.http.EmptyPath
  • File rekaman aktivitas untuk permintaan API

Jika Anda adalah pengguna Private Cloud, berikan informasi berikut:

  • Pesan error lengkap yang diamati untuk permintaan yang gagal
  • Nama lingkungan
  • Paket proxy API
  • File rekaman aktivitas untuk permintaan API
  • Log akses NGINX:

    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

    Tempat: ORG, ENV, dan PORT# diganti dengan nilai sebenarnya.

  • Log sistem Pemroses Pesan /opt/apigee/var/log/edge-message- processor/logs/system.log

Referensi

Variabel Alur - target