0Pricing
Java Academy · درس

أجسام الطلبات والترويسات

إرسال بيانات POST وتعيين الترويسات

أجسام الطلبات والترويسات درس مجاني في Java Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Java Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Java Academy 4 دروس في المجموع.

أجسام الطلبات والترويسات

نادرًا ما تحتاج طلبات GET إلى جسم، لكن POST وPUT وPATCH تحتاج إليه. يستخدم عميل HTTP في JDK كائنات BodyPublisher لتوفير أجسام الطلبات، ويوفر أساليب في builder لضبط الترويسات.

يتناول هذا الدرس إرسال البيانات والتحكم في ترويسات مثل Content-Type.

BodyPublishers.ofString

أبسط ناشر هو الذي يرسل جسمًا نصيًا. مرّره إلى الدالة POST(...) في builder الخاص بالطلب.

توجد BodyPublishers.noBody() للطلبات التي لا تحتوي على جسم.

import java.net.URI;
import java.net.http.HttpRequest;
import java.net.http.HttpRequest.BodyPublishers;

public class Main {
    public static void main(String[] args) {
        String json = "{\"name\":\"Ada\"}";
        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("https://example.com/users"))
            .POST(BodyPublishers.ofString(json))
            .build();
        System.out.println("Method: " + request.method());
    }
}

ضبط ترويسة واحدة

استخدم header(name, value) لإضافة ترويسة واحدة. ولإرسال JSON، تضبط عادةً Content-Type.

import java.net.URI;
import java.net.http.HttpRequest;
import java.net.http.HttpRequest.BodyPublishers;

public class Main {
    public static void main(String[] args) {
        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("https://example.com/users"))
            .header("Content-Type", "application/json")
            .POST(BodyPublishers.ofString("{}"))
            .build();
        System.out.println("Has Content-Type: " +
            request.headers().firstValue("Content-Type").isPresent());
    }
}

ضبط عدة ترويسات دفعة واحدة

تضبط headers(name1, value1, name2, value2, ...) عدة ترويسات في استدعاء واحد. يجب أن يكون عدد الوسائط زوجيًا، وإلا فستُرمى IllegalArgumentException.

import java.net.URI;
import java.net.http.HttpRequest;

public class Main {
    public static void main(String[] args) {
        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("https://example.com"))
            .headers(
                "Accept", "application/json",
                "Accept-Language", "en-US")
            .GET()
            .build();
        System.out.println(request.headers().map().keySet());
    }
}

ترويسات التفويض

تُرسل رموز Bearer المميِّزة عبر ترويسة Authorization. أنشئ القيمة كسلسلة نصية، ولا تسجّل الرمز الخام مطلقًا.

public class Main {
    public static void main(String[] args) {
        String token = "abc123";
        String headerValue = "Bearer " + token;
        System.out.println("Authorization: Bearer ***");
        System.out.println("Length: " + headerValue.length());
    }
}

PUT وDELETE

يوفر builder دوال مخصصة: PUT(publisher) وDELETE()، إضافة إلى الدالة العامة method(name, publisher) لأي شيء آخر مثل PATCH.

import java.net.URI;
import java.net.http.HttpRequest;
import java.net.http.HttpRequest.BodyPublishers;

public class Main {
    public static void main(String[] args) {
        HttpRequest patch = HttpRequest.newBuilder()
            .uri(URI.create("https://example.com/users/1"))
            .method("PATCH", BodyPublishers.ofString("{\"active\":true}"))
            .build();
        System.out.println("Method: " + patch.method());
    }
}

الأجسام المشفَّرة بصيغة النموذج

بالنسبة إلى بيانات application/x-www-form-urlencoded، أنشئ سلسلة الجسم يدويًا، مع ترميز كل قيمة في عنوان URL، ثم انشرها كسلسلة نصية.

import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;

public class Main {
    public static void main(String[] args) {
        String body = "name=" + URLEncoder.encode("Ada Lovelace", StandardCharsets.UTF_8)
            + "&role=" + URLEncoder.encode("engineer", StandardCharsets.UTF_8);
        System.out.println(body);
    }
}

إرسال جسم من ملف

تدفق BodyPublishers.ofFile(path) الملف باعتباره جسم الطلب دون تحميله بالكامل إلى الذاكرة، ولذلك فهو مثالي لعمليات الرفع.

import java.net.URI;
import java.net.http.HttpRequest;
import java.net.http.HttpRequest.BodyPublishers;
import java.nio.file.Path;

public class Main {
    public static void main(String[] args) throws Exception {
        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("https://example.com/upload"))
            .header("Content-Type", "application/octet-stream")
            .POST(BodyPublishers.ofFile(Path.of("data.bin")))
            .build();
        System.out.println("Upload request built");
    }
}

أجسام من مصفوفات البايت

عندما تكون البايتات موجودة لديك في الذاكرة، ترسلها BodyPublishers.ofByteArray(byte[]) مباشرةً. ويفيد ذلك في الحمولة الثنائية التي تُنشأ أثناء التشغيل.

import java.nio.charset.StandardCharsets;

public class Main {
    public static void main(String[] args) {
        byte[] payload = "raw-bytes".getBytes(StandardCharsets.UTF_8);
        // BodyPublishers.ofByteArray(payload) would wrap these bytes
        System.out.println("Payload size: " + payload.length + " bytes");
    }
}

الترويسات المقيّدة

لأسباب أمنية، يمنعك العميل من ضبط ترويسات معينة مثل Host وContent-Length وConnection وUpgrade. تؤدي محاولة ضبطها إلى رمي IllegalArgumentException — فالعميل يديرها بنفسه.

تجميع العناصر معًا

يجمع طلب POST المعتاد بتنسيق JSON بين ناشر جسم وترويسة لنوع المحتوى:

  • .POST(BodyPublishers.ofString(json))
  • .header("Content-Type", "application/json")
  • أضف .header("Authorization", "Bearer ...") عند الحاجة

تحقق سريع

اختبر مدى فهمك لأجسام الطلبات والترويسات.

مراجعة

لقد تعلمت إرسال البيانات والتحكم في الترويسات:

  • توفر BodyPublishers.ofString / ofByteArray / ofFile أجسام الطلبات.
  • تحدد POST / PUT / DELETE / method(...) فعل HTTP.
  • تضبط header(...) وheaders(...) ترويسات الطلب.
  • اضبط Content-Type لبيانات JSON وبيانات النماذج، واستخدم Authorization للرموز.
  • بعض الترويسات، مثل Host وContent-Length، مقيّدة ويديرها العميل.

الأسئلة الشائعة

هل درس «أجسام الطلبات والترويسات» مجاني؟

نعم — نص درس «أجسام الطلبات والترويسات» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Java Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Java Academy 4 دروس في المجموع.

ماذا ستتعلم في «أجسام الطلبات والترويسات»؟

إرسال بيانات POST وتعيين الترويسات تتمرن على Java Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Java Academy؟

لا تُشترط خبرة سابقة. Java Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.

كم من الوقت يستغرق درس «أجسام الطلبات والترويسات»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Java Academy هذا؟

نعم. كل درس في Java Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. java.net.http.HttpClient
  2. الطلبات غير المتزامنة
  3. أجسام الطلبات والترويسات
  4. معالجة الاستجابات
← العودة إلى Java Academy