অ্যালামোফায়ারের সাথে শরীরে সাধারণ স্ট্রিং সহ পোষ্টের অনুরোধ করুন


84

আমার আইওএস অ্যাপ্লিকেশনে অ্যালোমোফায়ারের সাথে এইচটিটিপি বডিটিতে একটি সাধারণ স্ট্রিং সহ একটি পোষ্ট অনুরোধ পাঠানো কীভাবে সম্ভব?

ডিফল্ট হিসাবে অ্যালামোফায়ারের একটি অনুরোধের জন্য প্যারামিটারগুলির প্রয়োজন:

Alamofire.request(.POST, "http://mywebsite.com/post-request", parameters: ["foo": "bar"])

এই পরামিতিগুলিতে কী-মান-জুটি রয়েছে। তবে আমি এইচটিটিপি বডি-তে কোনও মূল-মানের স্ট্রিং সহ একটি অনুরোধ পাঠাতে চাই না।

আমি এরকম কিছু বোঝাতে চাইছি:

Alamofire.request(.POST, "http://mywebsite.com/post-request", body: "myBodyString")

উত্তর:


88

আপনার উদাহরণটিতে Alamofire.request(.POST, "http://mywebsite.com/post-request", parameters: ["foo": "bar"])ইতিমধ্যে তার শরীর হিসাবে "foo = বার" স্ট্রিং রয়েছে। আপনি যদি সত্যিই কাস্টম ফর্ম্যাট সঙ্গে স্ট্রিং চান। তুমি এটি করতে পারো:

Alamofire.request(.POST, "http://mywebsite.com/post-request", parameters: [:], encoding: .Custom({
            (convertible, params) in
            var mutableRequest = convertible.URLRequest.copy() as NSMutableURLRequest
            mutableRequest.HTTPBody = "myBodyString".dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)
            return (mutableRequest, nil)
        }))

দ্রষ্টব্য: parametersহওয়া উচিত নয়nil

আপডেট (অ্যালামোফায়ার 4.0, সুইফট 3.0):

আলমোফায়ারে ৪.০ এপিআই পরিবর্তন হয়েছে। সুতরাং কাস্টম এনকোডিংয়ের জন্য আমাদের মান / অবজেক্টের প্রয়োজন যা ParameterEncodingপ্রোটোকলের সাথে সঙ্গতিপূর্ণ।

extension String: ParameterEncoding {

    public func encode(_ urlRequest: URLRequestConvertible, with parameters: Parameters?) throws -> URLRequest {
        var request = try urlRequest.asURLRequest()
        request.httpBody = data(using: .utf8, allowLossyConversion: false)
        return request
    }

}

Alamofire.request("http://mywebsite.com/post-request", method: .post, parameters: [:], encoding: "myBody", headers: [:])

এটি নিখুঁতভাবে কাজ করে, কেবল সাধারণের জন্য নয় সমস্ত প্রকারের JSON প্রকারের ম্যাপযুক্ত স্ট্রিং।
সাহিল কাপুর

আমার দিন বাঁচিয়েছে :) ধন্যবাদ (y)
ইশহহ

4
@ সিলমারিল আমার পরিস্থিতিতে আমি ব্যাকএন্ড থেকে কাঁচা অনুরোধ পেতে পারি কেবল যদি আমি পুট পদ্ধতি ব্যবহার করি তবে আপনি আমাকে দয়া করে সহায়তা করতে পারেন কেন পোস্টের অনুরোধ কিছুই দেখতে পাচ্ছে না
এজে

4
। কাস্টমটি আর অ্যালামোফায়ার 4 সুইফ্ট 3-তে আর উপলভ্য নয় এবং আমি বিকল্প, কোনও ইঙ্গিত খুঁজে পাচ্ছি না?
রাহেল সাদিক

@Silmaril আমিও প্রশ্ন পোস্ট, উত্তর দিতে দয়া করে যাতে আমি এটা বন্ধ করে দিতে পারেন: stackoverflow.com/questions/39573514/...
Raheel সাদিক

64

তুমি এটি করতে পারো:

  1. আমি একটি পৃথক অনুরোধ অ্যালামোফায়ার অবজেক্ট তৈরি করেছি।
  2. স্ট্রিংটিকে ডেটাতে রূপান্তর করুন
  3. এইচটিবিডি ডেটা রাখুন

    var request = URLRequest(url: URL(string: url)!)
    request.httpMethod = HTTPMethod.post.rawValue
    request.setValue("application/json", forHTTPHeaderField: "Content-Type")
    
    let pjson = attendences.toJSONString(prettyPrint: false)
    let data = (pjson?.data(using: .utf8))! as Data
    
    request.httpBody = data
    
    Alamofire.request(request).responseJSON { (response) in
    
    
        print(response)
    
    }
    

4
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। এটি সহজ, যা প্রয়োজন ঠিক তা করে এবং অপ্রয়োজনীয় এক্সটেনশন বা রূপান্তর ছাড়াই করে। ধন্যবাদ মানুষ.
তিব্বতের সমুদ্র উপকূল

4
PS আমি অন্য প্রশ্নের জন্য আপনার উত্তর "ধার" পেয়েছি - stackoverflow.com/a/42411188/362305
তিব্বতের সমুদ্র উপকূল

4
উপস্থিতি কি, আপনি একটি সম্পূর্ণ স্নিপেট পোস্ট করতে পারেন
SyraKozZ

@ সাইরাকোজেড উপস্থিতি কী তা বিবেচনাধীন নয়, কেবল পিজেসন হ'ল একটি জসন স্ট্রিং important আপনি সেখানে কোনও জেসন স্ট্রিং রাখতে পারেন।
আফরোদেভ

13

আপনি যদি অ্যালামোফায়ার ব্যবহার করেন তবে "URLEncoding.httpBody" তে টাইপ এনকোডিংয়ের পক্ষে যথেষ্ট

এটির সাহায্যে, আপনি আপনার কোডটি json সংজ্ঞায়িত করেও আপনার পোস্টটি httpbody তে স্ট্রিং হিসাবে প্রেরণ করতে পারেন।

এটা আমার জন্য কাজ করেছে ..

জন্য আপডেট

  var url = "http://..."
    let _headers : HTTPHeaders = ["Content-Type":"application/x-www-form-urlencoded"]
    let params : Parameters = ["grant_type":"password","username":"mail","password":"pass"]

    let url =  NSURL(string:"url" as String)

    request(url, method: .post, parameters: params, encoding: URLEncoding.httpBody , headers: _headers).responseJSON(completionHandler: {
        response in response

        let jsonResponse = response.result.value as! NSDictionary

        if jsonResponse["access_token"] != nil
        {
            access_token = String(describing: jsonResponse["accesstoken"]!)

        }

    })

4
আমি আমার উত্তর আপডেট করব এবং কোডটি একটি ব্যবহৃত ব্যবহৃত লিখব, কারণ আমি এখান থেকে একটি মন্তব্য হিসাবে কোড কীভাবে লিখতে পারি তা জানতে পারি না .. দেরী করার জন্য দুঃখিত। @ বদর
ফিলালী

ধন্যবাদ যে দুর্দান্ত
বদর ফিলালী 13

4
আমার জন্য পরিশ্রমী, তবে আমার দেহটি জেএসওএন হওয়া উচিত, সুতরাং, আমি এনকোডিংটি পরিবর্তন করেছি: ইউআরএলএনকোডিং। HTTPBododing: JSONEncoding.default এবং সবকিছু ভালভাবে কাজ করেছে।
অ্যাঞ্জেলো পোলোটো

হ্যাঁ @ অ্যাঞ্জেলোপলোটটো সঙ্কোচনার জন্য ধন্যবাদ :) এটি পরিষেবার এনকোডিংয়ের প্রকার। আপনার বাকী এপিআইকে ইউআরএলএনকোডিং বা জেএসএনএন কোডিং হিসাবে নির্ভর করে ব্যবহার করা যেতে পারে।
সেমাল বায়আরআই

উত্তরের জন্য ধন্যবাদ. কিন্তু সমস্যা আমি সম্মুখীন হচ্ছি যখন আমি একটি পরিবর্তনশীল পরিবর্তে পাঠাতে হবে double quotes stringsএবং ত্রুটি কোড পাওয়ার 400। কীভাবে সমাধান করব?
ভাইপার

8

আমি অ্যালামোফায়ারের পরিচালককে বাড়ানোর জন্য @ সিলমারিলের উত্তরটি পরিবর্তন করেছি। এই সমাধানটি সরাসরি কোনও অবজেক্টকে সিরিয়ালাইজ করতে ইভিআরফ্লেশন ব্যবহার করে:

//Extend Alamofire so it can do POSTs with a JSON body from passed object
extension Alamofire.Manager {
    public class func request(
        method: Alamofire.Method,
        _ URLString: URLStringConvertible,
          bodyObject: EVObject)
        -> Request
    {
        return Manager.sharedInstance.request(
            method,
            URLString,
            parameters: [:],
            encoding: .Custom({ (convertible, params) in
                let mutableRequest = convertible.URLRequest.copy() as! NSMutableURLRequest
                mutableRequest.HTTPBody = bodyObject.toJsonString().dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)
                return (mutableRequest, nil)
            })
        )
    }
}

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

Alamofire.Manager.request(.POST, endpointUrlString, bodyObject: myObjectToPost)

5

আপনি যদি অনুরোধে কাঁচা বডি হিসাবে স্ট্রিং পোস্ট করতে চান

return Alamofire.request(.POST, "http://mywebsite.com/post-request" , parameters: [:], encoding: .Custom({
            (convertible, params) in
            let mutableRequest = convertible.URLRequest.copy() as! NSMutableURLRequest

            let data = ("myBodyString" as NSString).dataUsingEncoding(NSUTF8StringEncoding)
            mutableRequest.HTTPBody = data
            return (mutableRequest, nil)
        }))

হাই JITHINRAJ আমি এখানে একটি প্রশ্ন পোস্ট stackoverflow.com/questions/40385992/... আমি XML শরীর পাঠাতে চান
মাইক vorisis

5

আমি স্ট্রিং থেকে অ্যারের জন্য এটি করেছি। এই সমাধানটি শরীরে স্ট্রিংয়ের জন্য সামঞ্জস্য করা হয়।

অ্যালামোফায়ার 4 এর "নেটিভ" উপায়:

struct JSONStringArrayEncoding: ParameterEncoding {
    private let myString: String

    init(string: String) {
        self.myString = string
    }

    func encode(_ urlRequest: URLRequestConvertible, with parameters: Parameters?) throws -> URLRequest {
        var urlRequest = urlRequest.urlRequest

        let data = myString.data(using: .utf8)!

        if urlRequest?.value(forHTTPHeaderField: "Content-Type") == nil {
            urlRequest?.setValue("application/json", forHTTPHeaderField: "Content-Type")
        }

        urlRequest?.httpBody = data

        return urlRequest!
    }
}

এবং তারপরে আপনার অনুরোধটি দিয়ে:

Alamofire.request("your url string", method: .post, parameters: [:], encoding: JSONStringArrayEncoding.init(string: "My string for body"), headers: [:])

4

আমি @ আফ্রদেভের উত্তরটি রেফারেন্স হিসাবে ব্যবহার করেছি। আমার ক্ষেত্রে আমি স্ট্রিং হিসাবে আমার ফাংশনে প্যারামিটার নিয়ে থাকি যা অনুরোধে পোস্ট করতে হয়। সুতরাং, এখানে কোড:

func defineOriginalLanguage(ofText: String) {
    let text =  ofText
    let stringURL = basicURL + "identify?version=2018-05-01"
    let url = URL(string: stringURL)

    var request = URLRequest(url: url!)
    request.httpMethod = HTTPMethod.post.rawValue
    request.setValue("text/plain", forHTTPHeaderField: "Content-Type")
    request.httpBody = text.data(using: .utf8)

    Alamofire.request(request)
        .responseJSON { response in
            print(response)
    }
}

আপনি ঠিক কি পাবেন না?
জিওএসডি

3

ইলিয়া ক্রিটের উত্তরের ভিত্তিতে

বিশদ

  • এক্সকোড সংস্করণ 10.2.1 (10E1001)
  • সুইফট 5
  • অ্যালামোফায়ার 4.8.2

সমাধান

import Alamofire

struct BodyStringEncoding: ParameterEncoding {

    private let body: String

    init(body: String) { self.body = body }

    func encode(_ urlRequest: URLRequestConvertible, with parameters: Parameters?) throws -> URLRequest {
        guard var urlRequest = urlRequest.urlRequest else { throw Errors.emptyURLRequest }
        guard let data = body.data(using: .utf8) else { throw Errors.encodingProblem }
        urlRequest.httpBody = data
        return urlRequest
    }
}

extension BodyStringEncoding {
    enum Errors: Error {
        case emptyURLRequest
        case encodingProblem
    }
}

extension BodyStringEncoding.Errors: LocalizedError {
    var errorDescription: String? {
        switch self {
            case .emptyURLRequest: return "Empty url request"
            case .encodingProblem: return "Encoding problem"
        }
    }
}

ব্যবহার

Alamofire.request(url, method: .post, parameters: nil, encoding: BodyStringEncoding(body: text), headers: headers).responseJSON { response in
     print(response)
}

Большое вам большое!
20 Хасбулатов

2
func paramsFromJSON(json: String) -> [String : AnyObject]?
{
    let objectData: NSData = (json.dataUsingEncoding(NSUTF8StringEncoding))!
    var jsonDict: [ String : AnyObject]!
    do {
        jsonDict = try NSJSONSerialization.JSONObjectWithData(objectData, options: .MutableContainers) as! [ String : AnyObject]
        return jsonDict
    } catch {
        print("JSON serialization failed:  \(error)")
        return nil
    }
}

let json = Mapper().toJSONString(loginJSON, prettyPrint: false)

Alamofire.request(.POST, url + "/login", parameters: paramsFromJSON(json!), encoding: .JSON)

মাপার কী?
আহমাদরেজা

2

আমার ক্ষেত্রে, কন্টেন্ট-টাইপ সহ অ্যালোমফায়ার পোস্ট করা: "সামগ্রী-প্রকার": "অ্যাপ্লিকেশন / x-www-form-urlencoded", আমাকে অ্যাল্যাম্পফায়ার পোস্টের অনুরোধের এনকোডিং পরিবর্তন করতে হয়েছিল

থেকে: JSONENCODING.DEFAULT to: URLEncoding.httpBody

এখানে:

let url = ServicesURls.register_token()
    let body = [
        "UserName": "Minus28",
        "grant_type": "password",
        "Password": "1a29fcd1-2adb-4eaa-9abf-b86607f87085",
         "DeviceNumber": "e9c156d2ab5421e5",
          "AppNotificationKey": "test-test-test",
        "RegistrationEmail": email,
        "RegistrationPassword": password,
        "RegistrationType": 2
        ] as [String : Any]


    Alamofire.request(url, method: .post, parameters: body, encoding: URLEncoding.httpBody , headers: setUpHeaders()).log().responseJSON { (response) in

0
let parameters = ["foo": "bar"]
              
    // All three of these calls are equivalent
    AF.request("https://httpbin.org/post", method: .post, parameters: parameters)
    AF.request("https://httpbin.org/post", method: .post, parameters: parameters, encoder: URLEncodedFormParameterEncoder.default)
    AF.request("https://httpbin.org/post", method: .post, parameters: parameters, encoder: URLEncodedFormParameterEncoder(destination: .httpBody))
    
    

-3

এক্সকোড 8. এক্স, সুইফট 3. এক্স

সহজ ব্যবহার;

 let params:NSMutableDictionary? = ["foo": "bar"];
            let ulr =  NSURL(string:"http://mywebsite.com/post-request" as String)
            let request = NSMutableURLRequest(url: ulr! as URL)
            request.httpMethod = "POST"
            request.setValue("application/json", forHTTPHeaderField: "Content-Type")
            let data = try! JSONSerialization.data(withJSONObject: params!, options: JSONSerialization.WritingOptions.prettyPrinted)

            let json = NSString(data: data, encoding: String.Encoding.utf8.rawValue)
            if let json = json {
                print(json)
            }
            request.httpBody = json!.data(using: String.Encoding.utf8.rawValue);


            Alamofire.request(request as! URLRequestConvertible)
                .responseJSON { response in
                    // do whatever you want here
                   print(response.request)  
                   print(response.response) 
                   print(response.data) 
                   print(response.result)

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