בקשת POST בC# יוצרת שגיאה
-
@soris1989 כתב בבקשת POST בC# יוצרת שגיאה:
@עידו באיזו שפה אתה כותב?
אם זה אתה משתמש באחסון VPS, אז תוכל ללכת לתיקית ה-apache או ngnix ושם יש לוגים של כל הבקשות שנכנסות לשרת.
באחסון שיתופי (shared), אתה יכול להנפיק את קובץ ה-LOG דרך הקוד של השפה שבה אתה כותב, מן הסתם ה-entry point של האפליקציה שלך מקבלת את ה-request שמכיל מידע על הבקשה וה-headers שלה.אני כותב בעיקר C# ואם צריך משתמש בchatgpt לphp או לשאר השפות - כמו שאמרתי, אני לא מתכנת.
בדקתי את הלוגים של השרת ומשום מה הבקשות ששלחתי לא מופיעות שם לא ברור לי למה...
-
@עידו כי זה בקשות ששלחת מהקוד שלך וזה לא אמור לנטר את הבקשות ששלחת מהשרת שלך לשרת של ימות המשיח, אלא להאזין לבקשות שמתקבלות בשרת שלך. במידה ותרצה לנטר גם בקשות שאתה שולח מהקוד שלך, עליך להשתמש ב-logs, יש ספריות מוכנות ב-C# שעושות לך את כל הקטע של logging. תבדוק ב-chatgpt איך לממש את זה בקוד ממש פשוט.
using System; using System.Net.Http; using System.Threading; using System.Threading.Tasks; public class LoggingHandler : DelegatingHandler { public LoggingHandler(HttpMessageHandler innerHandler) : base(innerHandler) { } protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { Console.WriteLine($"[Request] {request.Method} {request.RequestUri}"); // Log Headers foreach (var header in request.Headers) { Console.WriteLine($" {header.Key}: {string.Join(", ", header.Value)}"); } // If there's content, log its headers too if (request.Content != null) { foreach (var header in request.Content.Headers) { Console.WriteLine($" Content-{header.Key}: {string.Join(", ", header.Value)}"); } } var response = await base.SendAsync(request, cancellationToken); Console.WriteLine($"[Response] {response.StatusCode}"); return response; } } class Program { static async Task Main() { var client = new HttpClient(new LoggingHandler(new HttpClientHandler())); var request = new HttpRequestMessage(HttpMethod.Get, "https://jsonplaceholder.typicode.com/posts/1"); request.Headers.Add("Custom-Header", "MyValue"); var response = await client.SendAsync(request); } }
את ה- Console.WriteLine תחליף בספריית LOG
-
@soris1989 כתב בבקשת POST בC# יוצרת שגיאה:
@עידו כי זה בקשות ששלחת מהקוד שלך וזה לא אמור לנטר את הבקשות ששלחת מהשרת שלך לשרת של ימות המשיח, אלא להאזין לבקשות שמתקבלות בשרת שלך. במידה ותרצה לנטר גם בקשות שאתה שולח מהקוד שלך, עליך להשתמש ב-logs, יש ספריות מוכנות ב-C# שעושות לך את כל הקטע של logging. תבדוק ב-chatgpt איך לממש את זה בקוד ממש פשוט.
using System; using System.Net.Http; using System.Threading; using System.Threading.Tasks; public class LoggingHandler : DelegatingHandler { public LoggingHandler(HttpMessageHandler innerHandler) : base(innerHandler) { } protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { Console.WriteLine($"[Request] {request.Method} {request.RequestUri}"); // Log Headers foreach (var header in request.Headers) { Console.WriteLine($" {header.Key}: {string.Join(", ", header.Value)}"); } // If there's content, log its headers too if (request.Content != null) { foreach (var header in request.Content.Headers) { Console.WriteLine($" Content-{header.Key}: {string.Join(", ", header.Value)}"); } } var response = await base.SendAsync(request, cancellationToken); Console.WriteLine($"[Response] {response.StatusCode}"); return response; } } class Program { static async Task Main() { var client = new HttpClient(new LoggingHandler(new HttpClientHandler())); var request = new HttpRequestMessage(HttpMethod.Get, "https://jsonplaceholder.typicode.com/posts/1"); request.Headers.Add("Custom-Header", "MyValue"); var response = await client.SendAsync(request); } }
את ה- Console.WriteLine תחליף בספריית LOG
אני שולח מהמחשב לשרת, לא מהשרת לשרת, לא יודע למה הוא לא מנטר את זה.
אבדוק יותר מאוחר איך לממש את זה, תודה
-
@soris1989 @צדיק-תמים
מבדיקה שלי הוא כן שולח עם הדר של ג'סון.זה הקוד שמחזיר את הבקשה כמו שהיא
<?php header('Content-Type: application/json'); // פונקציה לקבלת גוף הבקשה הגולמי (raw body) function getRawBody() { return file_get_contents('php://input'); } // יצירת מערך עם כל פרטי הבקשה $requestData = [ 'method' => $_SERVER['REQUEST_METHOD'], 'headers' => getallheaders(), 'GET' => $_GET, 'POST' => $_POST, 'FILES' => $_FILES, 'COOKIE' => $_COOKIE, 'raw_body' => getRawBody(), 'server' => $_SERVER, ]; // פלט JSON יפה לקריאה echo json_encode($requestData, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
זה הקוד שחזר (חתכתי את הסוף)
"method": "POST", "headers": { "Content-Type": "application/json; charset=utf-8", "Host": "www.stamandsefer.co.il", "Content-Length": "26555", "Expect": "100-continue", "Connection": "Keep-Alive" }, "GET": [], "POST": [], "FILES": [], "COOKIE": [], "raw_body": "{\"what\":\"ivr2:SaleProducts/sale_products_name.ini\",\"contents\":\"001=\\u05D6\\u05D5\\u05E8\\u05E2 \\u05D5\\u05E7\\u05D5\\u05E6\\u05E8 \\u05D0 \\u05D1\\u05E8\\u05D0\\u05E9\\u05D9\\u05EA \\u05D7\\u05DC\\u05E7 \\u05D0\\r\\n002=\\u05D3\\u05D1\\u05E8 \\u05D1\\u05E2\\u05D9\\u05EA\\u05D5 - \\u05DE\\u05E7\\u05E8\\u05D0\\u05D4 \\u05D0 \\u05DB\\u05D9\\u05EA\\u05D4 \\u05D0\\r\\n003=\\u05E7\\u05DC \\u05DC\\u05DB\\u05EA\\u05D5\\u05D1 \\u05D1\\u05DB\\u05EA\\u05D1 \\u05D0 \\u05D7\\u05DC\\u05E7 1\\r\\n004=\\u05D9\\u05E9 \\u05E4\\u05EA\\u05E8\\u05D5\\u05DF \\u05D7\\u05DC\\u05E7 1\\r\\n005=\\u05D9\\u05E9 \\u05E4\\u05EA\\u05E8\\u05D5\\u05DF \\u05D7\\u05DC\\u05E7 2\\r\\n006=\\u05D9\\u05E9 \\u05E4\\u05EA\\u05E8\\u05D5\\u05DF \\u05D4\\u05E0\\u05D3\\u05E1\\u05D4 \\u05D7\\u05DC\\u05E7 1\\r\\n007=\\u05E1\\u05D9\\u05D3\\u05D5\\u05E8 \\u0022\\u05E2\\u0022\\u0022\\u05DE\\u0022\\r\\n008=\\u05D6\\u05D5\\u05E8\\u05E2 \\u05D5\\u05E7\\u05D5\\u05E6\\u05E8 2\\r\\n009=\\u05D6\\u05D5\\u05E8\\u05E2 \\u05D5\\u05E7\\u05D5\\u05E6\\u05E8 3\\r\\n010=\\u05D7\\u05D5\\u05DE\\u05E9 \\u05E9\\u05DE\\u05D5\\u05EA \\r\\n011=\\u05D7\\u05D5\\u05DE\\u05E9 \\u05D1\\u05E8\\u05D0\\u05E9\\u05D9\\u05EA \\r\\n012=\\u05D3\\u05D1\\u05E8 \\u05D1\\u05E2\\u05D9\\u05EA\\u05D5 - \\u05DE\\u05E7\\u05E8\\u05D0\\u05D4 \\u05DB\\u05D9\\u05EA\\u05D4 \\u05D1\\r\\n013=\\u05E1\\u05D5\\u05D3\\u05D5\\u05EA \\u05D4\\u05DB\\u05EA\\u05D9\\u05D1 \\u05DB\\u05D9\\u05EA\\u05D4 \\u05D1\\r\\n014=\\u05D7\\u05D5\\u05D1\\u05E8\\u05EA \\u05DB\\u05EA\\u05D9\\u05D1\\u05D4 \\u05EA\\u05DE\\u05D4 \\r\\n015=\\u05D1\\u05D9\\u05DF \\u05D4\\u05E9\\u05D5\\u05E8\\u05D5\\u05EA \\u05DB\\u05D9\\u05EA\\u05D4 \\u05D1\\r\\n016=\\u05D9\\u05E9 \\u05E4\\u05EA\\u05E8\\u05D5\\u05DF \\u05D7\\u05DC\\u05E7 1\\r\\n017=\\u05D9\\u05E9 \\u05E4\\u05EA\\u05E8\
-
@עידו אז בסופו של דבר הצלחת לקבל את פרטי ה-request בשליחת בקשה מהמחשב לשרת?
-
@soris1989 כתב בבקשת POST בC# יוצרת שגיאה:
@עידו אז בסופו של דבר הצלחת לקבל את פרטי ה-request בשליחת בקשה מהמחשב לשרת?
כן, הקוד שלמעלה זה תחילת הבקשה שנשלחת לשרת. לכאורה הכל נראה תקין... לא יודע למה מות המשיח עושים בעיות...
-
@עידו כתב בבקשת POST בC# יוצרת שגיאה:
@soris1989 כתב בבקשת POST בC# יוצרת שגיאה:
@עידו אז בסופו של דבר הצלחת לקבל את פרטי ה-request בשליחת בקשה מהמחשב לשרת?
כן, הקוד שלמעלה זה תחילת הבקשה שנשלחת לשרת. לכאורה הכל נראה תקין... לא יודע למה מות המשיח עושים בעיות...
מה הבעיות שהם עושים?
-
@soris1989 כתב בבקשת POST בC# יוצרת שגיאה:
@עידו כתב בבקשת POST בC# יוצרת שגיאה:
@soris1989 כתב בבקשת POST בC# יוצרת שגיאה:
@עידו אז בסופו של דבר הצלחת לקבל את פרטי ה-request בשליחת בקשה מהמחשב לשרת?
כן, הקוד שלמעלה זה תחילת הבקשה שנשלחת לשרת. לכאורה הכל נראה תקין... לא יודע למה מות המשיח עושים בעיות...
מה הבעיות שהם עושים?
מה שדיברנו עד עכשיו, הם לא מזהים את תוכן הבקשה, מבחינתם הbody לא קיים
-
@עידו מה שדיברנו עד עכשיו זה שגיאה בשליחת בקשת POST ב-C#, ב-PHP אין את הבעיה הזו.
תשתמש בפונקציה הבאה:
<?php function sendPostRequest($url, $data, $headers = []) { $ch = curl_init($url); // Convert data to JSON $jsonData = json_encode($data); // Set headers $defaultHeaders = [ 'Content-Type: application/json', 'Content-Length: ' . strlen($jsonData) ]; $headers = array_merge($defaultHeaders, $headers); // cURL options curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // צריך להגדיר כדי שתוכל לשלוח בקשות ללא SSL curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // צריך להגדיר כדי שתוכל לשלוח בקשות ללא SSL curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonData); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); // Execute request $response = curl_exec($ch); // Handle errors if ($response === false) { return "cURL Error: " . curl_error($ch); } curl_close($ch); return $response; }
-
@soris1989 כתב בבקשת POST בC# יוצרת שגיאה:
@עידו מה שדיברנו עד עכשיו זה שגיאה בשליחת בקשת POST ב-C#, ב-PHP אין את הבעיה הזו.
תשתמש בפונקציה הבאה:
<?php function sendPostRequest($url, $data, $headers = []) { $ch = curl_init($url); // Convert data to JSON $jsonData = json_encode($data); // Set headers $defaultHeaders = [ 'Content-Type: application/json', 'Content-Length: ' . strlen($jsonData) ]; $headers = array_merge($defaultHeaders, $headers); // cURL options curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // צריך להגדיר כדי שתוכל לשלוח בקשות ללא SSL curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // צריך להגדיר כדי שתוכל לשלוח בקשות ללא SSL curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonData); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); // Execute request $response = curl_exec($ch); // Handle errors if ($response === false) { return "cURL Error: " . curl_error($ch); } curl_close($ch); return $response; }
גם עכשיו שלחתי בC# רק שבשביל להיות בטוח במה שהhttpclient שולח (ההדר והתוכן) עשיתי עמוד PHP שיחזיר בדיוק את הבקשה שנשלחה, ומהערך שחוזר רואים שהתוכן שנשלח הוא תקין, גם מבחינת ההדר שלו, שהוא של ג'סון ולא משהו אחר