95

iOS アプリで Alamofire を使用して、HTTP 本文に単純な文字列を含む POST 要求を送信するにはどうすればよいですか?

デフォルトとして、Alamofire にはリクエストのパラメーターが必要です。

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

これらのパラメーターには、キーと値のペアが含まれています。しかし、HTTP 本文にキーと値の文字列を含むリクエストを送信したくありません。

私は次のようなことを意味します:

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

12 に答える 12

8

Alamofireのマネージャーを拡張するために@Silmarilの回答を修正しました。このソリューションでは、EVReflection を使用してオブジェクトを直接シリアル化します。

//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)
于 2016-04-05T13:14:10.513 に答える
5

文字列からの配列に対してそれを行いました。このソリューションは、ボディ内のストリング用に調整されています。

Alamofire 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: [:])
于 2017-02-28T16:03:40.670 に答える
-3

Xcode 8.X、スウィフト 3.X

使いやすい;

 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)

            }
于 2016-12-15T13:40:03.890 に答える