JQuery.ajax এ 'অ্যাপ্লিকেশন / জসন' তে সামগ্রী-প্রকার সেট করা যায় না


106

যখন আমার এই কোডটি হবে

$.ajax({
    type: 'POST',
    //contentType: "application/json",
    url: 'http://localhost:16329/Hello',
    data: { name: 'norm' },
    dataType: 'json'
});

ফিডলারের মধ্যে আমি নিম্নলিখিত কাঁচা অনুরোধটি দেখতে পাচ্ছি

POST http://localhost:16329/Hello HTTP/1.1
Host: localhost:16329
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:10.0.2) Gecko/20100101 Firefox/10.0.2
Accept: application/json, text/javascript, */*; q=0.01
Accept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Referer: http://localhost:14693/WebSite1/index.html
Content-Length: 9
Origin: http://localhost:14693
Pragma: no-cache
Cache-Control: no-cache

name=norm

তবে আমি যা চেষ্টা করছি তা হ'ল অ্যাপ্লিকেশন / x-www-form-urlencoded থেকে অ্যাপ্লিকেশন / জসন থেকে সামগ্রী-প্রকার সেট করা । কিন্তু এই কোড

$.ajax({
    type: "POST",
    contentType: "application/json",
    url: 'http://localhost:16329/Hello',
    data: { name: 'norm' },
    dataType: "json"
});

অদ্ভুত অনুরোধ উত্পন্ন করে (যা আমি ফিডলারের মধ্যে দেখতে পাচ্ছি)

OPTIONS http://localhost:16329/Hello HTTP/1.1
Host: localhost:16329
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:10.0.2) Gecko/20100101 Firefox/10.0.2
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
Origin: http://localhost:14693
Access-Control-Request-Method: POST
Access-Control-Request-Headers: content-type
Pragma: no-cache
Cache-Control: no-cache

তা কেন? অপশনটি যখন সেখানে পোস্ট করা উচিত? এবং আমার কনটেন্ট-টাইপটি অ্যাপ্লিকেশন / জসন এ সেট করা আছে? এবং অনুরোধের প্যারামিটারগুলি কোনও কারণে চলে গেছে।

আপডেট 1

সার্ভারে আমার সত্যিই সহজ RESTful পরিষেবা আছে।

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class RestfulService : IRestfulService
{
    [WebInvoke(
        Method = "POST",
        UriTemplate = "Hello",
        ResponseFormat = WebMessageFormat.Json)]
    public string HelloWorld(string name)
    {
        return "hello, " + name;
    }
}

তবে কোনও কারণে আমি পরামিতিগুলির সাথে এই পদ্ধতিটি কল করতে পারি না।

আপডেট 2

এত দিন উত্তর না দেওয়ার জন্য দুঃখিত।

আমি এই সার্ভারগুলিকে আমার সার্ভার প্রতিক্রিয়াতে যুক্ত করেছি

 Access-Control-Allow-Origin: *
 Access-Control-Allow-Headers: Content-Type
 Access-Control-Allow-Methods: POST, GET, OPTIONS

এটি সাহায্য করেনি, আমার কাছে পদ্ধতিটি সার্ভার থেকে ত্রুটি অনুমোদিত নয়

আমার ফিডলার যা বলে তা এখানে

এখানে চিত্র বর্ণনা লিখুন

সুতরাং, এখন আমি নিশ্চিত হতে পারি যে আমার সার্ভার পোষ্ট, জিইটি, বিকল্পগুলি গ্রহণ করে (যদি প্রতিক্রিয়ার শিরোনামগুলি আমার প্রত্যাশা মতো কাজ করে)। তবে কেন "পদ্ধতির অনুমতি নেই"?

সার্ভার থেকে ওয়েবভিউ প্রতিক্রিয়াতে (আপনি উপরের ছবিতে কাঁচা প্রতিক্রিয়া দেখতে পাবেন ) দেখতে এটির মতো লাগে

এখানে চিত্র বর্ণনা লিখুন


2
আপনার JSON.stringfy () পদ্ধতিটি ব্যবহার করা উচিত
অমৃতপাল সিং

এখানে দেখুন. এটি আমার পক্ষে খুব ভালভাবে কাজ করে: স্ট্যাকওভারফ্লো.com
জিজ্ঞাসা

আমার ঠিক একই সমস্যা রয়েছে, তবে আমি নোডজেএসের সাথে ব্যাকএন্ড হিসাবে কাজ করছি, আমি সমস্ত অপশন অনুরোধগুলি কেবল গ্রহণ করার জন্যই স্থির করি নি তবে সমস্ত বিকল্পের অনুরোধের জন্য 200 জবাব জোর করে চাপিয়ে দেওয়ার জন্য বাকী আবেদনগুলি প্রত্যাশার মতো কাজ করে কোনও প্রতিক্রিয়া ছাড়াই ...
হেবারএলজেড

1
হাই @ ভিটালিইকর্সাকভ আপনি আপনার সমস্যার সমাধান হয়েছে? আমি একই সমস্যাটি পূরণ করি, অর্থাৎ কন্টেন্ট টাইপ পরিবর্তন করতে পারি না।
ওয়ার্ল্ডমিটারেটর

1
আমারও একই সমস্যা ছিল এবং ঠিক এটি কাজ করে চলেছি .. সমাধানটি এই পৃষ্ঠায় উত্তরের মধ্যে রয়েছে: stackoverflow.com/questions/20295080/… .. সংক্ষিপ্তসারটি বলতে: "কন্টেন্ট টাইপ করার সময়: 'অ্যাপ্লিকেশন / জেসন' আপনি করবেন pop _POST জনবহুল হওয়ার উপর নির্ভর করতে সক্ষম হবেন না $ _POST কেবল ফর্ম-এনকোডযুক্ত সামগ্রী ধরণের জন্যই পপুলেটেড such যেমন, আপনাকে পিএইচপি কাঁচা ইনপুট থেকে আপনার ডেটা পড়তে হবে ".. আমি এখন দেখছি আপনি সার্ভারে পিএইচপি ব্যবহার করছেন না পার্শ্ব তবে আশা করি এই তথ্যটি কোনওভাবে সহায়তা করবে।
সারা

উত্তর:


91

দেখে মনে হবে http://url বিকল্প থেকে অপসারণ সঠিক HTTP পোষ্ট শিরোনাম প্রেরণ করা নিশ্চিত করে।

আমি মনে করি না যে আপনাকে হোস্টের নামটি পুরোপুরি যোগ্য করে তোলা দরকার, কেবল নীচের মতো একটি সম্পর্কিত URL ব্যবহার করুন।

   $.ajax({
      type: "POST",
      contentType: "application/json",
      url: '/Hello',
      data: { name: 'norm' },
      dataType: "json"
   });

আমার কাজ করে যা একটি উদাহরণ:

        $.ajax({
            type: "POST",
            url: siteRoot + "api/SpaceGame/AddPlayer",
            async: false,
            data: JSON.stringify({ Name: playersShip.name, Credits: playersShip.credits }),
            contentType: "application/json",
            complete: function (data) {
            console.log(data);
            wait = false;
        }
    });

সম্ভবত সম্পর্কিত: jQuery aj .জ্যাক্স (), $। ফায়ারফক্সে REQUEST_METHOD হিসাবে "বিকল্পগুলি" পাঠানো হয়েছে

সম্পাদনা করুন: আরও কিছু গবেষণার পরে আমি জানতে পেরেছি যে অপশন শিরোনামটি উত্সাহিত ডোমেন থেকে অনুরোধ অনুমোদিত কিনা তা জানতে ব্যবহৃত হয়। ফিডলার ব্যবহার করে, আমি আমার সার্ভার থেকে প্রতিক্রিয়া শিরোনামগুলিতে নিম্নলিখিতগুলি যুক্ত করেছি।

 Access-Control-Allow-Origin: *
 Access-Control-Allow-Headers: Content-Type
 Access-Control-Allow-Methods: POST, GET, OPTIONS

ব্রাউজারটি এই প্রতিক্রিয়াটি পেয়ে গেলে এটি জসন ডেটার সাথে সঠিক পোস্টের অনুরোধটি প্রেরণ করে। দেখে মনে হবে ডিফল্ট ফর্ম-urlncoded সামগ্রী প্রকারটি নিরাপদ হিসাবে বিবেচিত হয় এবং তাই অতিরিক্ত ক্রস ডোমেন চেকের মধ্য দিয়ে যায় না।

দেখে মনে হচ্ছে আপনার বিকল্পগুলির অনুরোধটির জন্য আপনার সার্ভারের প্রতিক্রিয়ায় পূর্বে উল্লিখিত শিরোনামগুলি যুক্ত করতে হবে। আপনার অবশ্যই অবশ্যই তাদের নির্দিষ্ট ডোমেনগুলির চেয়ে অনুরোধগুলি মঞ্জুর করার জন্য কনফিগার করা উচিত all

এটি পরীক্ষা করার জন্য আমি নীচের jQuery ব্যবহার করেছি।

$.ajax({
   type: "POST",
   url: "http://myDomain.com/path/AddPlayer",
   data: JSON.stringify({
      Name: "Test",
       Credits: 0
   }),
   //contentType: "application/json",
   dataType: 'json',
   complete: function(data) {
       $("content").html(data);
  }
});​

তথ্যসূত্র:


আমি ক্লায়েন্ট এবং সার্ভারের মধ্যে কাপলিং শিথিল করতে চাই। সার্ভারটি বিশ্রামের পরিষেবা এবং এই পরিষেবার সমস্ত ক্লায়েন্টকে এটির url জানা উচিত know
ভিটালি কুরসাকভ

আপনি কি এই প্রশ্নের পরিস্থিতি সম্পর্কে আপনার পোস্টে আরও কিছু বিশদ সরবরাহ করতে পারেন? যদি আপনার ক্লায়েন্টরা বিভিন্ন ডোমেনে চলেছে, আপনি একই উত্সের সমস্যাগুলির মুখোমুখি হতে পারেন।
মাইক ওয়েড

আমি সার্ভার সাইড সম্পর্কে অতিরিক্ত তথ্য পোস্ট করেছি। এখনই সার্ভার এবং ক্লায়েন্ট উভয় লোকালহোস্টে তবে পোর্টে পৃথক। পরে তারা সম্ভবত বিভিন্ন ডোমেনে থাকবে।
ভিটালি কোর্সাকভ

দেখে মনে হচ্ছে আপনি যে সমস্যাটির মুখোমুখি হচ্ছেন তা হ'ল একই উত্স নীতি নিয়ে করা, এটি জাসনপ এবং আমি যে উত্তরটি যুক্ত করেছি সেগুলি এই লিঙ্কগুলি - সম্পর্কিত প্রশ্ন ছাড়াও আমার উত্তরে যুক্ত হওয়া উচিত । jquery ক্রস ডোমেন গাইড - ক্রস ডোমেন অনুরোধগুলির সাথে আমার অনেক অভিজ্ঞতা নেই তবে আশা করি সেই লিঙ্কগুলি আপনার কাজে আসবে।
মাইক ওয়েড

আমি মনে করি না যে এটি একটি সমস্যা কারণ আমি যখন কোনও পরামিতিগুলি পাস করি না এবং বিষয়বস্তুর ধরণটি অ্যাপ্লিকেশন / x-www-form-urlencoded হয় তখন সবকিছু ঠিকঠাক হয়। আমি কোনও পরামিতি পাস করতে না পারলে আমার পোষ্ট অনুরোধের দরকার নেই।
ভাইটালি কোর্সাকভ

41

আমি আপনাকে এটি কীভাবে ব্যবহার করেছি তা দেখাতে পারি

  function GetDenierValue() {
        var denierid = $("#productDenierid").val() == '' ? 0 : $("#productDenierid").val();
        var param = { 'productDenierid': denierid };
        $.ajax({
            url: "/Admin/ProductComposition/GetDenierValue",
            dataType: "json",
            contentType: "application/json;charset=utf-8",
            type: "POST",
            data: JSON.stringify(param),
            success: function (msg) {
                if (msg != null) {
                    return msg.URL;
                }
            }
        });
    }

পরের উত্তরে একই জিনিস। আমি সার্ভারে url নির্দিষ্ট করতে পারি না যেখানে সমস্ত পরিষেবা ফাংশন হোস্ট করা হয়
ভিটালি কোর্সাকভ

@ ভিটালিকির্সাকভ আমি চলে গেলাম, আপনার সমস্যা সমাধান করেছেন?
অমৃতপাল সিং

উত্তর করার জন্য ধন্যবাদ! আমি বিশ্বাস করতে পারি না এটি অন্য কোথাও বানান নয়। এটি নিশ্চিতভাবে মনে হয় যে আপনি যে ধরণের
ধরণটি 'জসন' করেন তখন জিকুয়েরি জাসনকে

1
@ জেসনগোম্যাট jQuery এ ডেটা টাইপ প্যারামিটারটি কেবল প্রত্যাবর্তিত প্রতিক্রিয়ার বডিটি পার্স করতে ব্যবহৃত হয়। আপনি যদি ডকুমেন্টেশনটি পড়েন তবে আপনি দেখতে পাবেন যে এটির প্রয়োজনও নেই। ডেটা টাইপের জন্য ডিফল্ট মান হ'ল বুদ্ধিমান অনুমান। আপনার সমস্যাটি হ'ল jquery এ ডেটা অ্যাট্রিবিউট কনফিগারযোগ্য নয়। কীভাবে jquery ডেটা অবজেক্টকে পার্স করা উচিত তা আপনি বলতে পারবেন না। এজন্য আপনাকে আগে জসনকে সিরিয়ালাইজ করতে হবে। কারণ jquery কেবল url-form-encode এ সিরিয়ালাইজ করেছে
Lo --c Faure-Lacroix

12

সুতরাং এটির কাজ করার জন্য আপনার যা করতে হবে তা হ'ল যুক্ত:

headers: {
    'Accept': 'application/json',
    'Content-Type': 'application/json'
}

আপনার পোস্টের অনুরোধের ক্ষেত্র হিসাবে এবং এটি কাজ করবে।


api.jquery.com/jquery.ajax আপনি যদি ডকুমেন্টেশনে সন্ধান করেন তবে এটি বলছে যে এটি 'প্রয়োগ / x-www-form- urlencoded এ ডিফল্ট উল্লেখ না করে; চরসেট = ইউটিএফ -8 '(এ কারণেই এটি হচ্ছে। কেন কেবলমাত্র কন্টেন্ট টাইপ সেট করা কাজ করে না কেন you আপনার কী jQuery এর সংস্করণ রয়েছে তা যাচাই করতে পারেন এবং আপনি যদি কোনও পুরানো সংস্করণে থাকেন তবে আপডেট করতে পারেন)।
কোডি জ্যাক

এটি কাজ করছে না। আমার কাছে থাকলেও type: "POST"এটি পাঠাচ্ছে OPTIONS
user9645

5

আমি সেই পর্দাগুলি সনাক্ত করেছিলাম, আমি কোডফ্লুয়েট এন্টিটিস ব্যবহার করছি এবং আমারও সমাধান হয়েছে এমন সমাধান পেয়েছি।

আমি এই নির্মাণ ব্যবহার করছি:

$.ajax({
   url: path,
   type: "POST",
   contentType: "text/plain",
   data: {"some":"some"}
}

যেমন আপনি দেখতে পাচ্ছেন, যদি আমি ব্যবহার করি

contentType: "",

অথবা

contentType: "text/plain", //chrome

সবকিছু ঠিকঠাক কাজ করে।

আমি 100% নিশ্চিত নই যে আপনার যা প্রয়োজন তা হ'ল কারণ আমিও শিরোনাম পরিবর্তন করেছি।


5

আপনি যদি এটি ব্যবহার করেন:

contentType: "application/json"

AJAX সার্ভারে জিইটি বা পোষ্ট প্যারামগুলি প্রেরণ করবে না .... কেন জানি না।

আজ এটি শিখতে আমার ঘন্টা সময় লেগেছে।

শুধু ব্যবহার করুন:

$.ajax(
  { url : 'http://blabla.com/wsGetReport.php',
    data : myFormData, type : 'POST', dataType : 'json', 
    // contentType: "application/json", 
    success : function(wsQuery) { }
  }
)

1
দুঃখের সাথে আমার জন্য সঠিক উত্তর। কন্টেন্ট টাইপ ছাড়ুন এবং অনেকগুলি পরিষেবা ঠিকমতো প্রয়োগ করে না এমন কর্স বিকল্পগুলি আবর্জনাকে বাইপাস করতে কেবল ডাটা টাইপ ব্যবহার করুন। খুব বিরক্তিকর.
उमোপিসডন

2

আমি এখানে এই সমস্যার সমাধান খুঁজে পেয়েছি । আইআইএস অ্যাপ্লিকেশন পরিষেবা হ্যান্ডলারের ক্রিয়াকলাপ বিকল্পগুলির অনুমতি দিতে ভুলবেন না।

ঠিকভাবে কাজ করে. ধন্যবাদ আন্দ্রে পেদ্রোসো। :-)


1

আমারো একই ইস্যু ছিল. আমি একটি jboss সার্ভারে জাভা রেস্ট অ্যাপ চালাচ্ছি। তবে আমি মনে করি সমাধানটি একটি এএসপি। নেট ওয়েব অ্যাপে অনুরূপ।

ফায়ারফক্স আপনার সার্ভার / রেস্ট ইউআরএলকে প্রাক কল করে যা অপশনগুলি অনুমোদিত কিনা তা পরীক্ষা করে। এটিই "অপশনগুলি" অনুরোধ যা আপনার সার্ভারটি সেই অনুযায়ী জবাব দেয় না। যদি এই বিকল্পগুলির কলটি সঠিকভাবে জবাব দেওয়া হয় তবে একটি দ্বিতীয় কল করা হয় যা জসন সামগ্রী সহ প্রকৃত "পোষ্ট" অনুরোধ।

ক্রস-ডোমেন কল করার সময় এটি ঘটে happens আপনার ক্ষেত্রে http://localhost:16329/Helloএকই ডোমেনে '/ হ্যালো' এর অধীনে url পাথ কল করার পরিবর্তে ' ' কল করা

যদি আপনি ক্রস ডোমেন কল করার উদ্দেশ্যে থাকেন তবে আপনাকে একটি বিশিষ্ট পদ্ধতির সাহায্যে আপনার বিশ্রাম পরিষেবা শ্রেণিটি বাড়িয়ে তুলতে হবে যা একটি "বিকল্প" HTTP অনুরোধ সমর্থন করে। এটি সেই অনুযায়ী জাভা বাস্তবায়ন:

@Path("/rest")
public class RestfulService {

    @POST
    @Path("/Hello")
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.TEXT_PLAIN)
    public string HelloWorld(string name)
    {
        return "hello, " + name;
    }

//THIS NEEDS TO BE ADDED ADDITIONALLY IF MAKING CROSS-DOMAIN CALLS

    @OPTIONS
    @Path("/Hello")
    @Produces(MediaType.TEXT_PLAIN+ ";charset=utf-8")
    public Response checkOptions(){
        return Response.status(200)
        .header("Access-Control-Allow-Origin", "*")
        .header("Access-Control-Allow-Headers", "Content-Type")
        .header("Access-Control-Allow-Methods", "POST, OPTIONS") //CAN BE ENHANCED WITH OTHER HTTP CALL METHODS 
        .build();
    }
}

সুতরাং আমি অনুমান করি .NET এ আপনাকে এন্টারনেটেড একটি অতিরিক্ত পদ্ধতি যুক্ত করতে হবে

[WebInvoke(
        Method = "OPTIONS",
        UriTemplate = "Hello",
        ResponseFormat = WebMessageFormat.)]

যেখানে নিম্নলিখিত শিরোনাম সেট করা আছে

.header("Access-Control-Allow-Origin", "*")
        .header("Access-Control-Allow-Headers", "Content-Type")
        .header("Access-Control-Allow-Methods", "POST, OPTIONS")

0

জেকারি এজাক্সের মাধ্যমে পোস্ট অনুরোধের মাধ্যমে জেএসএন ডেটা প্রেরণের সমাধান পেয়েছি। আমি কোড নীচে ব্যবহার

    var data = new Object();
    data.p_clientId = 4;
    data =  JSON.stringify(data);

    $.ajax({
      method: "POST",
      url: "http://192.168.1.141:8090/api/Client_Add",
      data: data,
      headers: {
        'Accept': 'application/json',
        'Content-Type': 'text/plain'
    }
    })
      .done(function( msg ) {
        alert( "Data Saved: " + msg );
      });


        });
    });

আমি 'Content-Type': 'text/plain'হেডার ব্যবহার করে কাঁচা জসন ডেটা প্রেরণ করেছি।
কারণ আমরা যদি Content-Type: 'application/json'অপশনটিতে রূপান্তরিত অনুরোধের পদ্ধতিগুলি ব্যবহার করি Content-Type: 'test/plain'তবে পদ্ধতিটি ব্যবহার করা রূপান্তরিত হয় না এবং পোষ্ট হিসাবে থেকে যায়। আশা করি এটি কোনও একটিকে সাহায্য করবে।


3
এটি সত্যই অপশনে রূপান্তর করছে না, এটি পোষ্টের অনুমতি রয়েছে কিনা তা খতিয়ে দেখার জন্য এটি একটি সিওআরএস প্রিললাইট অনুরোধ পাঠাচ্ছে। যখন এটি ঠিক ফিরে আসে না, পোষ্টটি ঘটে না।
Umopepisdn

0

হাই এই দুটি লাইন আমার জন্য কাজ করে।

কনটেন্ট টাইপ: "অ্যাপ্লিকেশন / জসন; চরসেট = ইউটিএফ -8", ডেটা টাইপ: "জেসন"

 $.ajax({
            type: "POST",
            url: "/v1/candidates",
            data: obj,
            **contentType:"application/json; charset=utf-8",
            dataType:"json",**
            success: function (data) {
                table.row.add([
                    data.name, data.title
                ]).draw(false);
            }

ধন্যবাদ, প্রশান্ত

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.