ඉල්ලීම් ශරීරය සමඟ HTTP GET


2134

මම අපගේ යෙදුම සඳහා නව RESTful වෙබ් සේවාවක් සංවර්ධනය කරමින් සිටිමි.

ඇතැම් ආයතන පිළිබඳ GET එකක් කරන විට, සේවාදායකයින්ට ආයතනයේ අන්තර්ගතය ඉල්ලා සිටිය හැකිය. ඔවුන්ට පරාමිති කිහිපයක් එකතු කිරීමට අවශ්‍ය නම් (නිදසුනක් ලෙස ලැයිස්තුවක් වර්ග කිරීම) ඔවුන්ට මෙම පරාමිතීන් විමසුම් දාමයට එක් කළ හැකිය.

විකල්පයක් ලෙස ඉල්ලීම් ශරීරයේ මෙම පරාමිතීන් නියම කිරීමට මිනිසුන්ට හැකි වේවා. HTTP / 1.1 මෙය පැහැදිලිවම තහනම් කර ඇති බවක් නොපෙනේ. මෙය ඔවුන්ට තවත් තොරතුරු නියම කිරීමට ඉඩ සලසයි, සංකීර්ණ XML ඉල්ලීම් නියම කිරීම පහසු කරයි.

මගේ ප්‍රශ්න:

  • මෙය මුළුමනින්ම හොඳ අදහසක්ද?
  • GET ඉල්ලීමක් තුළ ඉල්ලීම් සිරුරු භාවිතා කිරීමේදී HTTP සේවාදායකයින්ට ගැටළු තිබේද?

http://tools.ietf.org/html/rfc2616


555
වාසිය නම් XML හෝ JSON ඉල්ලීම් සිරුරු පහසුවෙන් යැවීමට ඉඩ දීම, එයට දිග සීමාවක් නොමැති අතර කේතනය කිරීම පහසුය (UTF-8).
Evert

30
ඔබ පසුපස සිටින්නේ ඉල්ලීම් කරන ආයතනවලට ඉඩ දෙන ආරක්ෂිත සහ අව්‍යාජ ක්‍රමයක් නම්, ඔබට සෙවීම, ප්‍රොෆින්ඩ් සහ වාර්තා කිරීම බැලීමට අවශ්‍ය විය හැකිය. ඇත්ත වශයෙන්ම GET භාවිතා නොකිරීම සහ ඉල්ලීමක් කරන ශරීරයක් තිබීම හැඹිලිය වැඩි වශයෙන් හෝ අඩුවෙන් පරාජය කරයි.
ජූලියන් රෙස්ච්කේ

228
ijfijiaaron: එය වසර 3 කට පසුව, එතැන් සිට මම වෙබ් සේවා ලිවීමේ පුළුල් අත්දැකීම් ලබා ඇත්තෙමි. මූලික වශයෙන් මම පසුගිය අවුරුදු කිහිපය තුළ කරමින් සිටියේ එයයි. මට ආරක්ෂිතව පැවසිය හැකිය, ඇත්ත වශයෙන්ම GET ඉල්ලීමකට ශරීරයක් එක් කිරීම ඉතා නරක අදහසකි. ඉහළම පිළිතුරු දෙක පර්වතයක් මෙන් පෙනේ.
එවර්ට්

27
L එලෙසෙඩිල්: සරලව කිවහොත්: POST හරහා GET භාවිතා කිරීමෙන් ඇති වාසි කුමක් වුවත්, පවතින්නේ HTTP නිර්මාණය කර ඇති ආකාරය නිසා ය. ඔබ මේ ආකාරයෙන් ප්‍රමිතිය උල්ලං when නය කරන විට එම වාසි තවදුරටත් නොපවතී. එබැවින් POST: සෞන්දර්යය වෙනුවට GET + ඉල්ලීම් ආයතනයක් භාවිතා කිරීමට ඉතිරිව ඇත්තේ එක් හේතුවක් පමණි. සෞන්දර්යයට වඩා ශක්තිමත් මෝස්තරයක් කැප නොකරන්න.
එවර්ට්

8
එවර්ට් පැවසූ දේ අවධාරණය කිරීමට: "එයට දිග සීමාවක් නොමැත". විමසුම් පරාමිතීන් සහිත ඔබගේ GET දිග සීමාව (2048 හි) බිඳ දමන්නේ නම්, විමසුම් වචන තොරතුරු json වස්තුවක තැබීම හැර වෙනත් විකල්පයක් තිබේ, උදාහරණයක් ලෙස, ඉල්ලීමේ ශරීරය තුළ.
කීරාන් රයන්

Answers:


1739

GET ඉල්ලීමක් සහිත ශරීරයක් ඇතුළත් කිරීම ගැන රෝයි ෆීල්ඩින්ගේ ප්‍රකාශය .

ඔව්. වෙනත් වචන වලින් කිවහොත්, ඕනෑම HTTP ඉල්ලීම් පණිවිඩයකට පණිවිඩ ශරීරයක් අඩංගු වීමට ඉඩ දී ඇති අතර එමඟින් පණිවිඩ මනසේ තබාගෙන විග්‍රහ කළ යුතුය. කෙසේ වෙතත්, GET සඳහා සේවාදායක අර්ථ නිරූපණයන් සීමා කර ඇති අතර එමඟින් ශරීරයකට ඉල්ලීමට අර්ථකථන අර්ථයක් නොමැත. විග්‍රහ කිරීම පිළිබඳ අවශ්‍යතා ක්‍රම අර්ථ නිරූපණයන්හි අවශ්‍යතාවයන්ගෙන් වෙන් වේ.

ඉතින්, ඔව්, ඔබට GET සමඟ ශරීරයක් යැවිය හැකි අතර, එසේ කිරීම කිසි විටෙකත් ප්‍රයෝජනවත් නොවේ.

මෙය HTTP / 1.1 හි ස්ථර සැකැස්මේ කොටසකි, එය පිරිවිතර කොටස් කළ පසු නැවත පැහැදිලි වනු ඇත (වැඩ කරමින් පවතී).

.... රෝයි

ඔව්, ඔබට GET සමඟ ඉල්ලීම් ආයතනයක් යැවිය හැකි නමුත් එයට කිසිදු අර්ථයක් නොතිබිය යුතුය. ඔබ එය සේවාදායකයේ විග්‍රහ කිරීමෙන් සහ එහි අන්තර්ගතය මත පදනම්ව ඔබේ ප්‍රතිචාරය වෙනස් කිරීමෙන් අර්ථයක් ලබා දෙන්නේ නම්, ඔබ මෙම නිර්දේශය HTTP / 1.1 පිරිවිතර, 4.3 කොටසෙහි නොසලකා හරිනු ලැබේ :

[...] ඉල්ලීම ක්රමය අස්තිත්වයක්-ශරීරය සඳහා අර්ථ semantics ඇතුළත් නොවේ නම්, එසේ නම් එම පණිවිඩය-ශරීරය යුත්තේ ඉල්ලීම සම්බන්ධයෙන් කටයුතු කරන විට පවසනු ලැබේ.

සහ HTTP / 1.1 පිරිවිතරයේ 9.3 වගන්තියේ GET ක්‍රමය පිළිබඳ විස්තරය :

GET ක්‍රමය යනු ඉල්ලීම- URI විසින් හඳුනාගෙන ඇති ඕනෑම තොරතුරක් ([...]) ලබා ගැනීමයි.

එහි සඳහන් වන්නේ ඉල්ලීම්-ශරීරය GET ඉල්ලීමක ඇති සම්පත් හඳුනා ගැනීමේ කොටසක් නොවන බවයි, ඉල්ලීම URI පමණි.

යාවත්කාලීන කිරීම "HTTP / 1.1 පිරිවිතර" ලෙස සඳහන් RFC2616 දැන් යල්පැන ඇත. 2014 දී එය RFCs 7230-7237 මගින් ප්‍රතිස්ථාපනය විය. "ඉල්ලීම හැසිරවීමේදී පණිවිඩ-ශරීරය නොසලකා හැරිය යුතුය" යන උපුටා ගැනීම මකා දමා ඇත. එය දැන් "ඉල්ලීම් පණිවිඩ සැකසීම ක්‍රමවේදය අර්ථ නිරූපණයෙන් ස්වාධීන වේ, ක්‍රමවේදය පණිවුඩ ශරීරයක් සඳහා කිසිදු භාවිතයක් නිර්වචනය නොකළද" 2 වන උපුටා දැක්වීම "GET ක්‍රමය යන්නෙන් අදහස් කරන්නේ ඕනෑම තොරතුරක් ලබා ගැනීමයි ... ඉල්ලීම-යූආර්අයි විසින් හඳුනා ගනු ලැබේ" මකා දමන ලදි. - අදහස් දැක්වීමකින්


73
හැඹිලි / ප්‍රොක්සි යනු ඔබ බොහෝ විට බිඳ දැමිය හැකි කරුණු දෙකයි, ඔව්. “සෙමන්ටික්ස්” යනු “වෙනත් සංරචක සාදන පුද්ගලයින් වෙනත් සංරචක ක්‍රියාත්මක වනු ඇතැයි අපේක්ෂා කරන ආකාරය” යැයි පැවසීමේ තවත් ක්‍රමයකි. ඔබ අර්ථ නිරූපණය උල්ලං If නය කරන්නේ නම්, ඔබ එම අර්ථකථනවලට ගරු කරනු ඇතැයි අපේක්ෂා කළ දේවල් මිනිසුන් ලියූ ස්ථානවල දේවල් කැඩී යනු ඔබ දකිනු ඇත.
ස්ටුවර්ට් පී. බෙන්ට්ලි

109
ඉලාස්ටික්සර්ච් යනු GET හි HTTP ඉල්ලීම් සිරුරු භාවිතා කරන තරමක් ප්‍රධාන නිෂ්පාදනයකි. ඔවුන්ගේ අත්පොතට අනුව, HTTP ඉල්ලීමක් ශරීරයක් තිබීමට සහාය විය යුතුද නැද්ද යන්න නිර්වචනය කර නැත. GET ඉල්ලීම් ආයතනයක් ජනගහනය කිරීම මට පෞද්ගලිකව පහසු නැත, නමුත් ඔවුන්ට වෙනස් මතයක් ඇති බව පෙනේ, ඔවුන් කරන්නේ කුමක්දැයි ඔවුන් දැන සිටිය යුතුය. elastic.co/guide/en/elasticsearch/guide/current/…
ගෝර්ඩන් එම්

27
we අයිවින් විසින් GET ඉල්ලීම් ශරීර ලබා දීම අර්ථය ඇත්ත වශයෙන්ම පිරිවිතර උල්ලං not නය කිරීමක් නොවේ . HTTP / 1.1 මඟින් සේවාදායකයන් ශරීරය නොසලකා හැරිය යුතු බව සඳහන් කරයි, නමුත් RFC 2119 නියම කරන්නේ ක්‍රියාත්මක කිරීමට හොඳ හේතු තිබේ නම් “SHOULD” වගන්ති නොසලකා හැරීමට ක්‍රියාත්මක කරන්නන්ට අවසර දී ඇති බවයි. ඒ වෙනුවට, සේවාලාභී කරන්නේ එය ලබා ගන්න ශරීරය වෙනස් වන බව උපකල්පනය නම්, පිරිවිතර උල්ලංඝනය නොවන ප්රතිචාරය වෙනස්.
එමිල් ලුන්ඩ්බර්ග්

108
"HTTP / 1.1 පිරිවිතර" ලෙස සඳහන් කර ඇති RFC2616 දැන් යල්පැන ඇත. 2014 දී එය RFCs 7230-7237 මගින් ප්‍රතිස්ථාපනය විය. " ඉල්ලීම හැසිරවීමේදී පණිවිඩ-ශරීරය නොසලකා හැරිය යුතුය " යන උපුටා ගැනීම මකා දමා ඇත . එය දැන් " ඉල්ලීම් පණිවිඩ සැකසීම ක්‍රමවේදය අර්ථ නිරූපණයෙන් ස්වාධීන වේ, ක්‍රමවේදය පණිවිඩ ශරීරයක් සඳහා කිසිදු භාවිතයක් නිර්වචනය නොකළද " 2 වන උපුටා දැක්වීම " GET ක්‍රමය යනු ඕනෑම තොරතුරක් ලබා ගැනීමයි ... ඉල්ලීම-යූආර්අයි විසින් හඳුනා ගනු ලැබේ " විය මකා දමන ලදී . එබැවින්, පිළිතුර සංස්කරණය කිරීමට මම යෝජනා කරමි ar ජාර්ල්
ආටෙම් නැකොනෙක්නි

29
එය පැරණි නූලක් බව මම දනිමි - මම එයට බාධා කළෙමි. R ආටෙම් නැකොනෙක්නි තාක්‍ෂණිකව නිවැරදියි, නමුත් නව පිරිවිතරයේ සඳහන් වන්නේ "GET ඉල්ලීම් පණිවිඩයක් තුළ ගෙවීමක් සඳහා අර්ථකථන අර්ථකථනයක් නොමැත; GET ඉල්ලීමක් මත ගෙවුම් ආයතනයක් යැවීම දැනට පවතින සමහර ක්‍රියාත්මක කිරීම් ඉල්ලීම ප්‍රතික්ෂේප කිරීමට හේතු විය හැක." එබැවින් එය වළක්වා ගත හැකි නම් එය තවමත් හොඳ අදහසක් නොවේ.
fastcatch

293

ඔබට එය කළ හැකි අතර, එය HTTP පිරිවිතරයෙන් නිශ්චිතවම බැහැර කර නොමැති හෙයින්, මම යෝජනා කරන්නේ එය එසේ කිරීමට මිනිසුන් බලාපොරොත්තු නොවන නිසා එය වළක්වා ගැනීමට ය. HTTP ඉල්ලීම් දාමයක බොහෝ අදියරයන් ඇති අතර ඒවා "බොහෝ දුරට" HTTP පිරිවිතරයට අනුකූල වන අතර, ඔබට සහතික වී ඇති එකම දෙය නම් ඒවා සම්ප්‍රදායිකව වෙබ් බ්‍රව්සර් විසින් භාවිතා කරනු ඇති බවයි. (මම විනිවිද පෙනෙන ප්‍රොක්සි, ඇක්සලරේටර්, ඒ / වී මෙවලම් කට්ටල ආදිය ගැන සිතමින් සිටිමි)

දළ වශයෙන් මූලධර්මය පිටුපස ඇති ආත්මය මෙයයි. දළ වශයෙන් “ඔබ පිළිගන්නා දෙය තුළ ලිබරල් වන්න, සහ ඔබ යවන දේ තුළ ගතානුගතික වන්න”, හොඳ හේතුවක් නොමැතිව පිරිවිතරයක සීමාවන් තල්ලු කිරීමට ඔබට අවශ්‍ය නැත.

කෙසේ වෙතත්, ඔබට හොඳ හේතුවක් තිබේ නම්, ඒ සඳහා යන්න.


231
ශක්තිමත් කිරීමේ මූලධර්මය දෝෂ සහිතය. ඔබ පිළිගන්නා දෙය තුළ ඔබ ලිබරල් නම්, ඔබ දරුකමට හදා ගැනීම සම්බන්ධයෙන් යම් සාර්ථකත්වයක් ලබා ඇත්නම්, ඔබ කපටිකම පිළිගනු ඇත. එමඟින් ඔබේ අතුරු මුහුණත විකාශනය කිරීම ඔබට අපහසු වනු ඇත. HTML දෙස බලන්න. ක්‍රියාකාරීත්වයේ ප්‍රතිරෝධක මූලධර්මය එයයි.
ඉයුජින් බෙරෙසොව්ස්කි

28
ප්‍රොටෝකෝලයන් සම්මත කර ගැනීමේ (සහ අපයෝජනයේ) සාර්ථකත්වය හා පළල ශක්තිමත් බව පිළිබඳ මූලධර්මයේ වටිනාකමට කථා කරයි.
කැස්කි

39
ඔබ කවදා හෝ සැබෑ HTML විග්‍රහ කිරීමට උත්සාහ කර තිබේද? එය ඔබම ක්‍රියාත්මක කිරීම කළ නොහැක්කකි, ගූගල් (ක්‍රෝම්) සහ ඇපල් (සෆාරි) වැනි විශාල ක්‍රීඩකයන් ද ඇතුළුව සෑම කෙනෙක්ම පාහේ එය නොකළ නමුත් පවතින ක්‍රියාත්මක කිරීම් මත රඳා සිටියහ (අවසානයේ ඔවුන් සියල්ලෝම කේඩීඊ හි කේඑච්ටීඑම්එල් මත රඳා සිටියහ). එම නැවත භාවිතා කිරීම ඇත්තෙන්ම හොඳයි, නමුත් ඔබ .net යෙදුමක html ප්‍රදර්ශනය කිරීමට උත්සාහ කර තිබේද? කළමනාකරණය නොකළ - IE (හෝ ඒ හා සමාන) සංරචකයක් එහි ගැටළු සහ බිඳ වැටීම් සමඟ කාවැද්දිය යුතු බැවින් එය බියකරු සිහිනයකි, නැතහොත් ඔබට පෙළ තෝරා ගැනීමට පවා ඉඩ නොදෙන (කෝඩ්ප්ලෙක්ස් මත) කළමණාකරන සංරචකය භාවිතා කරයි.
ඉයුජින් බෙරෙසොව්ස්කි

6
HTTP පිරිවිතර GET ඉල්ලීම සමඟ ශරීර දත්ත වලට ඉඩ දෙනවා පමණක් නොව, මෙයද සාමාන්‍ය සිරිතකි: ජනප්‍රිය ඉලාස්ටික් සෙවුම් යන්ත්‍රයේ _ සෙවුම් API මඟින් JSON ශරීරයක අමුණා ඇති විමසුම සමඟ GET ඉල්ලීම් නිර්දේශ කරයි. අසම්පූර්ණ HTTP ග්‍රාහක ක්‍රියාත්මක කිරීම් සඳහා සහනයක් ලෙස, එය මෙහි POST ඉල්ලීම් සඳහා ඉඩ ලබා දේ.
ක්‍රිස්ටියන් පීට්ස්

4
H ක්‍රිස්ටියන් පීට්ස්, එය අද සාමාන්‍ය සිරිතකි. අවුරුදු හතරකට පෙර එය එසේ නොවීය. ඉල්ලීමක (7 වන වගන්තිය) විකල්පයක් ඇතුළත් කිරීමට (MAY) පිරිවිතරයට පැහැදිලිවම ඉඩ දී ඇති අතර, MAY හි අර්ථය RFC2119 හි අර්ථ දක්වා ඇති අතර GET ඉල්ලීම්වල ආයතන ඉවත් කරන අතරතුර (කපටි) ප්‍රොක්සි සේවාදායකයක් විශේෂිත අනුකූල විය හැකිය. විශේෂයෙන් එය බිඳ වැටෙන්නේ නැති තාක් කල්, එයට ඉල්ලීම් ශීර්ෂයන් යොමු කිරීමෙන් 'අඩු කළ ක්‍රියාකාරිත්වය' සැපයිය හැකි අතර ඇතුළත් කළ ආයතනය නොවේ. ඒ හා සමානව විවිධ ප්‍රොටොකෝල් මට්ටම් අතර ප්‍රොක්සි කිරීමේදී කුමන අනුවාද වෙනස්වීම් කළ යුතුද / කළ යුතුද / කළ යුතුද යන්න පිළිබඳ නීති රාශියක් තිබේ.
කැස්කි

153

හැඹිලියෙන් ප්‍රයෝජන ගැනීමට ඔබ කවදා හෝ උත්සාහ කළහොත් ඔබට ගැටලු ඇති වේ. පරාමිතීන් ප්‍රතිචාරයට බලපෑමක් ඇති කරන්නේ දැයි බැලීමට ප්‍රොක්සි GET ශරීරය දෙස බැලීමට යන්නේ නැත.


10
ETag / අවසන්-වෙනස් කරන ලද ශීර්ෂ ක්ෂේත්‍ර භාවිතා කිරීම මේ ආකාරයට උපකාරී වේ: “කොන්දේසි සහිත GET” භාවිතා කරන විට, ප්‍රොක්සි / හැඹිලි වලට මෙම තොරතුරු මත ක්‍රියා කළ හැකිය.
jldupont

2
oldjldupont හැඹිලි වලංගු ප්‍රතිචාරයක් නැවත වලංගු කළ හැකිදැයි දැන ගැනීමට වලංගු කරන්නන් සිටීම භාවිතා කරයි, කෙසේ වෙතත් ඒවා ප්‍රාථමික හෝ ද්විතීයික හැඹිලි යතුරේ කොටසක් ලෙස භාවිතා නොවේ.
ඩැරල් මිලර්

විමසුම් පරාමිතියකින් ශරීරයේ චෙක්සමකින් ඔබට එය නිවැරදි කළ හැකිය
ඒඩ්‍රියන් මැයි

73

වත් restclient හෝ බෝපාල් කොන්සෝලය සහයෝගය නමුත් curl කරන්නේ.

මෙම HTTP පිරිවිතර 4.3 කොටසේ පවසයි

ඉල්ලීම් ක්‍රමයේ පිරිවිතරයන් (5.1.1 වගන්තිය) ඉල්ලීම් තුළ වස්තුවක්-ශරීරයක් යැවීමට ඉඩ නොදෙන්නේ නම් පණිවිඩ-ශරීරයක් ඉල්ලීමකට ඇතුළත් නොකළ යුතුය.

5.1.1 වගන්තිය විවිධ ක්‍රම සඳහා 9.x කොටස වෙත අපව හරවා යවයි. ඔවුන්ගෙන් කිසිවෙකු පණිවුඩ ශරීරයක් ඇතුළත් කිරීම පැහැදිලිවම තහනම් කරයි. කෙසේවෙතත්...

5.2 වගන්තියේ සඳහන් වේ

අන්තර්ජාල ඉල්ලීමකින් හඳුනාගත් නිශ්චිත සම්පත තීරණය වන්නේ ඉල්ලීම්-යූආර්අයි සහ සත්කාරක ශීර්ෂ ක්ෂේත්‍රය යන දෙකම පරීක්ෂා කිරීමෙනි.

සහ 9.3 වගන්තියේ සඳහන් වේ

GET ක්‍රමය යනු ඉල්ලීම-යූආර්අයි විසින් හඳුනාගත් ඕනෑම තොරතුරක් (වස්තුවක ස්වරූපයෙන්) ලබා ගැනීමයි.

GET ඉල්ලීමක් සැකසීමේදී, ඉල්ලීම්- URI සහ ධාරක ශීර්ෂ ක්ෂේත්‍රය හැර වෙනත් කිසිවක් පරීක්ෂා කිරීමට සේවාදායකයෙකුට අවශ්‍ය නොවන බව මෙයින් යෝජනා කරයි .

සාරාංශයක් ලෙස, HTTP පිරිවිතර මඟින් ඔබට GET සමඟ පණිවුඩයක් යැවීම වළක්වන්නේ නැත, නමුත් ප්‍රමාණවත් අපැහැදිලි බවක් ඇත, එය සියලු සේවාදායකයන්ගේ සහය නොදක්වන්නේ නම් එය මා පුදුමයට පත් නොකරනු ඇත.


2
සිරුරු සමඟ GET ඉල්ලීම් සඳහා සහය දැක්වීමට Paw හට විකල්පයක් ඇති නමුත් එය සැකසුම් තුළ සක්‍රීය කළ යුතුය.
s.Daniel

"GET ක්‍රමය යනු ඉල්ලීම-යූආර්අයි විසින් හඳුනාගත් ඕනෑම තොරතුරක් (වස්තුවක ස්වරූපයෙන්) ලබා ගැනීමයි." එසේ නම්, සියලු ආයතන ලබා ගන්නා GET අන්ත ලක්ෂ්‍යයක් තිබීම තාක්‍ෂණිකව නීති විරෝධීද / වැරදිද? උදා: GET /contacts/100/addressesපුද්ගලයා සමඟ ලිපින එකතුවක් ලබා දෙයි id=100.
ජොෂ් එම්

REST API පරීක්‍ෂා කිරීම සඳහා ඉතිරිව ඇති ජාවා පුස්තකාලය ශරීරයක් සමඟ GET ඉල්ලීමට සහාය නොදක්වයි. Apache HttpClient ද එයට සහාය නොදක්වයි.
පාවුලෝ මර්සන්

ජැන්ගෝ විසින් GET ශරීරයක් විග්‍රහ කිරීමට ද සහාය වේ
un නෝ ෆින්ගර්

60

ප්‍රත්‍යාස්ථ සෙවුම ශරීරයක් සමඟ GET ඉල්ලීම් පිළිගනී. මෙය වඩාත් කැමති ක්‍රමය බව පෙනේ: ප්‍රත්‍යාස්ථතා මාර්ගෝපදේශය

සමහර ග්‍රාහක පුස්තකාලවලට (රූබි ඩ්‍රයිවර් වැනි) අ cry න්න විධානය සංවර්ධන මාදිලියේ ස්ථානගත කිරීම සඳහා ලොග් කළ හැකි අතර එය මෙම වාක්‍ය ඛණ්ඩය පුළුල් ලෙස භාවිතා කරයි.


5
ඉලාස්ටික්සර්ච් මෙයට ඉඩ දෙන්නේ මන්දැයි කල්පනා කරමින් සිටියේය. එයින් අදහස් වන්නේ ගෙවීම් සහිතව සියලුම ලිපි ලේඛන GET ඉල්ලීමකට ගණන් කිරීම සඳහා වන විමසුම, ගෙවීම් භාරය පරාමිතිය curl -XGET 'http://localhost:9200/_count?pretty' -d ' { "query": { "match_all": {} } }' ලෙස ඇතුළත් කිරීමට සමාන වේ source: curl -XGET 'http://localhost:9200/_count?pretty&source=%7B%22query%22%3A%7B%22match_all%22%3A%7B%7D%7D%7D'
අරුන්

40
සංකීර්ණ විමසුම් වලට http ශීර්ෂයේ උපරිම දිගට පහර දිය හැකිය.
s.Daniel

11
ශරීරයක් ඇතුළත් කිරීම නරක පුරුද්දක් ලෙස මා සිතූ පරිදි මෙම ප්‍රශ්නයට මා ගෙන ගියේ ප්‍රත්‍යාස්ථතා ලේඛන කියවීමයි
පැට්‍රික් වෝකර්

1
එය සංකීර්ණ විමසුමක් වීමට පවා අවශ්‍ය නොවේ. සරල අනුචලනයකට පවා ඉතා දිගු අනුචලන_අයිඩියක් (බොහෝ කැබලි සහිත පොකුරක් තුළ) ආපසු ලබා දිය හැකි අතර, එහි එකතු කළ හොත් උපරිම url දිග ඉක්මවා යාමට එය හේතු වේ.
බ්‍රෙන්ට් හ්‍රොනික්

12
ඉලාස්ටික්සර්ච් POST භාවිතා කරමින් එකම ඉල්ලීමට සහය දක්වයි. ඔවුන් GET එකක ශරීරයකට ඉඩ දීමට තෝරා ගත්තේ දත්ත විමසීමේදී POST ට වඩා GET වඩා අර්ථාන්විත ලෙස නිවැරදි යැයි ඔවුන්ට හැඟුණු බැවිනි. එහි විහිළුව නම් ඉලාස්ටික්සර්ච් මෙම ත්‍රෙඩ් එකේ බොහෝ දේ සඳහන් කර තිබීමයි. පුහුණුවීම අනුගමනය කිරීමට හේතුවක් ලෙස මම එක් උදාහරණයක් (ජනප්‍රිය නිෂ්පාදනයක් වුවද) භාවිතා නොකරමි.
DSO

33

ඔබ සාක්ෂාත් කර ගැනීමට උත්සාහ කරන දෙය දීර් common කාලයක් තිස්සේ වඩාත් පොදු ක්‍රමවේදයකින් සිදු කර ඇති අතර GET සමඟ ගෙවීමක් භාවිතා කිරීම මත රඳා නොපවතින එකක්.

ඔබට සරලවම ඔබේ නිශ්චිත සෙවුම් මාධ්‍යය ගොඩනගා ගත හැකිය, නැතහොත් ඔබට වඩාත් RESTful වීමට අවශ්‍ය නම්, OpenSearch වැනි දෙයක් භාවිතා කරන්න, සහ සේවාදායකයා උපදෙස් දුන් URI වෙත ඉල්ලීම තැපැල් කරන්න, කියන්න / සොයන්න. එවිට සේවාදායකයාට සෙවුම් ප්‍රති result ල ජනනය කිරීමට හෝ අවසාන යූආර්අයි ගොඩනඟා 303 භාවිතා කර යළි හරවා යැවිය හැකිය.

සාම්ප්‍රදායික පීආර්ජී ක්‍රමය අනුගමනය කිරීමේ වාසිය මෙය වන අතර, හැඹිලි අතරමැදියන්ට ප්‍රති results ල හැඹිලිගත කිරීමට උපකාරී වේ.

ඒ අනුව, ASCII නොවන ඕනෑම දෙයක් සඳහා URIs කෙසේ හෝ කේතනය කර ඇති අතර යෙදුම / x-www-form-urlencoded සහ බහුපාර්ට් / පෝරම-දත්ත ද වේ. ඔබේ අභිප්‍රාය ReSTful අවස්ථාවන්ට සහය දැක්වීම නම් තවත් අභිරුචි json ආකෘතියක් නිර්මාණය කරනවාට වඩා මෙය භාවිතා කිරීමට මම නිර්දේශ කරමි.


4
ඔබට නිශ්චිත සෙවුම් මාධ්‍යයක් ගොඩනගා ගත හැකිය ඔබට විස්තාරණය කළ හැකිද?
පියොටර් ඩොබ්‍රොගොස්ට්

2
එයින් මම කියා සිටියේ ඔබට සේවාදායකයකු නිකුත් කිරීමට අවශ්‍ය ආකාරයේ සෙවුම් අච්චු අඩංගු යෙදුම් / vnd.myCompany.search + json නමින් මාධ්‍ය වර්ගයක් නිර්මාණය කළ හැකි බවත්, එවිට සේවාදායකයාට එය POST ලෙස යැවිය හැකි බවත්ය. මා ඉස්මතු කර ඇති පරිදි, ඒ සඳහා දැනටමත් මාධ්‍ය වර්ගයක් ඇති අතර එය OpenSearch ලෙස හැඳින්වේ, පවතින ප්‍රමිතීන් සමඟ ඔබේ තත්වය ක්‍රියාත්මක කළ හැකි විට පවතින මාධ්‍ය වර්ගයක් නැවත භාවිතා කිරීම අභිරුචි මාර්ගයට ඉහළින් තෝරා ගත යුතුය.
SerialSeb

14
එය දක්ෂ, නමුත් ඕනෑවට වඩා සංකීර්ණ හා අකාර්යක්ෂමයි. දැන් ඔබට ඔබගේ සෙවුම් නිර්ණායක සමඟ POST යැවිය යුතුය, ඔබේ POST වෙතින් ප්‍රතිචාරයක් ලෙස URI එකක් ලබා ගන්න, ඉන්පසු සෙවුම් නිර්ණායකයන් සහිත GET එකක් URI සේවාදායකයට යවන්න. (යූආර්අයි හි යූආර්අයි ඇතුළත් කිරීම තාක්‍ෂණිකව කළ නොහැකි දෙයක් හැර, ඔබට අක්ෂර 255 ට වඩා වැඩි යමක් අක්ෂර 255 ට නොඅඩු යමක් යැවිය නොහැකි නිසා - එබැවින් ඔබට අර්ධ හඳුනාගැනීමක් සහ ඔබේ සේවාදායකය භාවිතා කළ යුතුය. ඔබගේ POSTed සෙවුම් නිර්ණායක සඳහා URI විසඳන්නේ කෙසේදැයි දැන ගැනීමට අවශ්‍ය වේ.)
fijiaaron

30

ඔබට ශරීරයක් සමඟ GET එකක් යැවිය හැකිය, නැතහොත් POST යවා නැවත ආගම්වාදය අත්හරින්න (එය එතරම් නරක නැත, මීට වසර 5 කට පෙර එම ඇදහිල්ලේ එක් සාමාජිකයෙකු පමණක් සිටියේය - ඔහුගේ අදහස් ඉහත සම්බන්ධ කර ඇත).

මේ දෙකම හොඳ තීරණ නොවේ, නමුත් GET ශරීරයක් යැවීම සමහර සේවාදායකයින්ට සහ සමහර සේවාදායකයින්ට ගැටළු වළක්වා ගත හැකිය.

POST කිරීම සමහර RESTish රාමු සමඟ බාධක ඇති විය හැකිය.

ජූලියන් රෙස්ච්කේ ඉහත යෝජනා කළේ “සෙර්ච්” වැනි සම්මත නොවන එච්ටීටීපී ශීර්ෂයක් භාවිතා කිරීම සඳහා අලංකාර විසඳුමක් විය හැකි අතර එය සහාය වීමට ඇති ඉඩකඩ අඩුය.

ඉහත එක් එක් කළ හැකි හා කළ නොහැකි සේවාදායකයින් ලැයිස්තුගත කිරීම වඩාත් tive ලදායී විය හැකිය.

ශරීරය සමඟ GET යැවිය නොහැකි සේවාදායකයින් (මා දන්නා):

  • XmlHTTPRequest Fiddler

ශරීරය සමඟ GET යැවිය හැකි සේවාදායකයින්:

  • බොහෝ බ්‍රව්සර්

GET වෙතින් ශරීරයක් ලබා ගත හැකි සේවාදායක සහ පුස්තකාල:

  • අපාචි
  • PHP

GET වෙතින් ශරීරයක් ඉවත් කරන සේවාදායකයන් (සහ ප්‍රොක්සි):

  • ?

2
අන්තර්ගත දිග 0 හෝ සකසා නොමැති විට දැල්ලන් 3.1.6 GET සිරුරු ඉවත් කරයි, එසේ
නොමැතිනම්

2
ෆිද්ලර් කැමති නමුත් එය ඔබට අනතුරු අඟවයි.
toddmo

ඔබ කියන්නේ SEARCHක්‍රමවේදයක් මඟ දිගේ කැඩී යා හැකි බවයි? ප්‍රොක්සිවරුන්ට ක්‍රමයක් තේරෙන්නේ නැත්නම්, ඔවුන් එය එලෙසම සම්මත කර ගනු ඇතැයි අපේක්ෂා කෙරේ, එබැවින් එය කිසිවක් බිඳ දමනු ඇතැයි ඔබ සිතන්නේ මන්දැයි මට විශ්වාස නැත ...
ඇලෙක්සිස් විල්කේ

22

කුමන සේවාදායකයා එය නොසලකා හරිනු ඇත්ද? - fijiaaron අගෝස්තු 30 '12 at 21:27

උදාහරණයක් ලෙස ගූගල් එය නොසලකා හැරීමට වඩා නරක දෙයක් කරයි, එය දෝෂයක් ලෙස සලකනු ඇත !

සරල නෙට් කැට් එකකින් එය ඔබම උත්සාහ කරන්න:

$ netcat www.google.com 80
GET / HTTP/1.1
Host: www.google.com
Content-length: 6

1234

(1234 අන්තර්ගතය CR-LF අනුගමනය කරයි, එබැවින් එය බයිට් 6 කි)

එවිට ඔබට ලැබෙනු ඇත:

HTTP/1.1 400 Bad Request
Server: GFE/2.0
(....)
Error 400 (Bad Request)
400. That’s an error.
Your client has issued a malformed or illegal request. That’s all we know.

AkamaiGhost විසින් සපයනු ලබන Bing, Apple, ආදියෙන් ඔබට නරක ඉල්ලීම් 400 ක් ලැබෙනු ඇත.

එබැවින් ශරීර ආයතනයක් සමඟ GET ඉල්ලීම් භාවිතා කිරීමට මම උපදෙස් නොදෙමි.


67
මෙම උදාහරණය අර්ථ විරහිත වන්නේ සාමාන්‍යයෙන් මිනිසුන් GETඉල්ලීම් වලට ශරීරය එක් කිරීමට යන විට , එයට හේතුව ඔවුන්ගේ අභිරුචි සේවාදායකයට එය හැසිරවිය හැකි බැවිනි. ප්‍රශ්නය වන්නේ අනෙක් “චලනය වන කොටස්” (බ්‍රව්සර්, හැඹිලි ආදිය) නිසියාකාරව ක්‍රියාත්මක වේද යන්නයි.
පැසීරියර්

6
මෙය නරක ඉල්ලීමක් වන්නේ ඔබේ ගෙවීම් GET විශේෂිත අන්ත ලක්ෂ්‍යයක් සඳහා අපේක්ෂා නොකරන (හෝ සංවේදී) නිසා - එය GETසාමාන්‍ය නඩුවේ භාවිතයට කිසිදු සම්බන්ධයක් නැත . නිශ්චිත ඉල්ලීමෙහි සන්දර්භය තුළ අර්ථවත් වන ආකෘතියක අන්තර්ගතය නොතිබුනේ නම් අහඹු POSTගෙවීමක් පහසුවෙන් බිඳ දැමිය හැකි අතර එය නැවත 400 Bad Requestලබා දිය හැකිය.
නොබාර්

හා පමණක් නොව බව අන්ත ලක්ෂ්යය මත සමස්තයක් ලෙස, ඒ වෙනුවට, එම නිශ්චිත URL එක මත .
ලෝරන්ස් ඩොල්

1
මෙය අදාළ නොවේ, මන්ද එය එම URL හි ගූගල් සේවාදායකය ක්‍රියාත්මක කිරීම පමණි. එබැවින් ප්‍රශ්නයට තේරුමක් නැත
ජොයෙල් ඩක්වර්ත්

මට එය ප්‍රයෝජනවත් විය, මම ඉල්ලීම් + ශරීරයක් සමඟ ෆයර්බේස් කාර්යයන් භාවිතා කිරීමට උත්සාහ කළ අතර, මෙම දෝෂය ඉතා ගුප්ත හා තේරුම් ගැනීමට අපහසු විය හැකිය.
scrimau

22

මම මෙම ප්‍රශ්නය IETF HTTP WG වෙත යොමු කළෙමි. රෝයි ෆීල්ඩින් (1998 දී http / 1.1 ලේඛනයේ කතුවරයා) ගේ අදහස එයයි

"... ලැබුනහොත් එම සිරුර විග්‍රහ කිරීම සහ ඉවත දැමීම හැර වෙනත් දෙයක් කිරීමට ක්‍රියාත්මක කිරීමක් කැඩී යනු ඇත"

RFC 7213 (HTTPbis) මෙසේ පවසයි:

"GET ඉල්ලීම් පණිවිඩයක් තුළ ගෙවීම් සඳහා අර්ථකථන අර්ථකථන නොමැත;"

GET ඉල්ලීම් සිරුරු පිළිබඳ අර්ථකථන අර්ථය තහනම් කර ඇති බව දැන් පැහැදිලිව පෙනේ, එයින් අදහස් කරන්නේ ප්‍රති request ලයට බලපෑම් කිරීමට ඉල්ලීම් ශරීරය භාවිතා කළ නොහැකි බවයි.

ඔබ GET හි ශරීරයක් ඇතුළත් කළහොත් ඔබගේ ඉල්ලීම විවිධ ආකාරවලින් අනිවාර්යයෙන්ම බිඳ දැමිය හැකි ප්‍රොක්සි තිබේ .

එබැවින් සාරාංශයක් ලෙස, එය නොකරන්න.


19

සිට RFC 2616, කොටස 4.3 , "පණිවිඩ":

සේවාදායකයෙක් ඕනෑම ඉල්ලීමක් මත පණිවිඩයක් කියවා ඉදිරියට යැවිය යුතුය; ඉල්ලීම් ක්‍රමයට වස්තු-ශරීරයක් සඳහා අර්ථ දක්වා ඇති අර්ථකථන ඇතුළත් නොවේ නම්, ඉල්ලීම හැසිරවීමේදී පණිවිඩ-ශරීරය නොසලකා හැරිය යුතුය.

එනම්, සේවාදායකයින් සෑම විටම ජාලයෙන් ලබා දී ඇති ඕනෑම ඉල්ලීම් ආයතනයක් කියවිය යුතුය (අන්තර්ගතයේ දිග පරීක්ෂා කරන්න හෝ කැඩුණු සිරුරක් කියවන්න). එසේම, ප්‍රොක්සි විසින් තමන්ට ලැබෙන එවැනි ඉල්ලීම් ආයතනයක් ඉදිරිපත් කළ යුතුය. දී ඇති ක්‍රමය සඳහා ශරීරය සඳහා අර්ථ නිරූපණය RFC විසින් අර්ථ දක්වන්නේ නම්, ප්‍රතිචාරයක් ජනනය කිරීමේදී සේවාදායකයාට ඉල්ලීම් ශරීරය භාවිතා කළ හැකිය. කෙසේ වෙතත්, නේවාසික විදේශ ව්යවහාර මුදල් නම් නැත ශරීරය සඳහා semantics නිර්වචනය, එසේ නම් සේවාදායකය එය නොසලකා යුතුය.

මෙය ඉහත ෆීල්ඩින් වෙතින් උපුටා දැක්වීමට අනුකූල වේ.

9.3 , “GET”, GET ක්‍රමයේ අර්ථ නිරූපණයන් විස්තර කරන අතර ඉල්ලීම් ආයතන සඳහන් නොකරයි. එබැවින්, GET ඉල්ලීමක් මත සේවාදායකයාට ලැබෙන ඕනෑම ඉල්ලීම් ආයතනයක් නොසලකා හැරිය යුතුය.


9.5 , “POST” වගන්තියේ ද ඉල්ලීම් සිරුරු සඳහන් නොවේ, එබැවින් මෙම තර්කනය දෝෂ සහිතය.
කාර්ලූවා

9
ArCarLuva POST අංශය පවසන්නේ "මුල් සේවාදායකය විසින් සංවෘත කොට ඇති දේ පිළිගන්නා ලෙස ඉල්ලා සිටීමට POST ක්‍රමය භාවිතා කරයි ..." වස්තු ශරීර අංශය පවසන්නේ "වස්තුව-ශරීරය ලබාගෙන ඇත්තේ පණිවිඩ-ශරීරයෙන් ..." එබැවින්, POST කොටසේ පණිවුඩ ශරීරය ගැන සඳහන් වේ, වක්‍රව POST ඉල්ලීමෙහි පණිවුඩ ආයතනය විසින් ගෙන යනු ලබන ආයතන ශරීරය යොමු කිරීමෙනි.
frederickf

9

ඔබට සැබවින්ම කැචබල් කළ හැකි JSON / XML බොඩි වෙබ් යෙදුමට යැවීමට අවශ්‍ය නම් ඔබේ දත්ත තැබිය හැකි එකම ස්ථානය RFC4648 සමඟ කේතනය කර ඇති විමසුම් දාමයකි: Base 64 URL සමඟ කේතීකරණය සහ ගොනු නාමය ආරක්ෂිත හෝඩිය . ඇත්ත වශයෙන්ම ඔබට JSON යූරෙන්කෝඩ් කර URL පරාමිතික අගයට දැමිය හැකිය, නමුත් Base64 කුඩා ප්‍රති .ල ලබා දෙයි. URL ප්‍රමාණයේ සීමාවන් ඇති බව මතක තබා ගන්න, බලන්න විවිධ බ්‍රව්සර්වල URL එකක උපරිම දිග කුමක්ද? .

=URL හි පරමාදර්ශී අගයට Base64 හි පෑඩින්ග් චරිතය නරක යැයි ඔබ සිතනු ඇත , කෙසේ වෙතත් එය නොපෙනේ - මෙම සාකච්ඡාව බලන්න: http://mail.python.org/pipermail/python-bugs-list/2007- පෙබරවාරි / 037195.html . කෙසේ වෙතත්, ඔබ පරාමිතික නාමයකින් තොරව කේතනය කළ දත්ත නොතැබිය යුතුය. මම ඒ වගේ දෙයක් පාවිච්චි කරනවා ?_b64=<encodeddata>.


මම හිතන්නේ මෙය ඉතා නරක අදහසක් :) නමුත් මම මේ වගේ දෙයක් කරන්නේ නම්, මම ඒ වෙනුවට අභිරුචි HTTP ශීර්ෂයක් භාවිතා කරමි (තවද මම සෑම විටම වෙනස් ලෙස ආපසු යවන බවට වග බලා ගන්න: ප්‍රතිචාරයේදී).
එවර්ට්

නරක හෝ කළ නොහැකි නමුත් කළ හැකි දේ :) ශීර්ෂයේ ඇති දත්ත සමඟ දත්ත ප්‍රමාණය හා සමාන ගැටළුවක් තිබේ නම්, stackoverflow.com/questions/686217/… බලන්න . කෙසේ වෙතත් Varyශීර්ෂකය සඳහන් කිරීම ගැන ස්තූතියි , එහි සැබෑ විභවය ගැන මා දැන සිටියේ නැත.
ගර්ටාස්

9

XMLHttpRequest ට අනුව එය වලංගු නොවේ. සිට සම්මත :

4.5.6 send()ක්රමය

client . send([body = null])

ඉල්ලීම ආරම්භ කරයි. විකල්ප තර්කය මඟින් ඉල්ලීම් ආයතනය සපයයි. ඉල්ලීමේ ක්‍රමය GETහෝ නම් තර්කය නොසලකා හරිනු ලැබේ HEAD.

InvalidStateErrorඑක්කෝ රාජ්‍යය විවෘත කර නොමැති නම් හෝ send()ධජය සකසා ඇත්නම් ව්‍යතිරේකය විසි කරයි .

මෙම ක්රමය මෙම පියවර ක්රියාත්මක විය යුතුය:send(body)

  1. රාජ්යය විවෘත කර නොමැති නම් , InvalidStateErrorව්යතිරේකයක් විසි කරන්න .
  2. send()ධජය සකසා ඇත්නම් , InvalidStateErrorව්‍යතිරේකයක් විසි කරන්න .
  3. ඉල්ලීමේ ක්‍රමය GETහෝ නම් HEAD, ශරීරය ශුන්‍ය ලෙස සකසන්න .
  4. නම් ශරීරය ශූන්ය වේ, ඊළඟ පියවර වෙත යන්න.

කෙසේ වෙතත්, GET ඉල්ලීමට විශාල ශරීර අන්තර්ගතයක් අවශ්‍ය විය හැකි යැයි මම නොසිතමි.

එබැවින්, ඔබ බ්‍රව්සරයක XMLHttpRequest මත විශ්වාසය තබන්නේ නම්, එය ක්‍රියා නොකරනු ඇත.


1
XMLHttpRequest ක්‍රියාත්මක කිරීමක් වන නිසා පහත හෙලනු ලැබේ. එය ක්‍රියාත්මක කිරීමට බලාපොරොත්තු වන සත්‍ය පිරිවිතරයන් එය පිළිබිඹු නොකරනු ඇත.
floum

10
ඉහත සඳහන් කළ වැරැද්ද වැරදියි, සමහර ක්‍රියාත්මක කිරීම් GET සමඟ ශරීරයක් යැවීමට සහාය නොදක්වන්නේ නම්, එය පිරිවිතරයන් නොසලකා එය නොකිරීමට හේතුවක් විය හැකිය. මම වැඩ කරන හරස් වේදිකා නිෂ්පාදනයක් තුළ ඇත්ත වශයෙන්ම මෙම නිශ්චිත ගැටලුවට මුහුණ දුන්නෙමි - XMLHttpRequest භාවිතා කරන වේදිකාව පමණක් ලබා ගැනීමට අපොහොසත් විය.
pjcard

6

මම මෙය අවවාද නොකරමි, එය සම්මත භාවිතයන්ට පටහැනි වන අතර, එතරම් ප්‍රතිලාභයක් ලබා නොදේ. ඔබට අවශ්‍ය වන්නේ ශරීරය අන්තර්ගතය සඳහා තබා ගැනීම මිස විකල්පයන් නොවේ.


5

පදනම් නොවන 64 කේතනය කළ ශීර්ෂයන් ගැන කුමක් කිව හැකිද? "SOMETHINGAPP-PARAMS: sdfSD45fdg45 / aS"

දිග සීමාවන් hm. ඔබගේ POST හැසිරවීම අර්ථයන් අතර වෙනස හඳුනා ගැනීමට ඔබට නොහැකිද? වර්ග කිරීම වැනි සරල පරාමිතීන් ඔබට අවශ්‍ය නම්, මෙය ගැටළුවක් වන්නේ මන්දැයි මම නොදනිමි. මම හිතන්නේ ඔබ කනස්සල්ලට පත්ව සිටින බව සහතිකයි.


x-උපසර්ගය සමඟ ඔබට අවශ්‍ය ඕනෑම පරාමිතියක් යැවිය හැකිය , ශීර්ෂ වල දිගෙහි ඕනෑම සීමාවක් මුළුමනින්ම සේවාදායක අත්තනෝමතික සීමාවක් වනු ඇත.
ක්‍රිස් මාරිසික්

4

ප්‍රොටෝකෝලය ලෙස REST OOP සඳහා සහය නොදක්වන බව මට කණගාටුයි Get ක්‍රමවේදය සනාථ කිරීම . විසඳුමක් ලෙස, ඔබට ඔබේ ඩීටීඕ එකක් JSON වෙත අනුක්‍රමික කර විමසුම් නූලක් සෑදිය හැකිය. සේවාදායක පැත්තෙන් ඔබට විමසුම් දාමය ඩීටීඕ වෙත යොමු කළ හැකිය.

බලන්න:

Get method limit විසඳීමට පණිවුඩ පදනම් කරගත් ප්‍රවේශය ඔබට උපකාරී වේ. ඉල්ලීම් ආයතනය මෙන් ඔබට ඕනෑම ඩීටීඕ එකක් යැවිය හැකිය

නෙලිබර් වෙබ් සේවා රාමුව මඟින් ඔබට භාවිතා කළ හැකි ක්‍රියාකාරිත්වය සපයයි

var client = new JsonServiceClient(Settings.Default.ServiceAddress);
var request = new GetClientRequest
    {
        Id = new Guid("2217239b0e-b35b-4d32-95c7-5db43e2bd573")
    };
var response = client.Get<GetClientRequest, ClientResponse>(request);

as you can see, the GetClientRequest was encoded to the following query string

http://localhost/clients/GetWithResponse?type=GetClientRequest&data=%7B%22Id%22:%2217239b0e-b35b-4d32-95c7-5db43e2bd573%22%7D

8
ඔබ POST භාවිතා කළ යුතුය. යූආර්එල් හි ක්‍රම නාමයක් තිබේ නම්, ඔබ මූලික විවේක සැලසුම උල්ලං are නය කරයි. මෙය RPC, POST භාවිතා කරන්න.
එවර්ට් කරන්න

3
එය විශාල ගනුදෙනුවක් යැයි මම නොසිතමි, RESTful url (එනම් ඇණවුම් / 1) සමඟ සංවර්ධනයේදී අපට තවත් ගැටළු තිබේ. මට නම්, Get ක්‍රමයේ යම්කිසි වැරැද්දක්, එය OOP සමඟ නොගැලපේ. යූආර්එල් පෙනුම කෙබඳුදැයි සැලකිලිමත් වන්නේ කවුද :) නමුත් පණිවිඩ පදනම් කරගත් ප්‍රවේශයකින් අපට ස්ථාවර දුරස්ථ අතුරු මුහුණතක් නිර්මාණය කළ හැකි අතර එය ඇත්තෙන්ම වැදගත් ය. PS එය RPC නොවේ, එය පණිවුඩය පදනම් කරගත්
GSerjo

3
මම හිතන්නේ ඔබට REST හි සමස්ත කරුණම මග හැරී ඇත. ඔබ පවසන විට, යූආර්එල් පෙනුම කෙබඳුදැයි සැලකිලිමත් වන්නේ කවුද, හොඳින් REST සැලකිලිමත් වේ, බොහෝ දේ. REST OOP සමඟ අනුකූල වන්නේ ඇයි?
shmish111

නැත, මම තව ටිකක් දුටුවේ නැත
GSerjo

4

උදාහරණයක් ලෙස, එය Curl, Apache සහ PHP සමඟ ක්‍රියා කරයි.

PHP ගොනුව:

<?php
echo $_SERVER['REQUEST_METHOD'] . PHP_EOL;
echo file_get_contents('php://input') . PHP_EOL;

කොන්සෝල විධානය:

$ curl -X GET -H "Content-Type: application/json" -d '{"the": "body"}' 'http://localhost/test/get.php'

ප්‍රතිදානය:

GET
{"the": "body"}

විනෝද අත්හදා බැලීම! PHP කියවනු $_POSTලබන්නේ POST ඉල්ලීමකින් ශරීරය යවන විට පමණි application/x-www-form-urlencoded. ඒ කියන්නේ GETඉල්ලීමකින් ශරීරය නොසලකා හරිනු ලැබේ . මෙම අවස්ථාවේ දී: $_GETසහ $_POSTකෙසේ වෙතත් මෙම අවස්ථාවේදී ඉතා නොමඟ යවන සුළුය. එබැවින් වඩා හොඳ භාවිතයphp://input
මාටින් මුසැට්කෝ

3

IMHO ඔබට JSONසංකේතාත්මක (එනම්. encodeURIComponent) යවනු ලැබිය හැකිය URL, මේ ආකාරයෙන් ඔබ HTTPපිරිවිතර උල්ලං do නය නොකර ඔබේ JSONසේවාදායකයට ලබා ගත හැකිය .


28
ඔව්, නමුත් ප්‍රධාන ගැටළුව වන්නේ දිග සීමාවයි, අපි එය සමඟ කටයුතු කරන්නේ කෙසේද?
සෙබාස්

3

GET සමඟ ඉල්ලීම් ආයතනයක් භාවිතා කිරීමට වඩා හොඳ විකල්ප ලැයිස්තුවක් ඔබ සතුව ඇත.

එක් එක් කාණ්ඩය සඳහා ඔබට කාණ්ඩ සහ අයිතම ඇති බව උපකල්පනය කරමු. දෙකම හැඳුනුම්පතකින් හඳුනාගත යුතුය (මෙම උදාහරණය සඳහා "catid" / "itemid"). නිශ්චිත "අනුපිළිවෙලකට" "sortby" යන තවත් පරාමිතියකට අනුව වර්ග කිරීමට ඔබට අවශ්‍යය. ඔබට "sortby" සහ "order" සඳහා පරාමිතීන් සම්මත කිරීමට අවශ්‍යය:

ඔයාට පුළුවන්:

  1. විමසුම් නූල් භාවිතා කරන්න, උදා example.com/category/{catid}/item/{itemid}?sortby=itemname&order=asc
  2. මාර්ග සඳහා mod_rewrite (හෝ ඊට සමාන) භාවිතා කරන්න: example.com/category/{catid}/item/{itemid}/{sortby}/{order}
  3. ඉල්ලීම සමඟ ඔබ සමත් තනි HTTP ශීර්ෂ භාවිතා කරන්න
  4. සම්පතක් ලබා ගැනීමට වෙනත් ක්‍රමයක් භාවිතා කරන්න, උදා: POST.

සියල්ලටම ඒවායේ අවාසි ඇත, නමුත් ශරීරයක් සමඟ GET භාවිතා කිරීමට වඩා හොඳය.


0

ජනප්‍රිය මෙවලමක් මෙය භාවිතා කළත්, මෙම පිටුවේ නිතර සඳහන් කර ඇති පරිදි, පිරිවිතරයෙන් තහනම් කර නොතිබුණද, එය තවමත් විදේශීය වීම තරමක් නරක අදහසක් යැයි මම සිතමි.

බොහෝ අතරමැදි යටිතල ව්‍යුහයන් එවැනි ඉල්ලීම් ප්‍රතික්ෂේප කළ හැකිය.

උදාහරණයක් වන විට, මේ වගේ, ඔබේ වෙබ් අඩවිය ඉදිරිපිට තිබෙන පස්වරුවේදී පහරදී තිබේ සමහර භාවිතා කරන ආකාරය පිළිබඳව අමතක එක් :

නරඹන්නාගේ GETඉල්ලීමට ශරීරයක් ඇතුළත් නම්, CloudFront විසින් HTTP තත්ව කේතය 403 (තහනම්) නරඹන්නාට ලබා දෙයි.

ඔව්, මෙම අදහස් දැක්වීමේදී වාර්තා කර ඇති පරිදි ඔබේ සේවාදායක පුස්තකාල එවැනි ඉල්ලීම් විමෝචනය කිරීමට සහාය නොදක්වයි .


0

මම මගේ සේවාදායක වැඩසටහනේ වසන්ත රාමුවේ රෙස්ට් ටෙම්ප්ලේට් භාවිතා කරන අතර, සේවාදායක පැත්තෙන්, මම ජේසන් බොඩි සමඟ GET ඉල්ලීමක් අර්ථ දැක්වුවෙමි. මගේ මූලික පරමාර්ථය ඔබේ අරමුණු වලට සමාන ය: ඉල්ලීමට පරාමිතීන් රාශියක් ඇති විට, ඒවා ශරීරයේ තැබීම දිගු URI නූලට දැමීමට වඩා පිළිවෙලට පෙනේ. ඔව්?

නමුත්, කනගාටුවට කරුණක් නම්, එය ක්‍රියාත්මක නොවීමයි! සේවාදායක පාර්ශවය පහත සඳහන් ව්‍යතිරේකය විසි කළේය:

org.springframework.http.converter.HttpMessageNotReadableException: අවශ්‍ය ඉල්ලීම් ශරීරය අස්ථානගත වී ඇත ...

නමුත් මට විශ්වාසයි පණිවුඩ ශරීරය මගේ සේවාදායක කේතය මගින් නිවැරදිව ලබා දී ඇති බව, එබැවින් වැරැද්ද කුමක්ද?

මම RestTemplate.exchange () ක්‍රමයට පිවිස පහත සඳහන් දේ සොයා ගතිමි.

// SimpleClientHttpRequestFactory.class
public class SimpleClientHttpRequestFactory implements ClientHttpRequestFactory, AsyncClientHttpRequestFactory {
    ...
    protected void prepareConnection(HttpURLConnection connection, String httpMethod) throws IOException {
        ...
        if (!"POST".equals(httpMethod) && !"PUT".equals(httpMethod) && !"PATCH".equals(httpMethod) && !"DELETE".equals(httpMethod)) {
            connection.setDoOutput(false);
        } else {
            connection.setDoOutput(true);
        }
        ...
    }
}

// SimpleBufferingClientHttpRequest.class
final class SimpleBufferingClientHttpRequest extends AbstractBufferingClientHttpRequest {
    ...
    protected ClientHttpResponse executeInternal(HttpHeaders headers, byte[] bufferedOutput) throws IOException {
        ...
        if (this.connection.getDoOutput() && this.outputStreaming) {
            this.connection.setFixedLengthStreamingMode(bufferedOutput.length);
        }

        this.connection.connect();
        if (this.connection.getDoOutput()) {
            FileCopyUtils.copy(bufferedOutput, this.connection.getOutputStream());
        } else {
            this.connection.getResponseCode();
        }
        ...
    }
}

ExecuteInternal () ක්‍රමයේදී ආදාන තර්කය 'bufferedOutput' හි මගේ කේතය මඟින් සපයන ලද පණිවිඩ ශරීරය අඩංගු බව කරුණාවෙන් සලකන්න. මම එය නිදොස්කරණය හරහා දුටුවෙමි.

කෙසේ වෙතත්, සූදානම් වීමේ සම්බන්ධතාවය () හේතුවෙන්, ක්‍රියාත්මක කිරීමේ ඉන්ටර්නල් () හි getDoOutput () සෑම විටම අසත්‍යයක් ලබා දෙන අතර එමඟින් ස්වාරක්ෂක ප්‍රතිදානය සම්පූර්ණයෙන්ම නොසලකා හරිනු ඇත! එය ප්‍රතිදාන ප්‍රවාහයට පිටපත් නොවේ.

එහි ප්‍රති, ලයක් වශයෙන්, මගේ සේවාදායක වැඩසටහනට පණිවිඩ පණිවිඩයක් නොලැබුණු අතර එම ව්‍යතිරේකය විසි කළේය.

මෙය වසන්ත රාමුවේ RestTemplate පිළිබඳ උදාහරණයකි. කාරණය වන්නේ, පණිවුඩ ආයතනය තවදුරටත් HTTP පිරිවිතරයෙන් තහනම් කර නොතිබුණද, සමහර සේවාදායකයින් හෝ සේවාදායක පුස්තකාල හෝ රාමු තවමත් පැරණි පිරිවිතරයන්ට අනුකූල විය හැකි අතර GET ඉල්ලීමෙන් පණිවිඩ ශරීරය ප්‍රතික්ෂේප කළ හැකිය.


ඔබ මෙහි පිරිවිතර හෝ අදහස් නිවැරදිව කියවන්නේ නැත. ශරීරය ඉල්ලීම පහත වැටේ සේවාදායකයින් සහ සේවාදායක වේ පිරිවිතර තුළ. GET ඉල්ලීම් සිරුරු භාවිතා නොකරන්න.
එවර්ට්

Ver එවර්ට් මම අදහස් නිවැරදිව කියවා නැතිද? :) ඔබ පෝල් මෝගන්ගේ පිළිතුරට (ඉහළම පහර දෙන පිළිතුර) අනුචලනය කර අදහස් හොඳින් කියවා බැලුවහොත් ඔබට මෙය වැටහෙනු ඇත: "HTTP / 1.1 පිරිවිතර" ලෙස සඳහන් කර ඇති RFC2616 දැන් යල්පැන ඇත. 2014 දී එය ප්‍රතිස්ථාපනය විය RFCs 7230-7237. "ඉල්ලීම හැසිරවීමේදී පණිවුඩය-ශරීරය නොසලකා හැරිය යුතුය" යන යෙදුම මකා දමා ඇත. එය දැන් "පණිවිඩ පණිවිඩයක් සැකසීම ක්‍රමවේදය අර්ථ නිරූපණයන්ගෙන් ස්වාධීන වේ. ... "
ෂෝ

Ver එවර්ට්, මම මගේ වසන්ත-ඇරඹුම් පසුබිම පරීක්ෂා කිරීම සඳහා “විවේක-සහතික” REST පරීක්ෂණ උපයෝගීතාව භාවිතා කරමින් සිටියෙමි. GET ඉල්ලීම සඳහා විවේක-සහතික සහ වසන්ත-ඇරඹුම් සේවාදායකය යන දෙකම Json ශරීරය තබා ගත්හ! GET ඉල්ලීම් වලින් ශරීරය පහත වැටෙන්නේ ස්පින්ග්-රාමුවේ රෙස්ට් ටෙම්ප්ලේට් පමණි, එබැවින් වසන්ත-ඇරඹුම, විවේක-සහතිකය සහ රෙස්ට් ටෙම්ප්ලේට්, වැරදියි / වැරදිද?
ෂෝ

Vert අන්තිම නමුත් බදු නොදී, GET ඉල්ලීම් සඳහා ශරීරය භාවිතා කරන ලෙස මම මිනිසුන්ගෙන් ඉල්ලා සිටියේ නැත, ඊට පටහැනිව, මම යෝජනා කළේ ස්පින්ග්-රාමුවේ රෙස්ට් ටෙම්ප්ලේට් හි ප්‍රභව කේතය විශ්ලේෂණය කිරීමෙන් එසේ නොකරන ලෙසයි, එබැවින් ඔබ මගේ ඡන්දය අඩු කළේ ඇයි? පිළිතුර?
ෂෝ

මම ඔබේ පිළිතුර අවතක්සේරු කළේ නැහැ. මම ඕනෑම HTTP ක්රියාත්මක ලබා ගන්න ඉල්ලීමක් පහත වැටේ බව පැහැදිලි කරනවා වේ පිරිවිතර දී.
එවර්ට්
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.