এটি একটি খুব পুরানো পোস্ট তবে আমি একই ধরণের সমস্যার মুখোমুখি হয়েছি এবং আমি আমার অভিজ্ঞতা আপনার সাথে ভাগ করে নিতে চাই।
আমি বাকি এপিআই দিয়ে মাইক্রোসার্চিস আর্কিটেকচার তৈরি করছি। আমার কিছু বিশ্রাম জিইটি পরিষেবা রয়েছে, তারা অনুরোধের পরামিতিগুলির ভিত্তিতে ব্যাক-এন্ড সিস্টেম থেকে ডেটা সংগ্রহ করে।
আমি বাকি এআইপি ডিজাইনের নথিগুলি অনুসরণ করেছি এবং ক্লায়েন্টের কাছে আমি একটি নিখুঁত জেএসওন ত্রুটি বার্তা সহ HTTP 404 ফেরত পাঠিয়েছি যখন এমন কোনও ডেটা নেই যা কোয়েরির শর্তগুলিতে সরে যায় (উদাহরণস্বরূপ শূন্য রেকর্ডটি নির্বাচিত হয়েছিল)।
যখন ক্লায়েন্টকে ফেরত পাঠানোর কোনও ডেটা ছিল না তখন আমি ক্লায়েন্টকে "পাওয়া যায়নি" এর কারণ সম্পর্কে অবহিত করার জন্য অভ্যন্তরীণ ত্রুটি কোড ইত্যাদির সাথে একটি নিখুঁত জেএসওএন বার্তা প্রস্তুত করেছি এবং এটি HTTP 404 সহ ক্লায়েন্টকে ফেরত পাঠানো হয়েছিল That ঠিকভাবে কাজ করে.
পরে আমি একটি বিশ্রাম এপিআই ক্লায়েন্ট তৈরি করেছি যা এইচটিটিপি যোগাযোগ সম্পর্কিত কোডটি আড়াল করার জন্য একটি সহজ সহায়ক এবং আমি যখন আমার কোড থেকে আমার বিশ্রামের এপিআইগুলিকে কল করি তখন আমি এই সহায়কটি ব্যবহার করি।
তবে আমার এই বিভ্রান্তিকর অতিরিক্ত কোডটি লেখার দরকার ছিল কারণ এইচটিটিপি 404 এর দুটি আলাদা ফাংশন ছিল:
- প্রকৃত এইচটিটিপি 404 যখন বাকী এপিআই প্রদত্ত ইউআরএলে উপলব্ধ না হয়, তখন এটি অ্যাপ্লিকেশন সার্ভার বা ওয়েব-সার্ভার দ্বারা ফেলে দেওয়া হয় যেখানে বাকী এপিআই অ্যাপ্লিকেশন চালিত হয়
- ক্লায়েন্ট এইচটিটিপি 404 ফেরত পাবেন যখন কোয়েরির শর্তের ভিত্তিতে ডাটাবেসে কোনও ডেটা নেই।
গুরুত্বপূর্ণ: আমার বিশ্রাম এপিআই ত্রুটি হ্যান্ডলারটি ব্যাক-এন্ড পরিষেবাদিতে উপস্থিত সমস্ত ব্যতিক্রম ধরা পড়ে যার অর্থ যে কোনও ত্রুটির ক্ষেত্রে আমার বাকী এপিআই সর্বদা বার্তাটির বিশদ সহ একটি নিখুঁত জেএসএন বার্তা নিয়ে ফিরে আসে।
এটি আমার ক্লায়েন্ট সহায়ক পদ্ধতির 1 ম সংস্করণ যা দুটি পৃথক HTTP 404 প্রতিক্রিয়া পরিচালনা করে:
public static String getSomething(final String uuid) {
String serviceUrl = getServiceUrl();
String path = "user/" + , uuid);
String requestUrl = serviceUrl + path;
String httpMethod = "GET";
Response response = client
.target(serviceUrl)
.path(path)
.request(ExtendedMediaType.APPLICATION_UTF8)
.get();
if (response.getStatus() == Response.Status.OK.getStatusCode()) {
// HTTP 200
return response.readEntity(String.class);
} else {
// confusing code comes here just because
// I need to decide the type of HTTP 404...
// trying to parse response body
try {
String responseBody = response.readEntity(String.class);
ObjectMapper mapper = new ObjectMapper();
ErrorInfo errorInfo = mapper.readValue(responseBody, ErrorInfo.class);
// re-throw the original exception
throw new MyException(errorInfo);
} catch (IOException e) {
// this is a real HTTP 404
throw new ServiceUnavailableError(response, requestUrl, httpMethod);
}
// this exception will never be thrown
throw new Exception("UNEXPECTED ERRORS, BETTER IF YOU DO NOT SEE IT IN THE LOG");
}
কিন্তু , কারণ আমার জাভা বা জাভাস্ক্রিপ্ট ক্লায়েন্ট দুটি প্রকারের HTTP 404 পেতে পারে কোনওরকমভাবে HTTP 404 এর ক্ষেত্রে আমাকে প্রতিক্রিয়ার শরীরটি পরীক্ষা করতে হবে I আমি যদি প্রতিক্রিয়ার বডিটি পার্স করতে পারি তবে আমি নিশ্চিত যে যেখানে ছিল সেখানে আমি একটি প্রতিক্রিয়া ফিরে পেয়েছি ক্লায়েন্টকে ফেরত পাঠানোর জন্য কোনও ডেটা নেই।
আমি যদি প্রতিক্রিয়াটি পার্স করতে সক্ষম না হয়েছি তার অর্থ আমি ওয়েব সার্ভার (বাকি এপিআই অ্যাপ্লিকেশন থেকে নয়) থেকে একটি আসল এইচটিটিপি 404 ফিরে পেয়েছি।
এটি এত বিভ্রান্তিকর এবং ক্লায়েন্ট অ্যাপ্লিকেশনটির সবসময় HTTP 404 এর আসল কারণ যাচাই করতে অতিরিক্ত পার্সিং করা প্রয়োজন needs
সত্যিই আমি এই সমাধানটি পছন্দ করি না। এটি বিভ্রান্তিকর, সর্বদা ক্লায়েন্টগুলিতে অতিরিক্ত বুলশিট কোড যুক্ত করা দরকার।
সুতরাং এই দুটি পৃথক পরিস্থিতিতে HTTP 404 ব্যবহার করার পরিবর্তে আমি সিদ্ধান্ত নিয়েছি যে আমি নিম্নলিখিতগুলি করব:
- আমি আমার বিশ্রামের অ্যাপ্লিকেশনটিতে আর HTTP 404 প্রতিক্রিয়া হিসাবে HTTP কোড ব্যবহার করছি না।
- আমি HTTP 404 এর পরিবর্তে HTTP 204 (কোনও সামগ্রী নেই) ব্যবহার করতে যাচ্ছি।
সেক্ষেত্রে ক্লায়েন্ট কোডটি আরও মার্জিত হতে পারে:
public static String getString(final String processId, final String key) {
String serviceUrl = getServiceUrl();
String path = String.format("key/%s", key);
String requestUrl = serviceUrl + path;
String httpMethod = "GET";
log(requestUrl);
Response response = client
.target(serviceUrl)
.path(path)
.request(ExtendedMediaType.APPLICATION_JSON_UTF8)
.header(CustomHttpHeader.PROCESS_ID, processId)
.get();
if (response.getStatus() == Response.Status.OK.getStatusCode()) {
return response.readEntity(String.class);
} else {
String body = response.readEntity(String.class);
ObjectMapper mapper = new ObjectMapper();
ErrorInfo errorInfo = mapper.readValue(body, ErrorInfo.class);
throw new MyException(errorInfo);
}
throw new AnyServerError(response, requestUrl, httpMethod);
}
আমি মনে করি এটি এই সমস্যাটিকে আরও ভালভাবে পরিচালনা করে।
আপনার যদি আরও ভাল সমাধান থাকে তবে তা আমাদের সাথে শেয়ার করুন।